Use more UnownedPtr<> in CFXJSE.
Change-Id: I5e12f009f7449d50a1e62d7a391a94bfd072f195
Reviewed-on: https://pdfium-review.googlesource.com/c/47811
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/fxjs/xfa/cfxjse_engine.cpp b/fxjs/xfa/cfxjse_engine.cpp
index 1569514..d2c3421 100644
--- a/fxjs/xfa/cfxjse_engine.cpp
+++ b/fxjs/xfa/cfxjse_engine.cpp
@@ -634,7 +634,7 @@
}
break;
}
- std::vector<CXFA_Object*> retObjects;
+ std::vector<UnownedPtr<CXFA_Object>> retObjects;
while (i < nNodes) {
bool bDataBind = false;
if (((dwStyles & XFA_RESOLVENODE_Bind) ||
@@ -676,7 +676,7 @@
if (dwStyles & XFA_RESOLVENODE_CreateNode) {
bNextCreate = true;
if (!pNodeHelper->m_pCreateParent) {
- pNodeHelper->m_pCreateParent = ToNode(rndFind.m_CurObject);
+ pNodeHelper->m_pCreateParent = ToNode(rndFind.m_CurObject.Get());
pNodeHelper->m_iCreateCount = 1;
}
int32_t checked_length =
@@ -689,8 +689,7 @@
break;
}
- findObjects = std::vector<UnownedPtr<CXFA_Object>>(retObjects.begin(),
- retObjects.end());
+ findObjects = std::move(retObjects);
rndFind.m_Objects.clear();
if (nLevel == 0)
dwStyles &= ~(XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings);
diff --git a/fxjs/xfa/cfxjse_resolveprocessor.cpp b/fxjs/xfa/cfxjse_resolveprocessor.cpp
index c2a21a6..64a3fbd 100644
--- a/fxjs/xfa/cfxjse_resolveprocessor.cpp
+++ b/fxjs/xfa/cfxjse_resolveprocessor.cpp
@@ -36,7 +36,7 @@
if (!rnd.m_CurObject->IsNode()) {
if (rnd.m_dwStyles & XFA_RESOLVENODE_Attributes) {
- return ResolveForAttributeRs(rnd.m_CurObject, rnd,
+ return ResolveForAttributeRs(rnd.m_CurObject.Get(), rnd,
rnd.m_wsName.AsStringView());
}
return false;
@@ -63,18 +63,18 @@
}
}
if (rnd.m_uHashName == XFA_HASHCODE_This && rnd.m_nLevel == 0) {
- rnd.m_Objects.push_back(rnd.m_pSC->GetThisObject());
+ rnd.m_Objects.emplace_back(rnd.m_pSC->GetThisObject());
return true;
}
if (rnd.m_CurObject->GetElementType() == XFA_Element::Xfa) {
CXFA_Object* pObjNode =
rnd.m_pSC->GetDocument()->GetXFAObject(rnd.m_uHashName);
if (pObjNode) {
- rnd.m_Objects.push_back(pObjNode);
+ rnd.m_Objects.emplace_back(pObjNode);
} else if (rnd.m_uHashName == XFA_HASHCODE_Xfa) {
rnd.m_Objects.push_back(rnd.m_CurObject);
} else if ((rnd.m_dwStyles & XFA_RESOLVENODE_Attributes) &&
- ResolveForAttributeRs(rnd.m_CurObject, rnd,
+ ResolveForAttributeRs(rnd.m_CurObject.Get(), rnd,
rnd.m_wsName.AsStringView())) {
return true;
}
@@ -84,7 +84,7 @@
return !rnd.m_Objects.empty();
}
if (!ResolveNormal(rnd) && rnd.m_uHashName == XFA_HASHCODE_Xfa)
- rnd.m_Objects.push_back(rnd.m_pSC->GetDocument()->GetRoot());
+ rnd.m_Objects.emplace_back(rnd.m_pSC->GetDocument()->GetRoot());
return !rnd.m_Objects.empty();
}
@@ -97,24 +97,26 @@
if (wsName.GetLength() && wsName[0] == '#') {
bClassName = true;
findNode = m_pNodeHelper->GetOneChildOfClass(
- ToNode(rnd.m_CurObject), wsName.Right(wsName.GetLength() - 1));
+ ToNode(rnd.m_CurObject.Get()), wsName.Right(wsName.GetLength() - 1));
} else {
- findNode = m_pNodeHelper->GetOneChildNamed(ToNode(rnd.m_CurObject), wsName);
+ findNode =
+ m_pNodeHelper->GetOneChildNamed(ToNode(rnd.m_CurObject.Get()), wsName);
}
if (!findNode)
return false;
if (wsCondition.IsEmpty()) {
- rnd.m_Objects.push_back(findNode);
+ rnd.m_Objects.emplace_back(findNode);
return true;
}
std::vector<CXFA_Node*> tempNodes;
- for (auto* pObject : rnd.m_Objects)
+ for (const auto& pObject : rnd.m_Objects)
tempNodes.push_back(pObject->AsNode());
m_pNodeHelper->CountSiblings(findNode, XFA_LOGIC_Transparent, &tempNodes,
bClassName);
- rnd.m_Objects = std::vector<CXFA_Object*>(tempNodes.begin(), tempNodes.end());
+ rnd.m_Objects =
+ std::vector<UnownedPtr<CXFA_Object>>(tempNodes.begin(), tempNodes.end());
FilterCondition(rnd, wsCondition);
return !rnd.m_Objects.empty();
}
@@ -133,11 +135,11 @@
XFA_HashCode dwNameHash = static_cast<XFA_HashCode>(FX_HashCode_GetW(
WideStringView(wsName.c_str() + 1, iNameLen - 1), false));
if (dwNameHash == XFA_HASHCODE_Xfa) {
- rnd.m_Objects.push_back(rnd.m_pSC->GetDocument()->GetRoot());
+ rnd.m_Objects.emplace_back(rnd.m_pSC->GetDocument()->GetRoot());
} else {
CXFA_Object* pObjNode = rnd.m_pSC->GetDocument()->GetXFAObject(dwNameHash);
if (pObjNode)
- rnd.m_Objects.push_back(pObjNode);
+ rnd.m_Objects.emplace_back(pObjNode);
}
if (!rnd.m_Objects.empty())
FilterCondition(rnd, wsCondition);
@@ -154,7 +156,7 @@
if (!datasets)
return false;
- CFXJSE_ResolveNodeData rndFind(rnd.m_pSC);
+ CFXJSE_ResolveNodeData rndFind(rnd.m_pSC.Get());
rndFind.m_CurObject = datasets;
rndFind.m_wsName = rnd.m_wsName.Right(rnd.m_wsName.GetLength() - 1);
rndFind.m_uHashName = static_cast<XFA_HashCode>(
@@ -172,11 +174,11 @@
bool CFXJSE_ResolveProcessor::ResolveNumberSign(CFXJSE_ResolveNodeData& rnd) {
WideString wsName = rnd.m_wsName.Right(rnd.m_wsName.GetLength() - 1);
WideString wsCondition = rnd.m_wsCondition;
- CXFA_Node* curNode = ToNode(rnd.m_CurObject);
+ CXFA_Node* curNode = ToNode(rnd.m_CurObject.Get());
if (ResolveForAttributeRs(curNode, rnd, wsName.AsStringView()))
return true;
- CFXJSE_ResolveNodeData rndFind(rnd.m_pSC);
+ CFXJSE_ResolveNodeData rndFind(rnd.m_pSC.Get());
rndFind.m_nLevel = rnd.m_nLevel + 1;
rndFind.m_dwStyles = rnd.m_dwStyles;
rndFind.m_dwStyles |= XFA_RESOLVENODE_TagName;
@@ -192,7 +194,7 @@
if (wsCondition.GetLength() == 0 &&
pdfium::ContainsValue(rndFind.m_Objects, curNode)) {
- rnd.m_Objects.push_back(curNode);
+ rnd.m_Objects.emplace_back(curNode);
} else {
rnd.m_Objects.insert(rnd.m_Objects.end(), rndFind.m_Objects.begin(),
rndFind.m_Objects.end());
@@ -209,7 +211,7 @@
return false;
rnd.m_ScriptAttribute = info.value();
- rnd.m_Objects.push_back(curNode);
+ rnd.m_Objects.emplace_back(curNode);
rnd.m_dwFlag = XFA_ResolveNode_RSType_Attribute;
return true;
}
@@ -225,7 +227,7 @@
XFA_HashCode uNameHash = rnd.m_uHashName;
WideString& wsCondition = rnd.m_wsCondition;
- CFXJSE_ResolveNodeData rndFind(rnd.m_pSC);
+ CFXJSE_ResolveNodeData rndFind(rnd.m_pSC.Get());
rndFind.m_wsName = rnd.m_wsName;
rndFind.m_wsCondition = rnd.m_wsCondition;
rndFind.m_nLevel = rnd.m_nLevel + 1;
@@ -252,7 +254,7 @@
}
if ((dwStyles & XFA_RESOLVENODE_Properties) && pVariablesNode) {
if (pVariablesNode->GetClassHashCode() == uNameHash) {
- rnd.m_Objects.push_back(pVariablesNode);
+ rnd.m_Objects.emplace_back(pVariablesNode);
} else {
rndFind.m_CurObject = pVariablesNode;
SetStylesForChild(dwStyles, rndFind);
@@ -277,9 +279,9 @@
for (CXFA_Node* child : children) {
if (dwStyles & XFA_RESOLVENODE_TagName) {
if (child->GetClassHashCode() == uNameHash)
- rnd.m_Objects.push_back(child);
+ rnd.m_Objects.emplace_back(child);
} else if (child->GetNameHash() == uNameHash) {
- rnd.m_Objects.push_back(child);
+ rnd.m_Objects.emplace_back(child);
}
if (m_pNodeHelper->NodeIsTransparent(child) &&
@@ -302,14 +304,14 @@
if (!(dwStyles & XFA_RESOLVENODE_ALL)) {
std::vector<CXFA_Node*> upArrayNodes;
if (m_pNodeHelper->NodeIsTransparent(ToNode(curNode))) {
- m_pNodeHelper->CountSiblings(ToNode(rnd.m_Objects[0]),
+ m_pNodeHelper->CountSiblings(ToNode(rnd.m_Objects.front().Get()),
XFA_LOGIC_Transparent, &upArrayNodes,
!!(dwStyles & XFA_RESOLVENODE_TagName));
}
if (upArrayNodes.size() > rnd.m_Objects.size()) {
- CXFA_Object* pSaveObject = rnd.m_Objects.front();
- rnd.m_Objects = std::vector<CXFA_Object*>(upArrayNodes.begin(),
- upArrayNodes.end());
+ CXFA_Object* pSaveObject = rnd.m_Objects.front().Get();
+ rnd.m_Objects = std::vector<UnownedPtr<CXFA_Object>>(
+ upArrayNodes.begin(), upArrayNodes.end());
rnd.m_Objects.front() = pSaveObject;
}
}
@@ -325,13 +327,13 @@
for (CXFA_Node* pChildProperty : properties) {
if (pChildProperty->IsUnnamed()) {
if (pChildProperty->GetClassHashCode() == uNameHash)
- rnd.m_Objects.push_back(pChildProperty);
+ rnd.m_Objects.emplace_back(pChildProperty);
continue;
}
if (pChildProperty->GetNameHash() == uNameHash &&
pChildProperty->GetElementType() != XFA_Element::Extras &&
pChildProperty->GetElementType() != XFA_Element::Items) {
- rnd.m_Objects.push_back(pChildProperty);
+ rnd.m_Objects.emplace_back(pChildProperty);
}
}
if (rnd.m_Objects.size() > nNum) {
@@ -358,7 +360,7 @@
}
}
if (pProp) {
- rnd.m_Objects.push_back(pProp);
+ rnd.m_Objects.emplace_back(pProp);
return !rnd.m_Objects.empty();
}
}
@@ -368,7 +370,7 @@
uint32_t uCurClassHash = curNode->GetClassHashCode();
if (!parentNode) {
if (uCurClassHash == uNameHash) {
- rnd.m_Objects.push_back(curNode->AsNode());
+ rnd.m_Objects.emplace_back(curNode->AsNode());
FilterCondition(rnd, wsCondition);
if (!rnd.m_Objects.empty())
return true;
@@ -390,13 +392,13 @@
if (child == curNode) {
if (dwStyles & XFA_RESOLVENODE_TagName) {
if (uCurClassHash == uNameHash)
- rnd.m_Objects.push_back(curNode);
+ rnd.m_Objects.emplace_back(curNode);
} else {
if (child->GetNameHash() == uNameHash) {
- rnd.m_Objects.push_back(curNode);
+ rnd.m_Objects.emplace_back(curNode);
if (rnd.m_nLevel == 0 && wsCondition.GetLength() == 0) {
rnd.m_Objects.clear();
- rnd.m_Objects.push_back(curNode);
+ rnd.m_Objects.emplace_back(curNode);
return true;
}
}
@@ -407,9 +409,9 @@
if (dwStyles & XFA_RESOLVENODE_TagName) {
if (child->GetClassHashCode() == uNameHash)
- rnd.m_Objects.push_back(child);
+ rnd.m_Objects.emplace_back(child);
} else if (child->GetNameHash() == uNameHash) {
- rnd.m_Objects.push_back(child);
+ rnd.m_Objects.emplace_back(child);
}
bool bInnerSearch = false;
@@ -438,13 +440,13 @@
if (rnd.m_Objects.size() > nNum) {
if (m_pNodeHelper->NodeIsTransparent(parentNode)) {
std::vector<CXFA_Node*> upArrayNodes;
- m_pNodeHelper->CountSiblings(ToNode(rnd.m_Objects.front()),
+ m_pNodeHelper->CountSiblings(ToNode(rnd.m_Objects.front().Get()),
XFA_LOGIC_Transparent, &upArrayNodes,
!!(dwStyles & XFA_RESOLVENODE_TagName));
if (upArrayNodes.size() > rnd.m_Objects.size()) {
- CXFA_Object* pSaveObject = rnd.m_Objects.front();
- rnd.m_Objects = std::vector<CXFA_Object*>(upArrayNodes.begin(),
- upArrayNodes.end());
+ CXFA_Object* pSaveObject = rnd.m_Objects.front().Get();
+ rnd.m_Objects = std::vector<UnownedPtr<CXFA_Object>>(
+ upArrayNodes.begin(), upArrayNodes.end());
rnd.m_Objects.front() = pSaveObject;
}
}
@@ -475,7 +477,7 @@
}
bool CFXJSE_ResolveProcessor::ResolveAsterisk(CFXJSE_ResolveNodeData& rnd) {
- CXFA_Node* curNode = ToNode(rnd.m_CurObject);
+ CXFA_Node* curNode = ToNode(rnd.m_CurObject.Get());
std::vector<CXFA_Node*> array =
curNode->GetNodeList(XFA_NODEFILTER_Children | XFA_NODEFILTER_Properties,
XFA_Element::Unknown);
@@ -585,14 +587,14 @@
if (bAll) {
if (rnd.m_dwStyles & XFA_RESOLVENODE_CreateNode) {
if (rnd.m_dwStyles & XFA_RESOLVENODE_Bind) {
- m_pNodeHelper->m_pCreateParent = ToNode(rnd.m_CurObject);
+ m_pNodeHelper->m_pCreateParent = ToNode(rnd.m_CurObject.Get());
m_pNodeHelper->m_iCreateCount = 1;
rnd.m_Objects.clear();
m_pNodeHelper->m_iCurAllStart = -1;
m_pNodeHelper->m_pAllStartParent = nullptr;
} else if (m_pNodeHelper->m_iCurAllStart == -1) {
m_pNodeHelper->m_iCurAllStart = m_iCurStart;
- m_pNodeHelper->m_pAllStartParent = ToNode(rnd.m_CurObject);
+ m_pNodeHelper->m_pAllStartParent = ToNode(rnd.m_CurObject.Get());
}
} else if (rnd.m_dwStyles & XFA_RESOLVENODE_BindNew) {
if (m_pNodeHelper->m_iCurAllStart == -1)
@@ -609,14 +611,13 @@
if (iFoundCount <= iIndex || iIndex < 0) {
if (rnd.m_dwStyles & XFA_RESOLVENODE_CreateNode) {
- m_pNodeHelper->m_pCreateParent = ToNode(rnd.m_CurObject);
+ m_pNodeHelper->m_pCreateParent = ToNode(rnd.m_CurObject.Get());
m_pNodeHelper->m_iCreateCount = iIndex - iFoundCount + 1;
}
rnd.m_Objects.clear();
} else {
- CXFA_Object* ret = rnd.m_Objects[iIndex];
- rnd.m_Objects.clear();
- rnd.m_Objects.push_back(ret);
+ rnd.m_Objects =
+ std::vector<UnownedPtr<CXFA_Object>>(1, rnd.m_Objects[iIndex]);
}
}
@@ -634,12 +635,11 @@
else
return;
- CFXJSE_Engine* pContext = rnd.m_pSC;
wsExpression = wsCondition.Mid(2, wsCondition.GetLength() - 3);
for (int32_t i = iFoundCount - 1; i >= 0; i--) {
auto pRetValue = pdfium::MakeUnique<CFXJSE_Value>(rnd.m_pSC->GetIsolate());
- bool bRet = pContext->RunScript(eLangType, wsExpression.AsStringView(),
- pRetValue.get(), rnd.m_Objects[i]);
+ bool bRet = rnd.m_pSC->RunScript(eLangType, wsExpression.AsStringView(),
+ pRetValue.get(), rnd.m_Objects[i].Get());
if (!bRet || !pRetValue->ToBoolean())
rnd.m_Objects.erase(rnd.m_Objects.begin() + i);
}
@@ -674,16 +674,15 @@
if (iFoundCount <= iCurrIndex) {
if (rnd.m_dwStyles & XFA_RESOLVENODE_CreateNode) {
- m_pNodeHelper->m_pCreateParent = ToNode(rnd.m_CurObject);
+ m_pNodeHelper->m_pCreateParent = ToNode(rnd.m_CurObject.Get());
m_pNodeHelper->m_iCreateCount = iCurrIndex - iFoundCount + 1;
}
rnd.m_Objects.clear();
return;
}
- CXFA_Object* ret = rnd.m_Objects[iCurrIndex];
- rnd.m_Objects.clear();
- rnd.m_Objects.push_back(ret);
+ rnd.m_Objects =
+ std::vector<UnownedPtr<CXFA_Object>>(1, rnd.m_Objects[iCurrIndex]);
return;
}
@@ -730,14 +729,6 @@
}
CFXJSE_ResolveNodeData::CFXJSE_ResolveNodeData(CFXJSE_Engine* pSC)
- : m_pSC(pSC),
- m_CurObject(nullptr),
- m_wsName(),
- m_uHashName(XFA_HASHCODE_None),
- m_wsCondition(),
- m_nLevel(0),
- m_Objects(),
- m_dwStyles(XFA_RESOLVENODE_Children),
- m_dwFlag(XFA_ResolveNode_RSType_Nodes) {}
+ : m_pSC(pSC) {}
CFXJSE_ResolveNodeData::~CFXJSE_ResolveNodeData() {}
diff --git a/fxjs/xfa/cfxjse_resolveprocessor.h b/fxjs/xfa/cfxjse_resolveprocessor.h
index e3c4ee0..3f2a07c 100644
--- a/fxjs/xfa/cfxjse_resolveprocessor.h
+++ b/fxjs/xfa/cfxjse_resolveprocessor.h
@@ -11,28 +11,28 @@
#include <vector>
#include "core/fxcrt/fx_string.h"
+#include "fxjs/xfa/cfxjse_engine.h"
#include "xfa/fxfa/fxfa_basic.h"
#include "xfa/fxfa/parser/xfa_basic_data.h"
#include "xfa/fxfa/parser/xfa_resolvenode_rs.h"
class CXFA_NodeHelper;
-class CFXJSE_Engine;
class CFXJSE_ResolveNodeData {
public:
explicit CFXJSE_ResolveNodeData(CFXJSE_Engine* pSC);
~CFXJSE_ResolveNodeData();
- CFXJSE_Engine* m_pSC;
- CXFA_Object* m_CurObject;
+ UnownedPtr<CFXJSE_Engine> const m_pSC;
+ UnownedPtr<CXFA_Object> m_CurObject;
WideString m_wsName;
- XFA_HashCode m_uHashName;
WideString m_wsCondition;
- int32_t m_nLevel;
- std::vector<CXFA_Object*> m_Objects; // Not owned.
- uint32_t m_dwStyles;
+ XFA_HashCode m_uHashName = XFA_HASHCODE_None;
+ int32_t m_nLevel = 0;
+ uint32_t m_dwStyles = XFA_RESOLVENODE_Children;
+ XFA_ResolveNode_RSType m_dwFlag = XFA_ResolveNode_RSType_Nodes;
+ std::vector<UnownedPtr<CXFA_Object>> m_Objects;
XFA_SCRIPTATTRIBUTEINFO m_ScriptAttribute;
- XFA_ResolveNode_RSType m_dwFlag;
};
class CFXJSE_ResolveProcessor {