| Index: xfa/src/fxfa/src/parser/xfa_document_datamerger_imp.cpp
 | 
| diff --git a/xfa/src/fxfa/src/parser/xfa_document_datamerger_imp.cpp b/xfa/src/fxfa/src/parser/xfa_document_datamerger_imp.cpp
 | 
| index 058ed483d0a7d6d3dd79e5fc2fe67faefc5e54f8..50685056f4502da8fbe30f49f8e7dff05c5bd8e4 100644
 | 
| --- a/xfa/src/fxfa/src/parser/xfa_document_datamerger_imp.cpp
 | 
| +++ b/xfa/src/fxfa/src/parser/xfa_document_datamerger_imp.cpp
 | 
| @@ -459,11 +459,11 @@ static CXFA_Node* XFA_DataMerge_FindDataRefDataNode(CXFA_Document* pDocument,
 | 
|        rs.dwFlags == XFA_RESOLVENODE_RSTYPE_CreateNodeMidAll ||
 | 
|        rs.nodes.GetSize() > 1) {
 | 
|      return pDocument->GetNotBindNode(rs.nodes);
 | 
| -  } else if (rs.dwFlags == XFA_RESOLVENODE_RSTYPE_CreateNodeOne) {
 | 
| +  }
 | 
| +  if (rs.dwFlags == XFA_RESOLVENODE_RSTYPE_CreateNodeOne) {
 | 
|      CXFA_Object* pObject = (rs.nodes.GetSize() > 0) ? rs.nodes[0] : NULL;
 | 
| -    CXFA_Node* pNode =
 | 
| -        (pObject && pObject->IsNode()) ? (CXFA_Node*)pObject : NULL;
 | 
| -    if (!bForceBind && (pNode != NULL) && pNode->HasBindItem()) {
 | 
| +    CXFA_Node* pNode = ToNode(pObject);
 | 
| +    if (!bForceBind && pNode && pNode->HasBindItem()) {
 | 
|        pNode = NULL;
 | 
|      }
 | 
|      return pNode;
 | 
| @@ -840,7 +840,8 @@ static CXFA_Node* XFA_DataMerge_CopyContainer_SubformSet(
 | 
|        subformMapArray.GetStartPosition();
 | 
|        for (int32_t iIndex = 0; iIndex < subformArray.GetSize(); iIndex++) {
 | 
|          CXFA_Node* pSubform = subformArray[iIndex];
 | 
| -        CXFA_Node* pDataNode = (CXFA_Node*)subformMapArray.GetValueAt(pSubform);
 | 
| +        CXFA_Node* pDataNode =
 | 
| +            reinterpret_cast<CXFA_Node*>(subformMapArray.GetValueAt(pSubform));
 | 
|          for (CXFA_Node* pTemplateChild =
 | 
|                   pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild);
 | 
|               pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem(
 | 
| @@ -1162,7 +1163,7 @@ static void XFA_DataMerge_UpdateBindingRelations(CXFA_Document* pDocument,
 | 
|                                                ? XFA_ELEMENT_DataGroup
 | 
|                                                : XFA_ELEMENT_DataValue;
 | 
|                CXFA_Node* pRecordNode =
 | 
| -                  (CXFA_Node*)pDocument->GetXFAObject(XFA_HASHCODE_Record);
 | 
| +                  ToNode(pDocument->GetXFAObject(XFA_HASHCODE_Record));
 | 
|                pDataNode = XFA_DataDescription_MaybeCreateDataNode(
 | 
|                    pDocument, pRecordNode, eDataNodeType,
 | 
|                    pFormNode->GetCData(XFA_ATTRIBUTE_Name));
 | 
| @@ -1192,8 +1193,7 @@ static void XFA_DataMerge_UpdateBindingRelations(CXFA_Document* pDocument,
 | 
|            pDocument->GetScriptContext()->ResolveObjects(pDataScope, wsRef, rs,
 | 
|                                                          dFlags, pTemplateNode);
 | 
|            CXFA_Object* pObject = (rs.nodes.GetSize() > 0) ? rs.nodes[0] : NULL;
 | 
| -          pDataNode =
 | 
| -              (pObject && pObject->IsNode()) ? (CXFA_Node*)pObject : NULL;
 | 
| +          pDataNode = ToNode(pObject);
 | 
|            if (pDataNode) {
 | 
|              XFA_DataMerge_CreateDataBinding(
 | 
|                  pFormNode, pDataNode,
 | 
| @@ -1279,7 +1279,7 @@ static void XFA_DataMerge_UpdateBindingRelations(CXFA_Document* pDocument, CXFA_
 | 
|                                            ? XFA_ELEMENT_DataGroup
 | 
|                                            : XFA_ELEMENT_DataValue;
 | 
|            CXFA_Node* pRecordNode =
 | 
| -              (CXFA_Node*)pDocument->GetXFAObject(XFA_HASHCODE_Record);
 | 
| +              ToNode(pDocument->GetXFAObject(XFA_HASHCODE_Record));
 | 
|            pDataNode = XFA_DataDescription_MaybeCreateDataNode(
 | 
|                pDocument, pRecordNode, eDataNodeType,
 | 
|                pFormNode->GetCData(XFA_ATTRIBUTE_Name));
 | 
| @@ -1302,7 +1302,7 @@ static void XFA_DataMerge_UpdateBindingRelations(CXFA_Document* pDocument, CXFA_
 | 
|          pDocument->GetScriptContext()->ResolveObjects(pDataScope, wsRef, rs,
 | 
|                                                        dFlags, pTemplateNode);
 | 
|          CXFA_Object* pObject = (rs.nodes.GetSize() > 0) ? rs.nodes[0] : NULL;
 | 
| -        pDataNode = (pObject && pObject->IsNode()) ? (CXFA_Node*)pObject : NULL;
 | 
| +        pDataNode = ToNode(pObject);
 | 
|          if (pDataNode) {
 | 
|            XFA_DataMerge_CreateDataBinding(pFormNode, pDataNode, FALSE);
 | 
|          }
 | 
| @@ -1337,8 +1337,8 @@ CXFA_Node* XFA_DataMerge_FindDataScope(CXFA_Node* pParentFormNode) {
 | 
|        return pDataScope;
 | 
|      }
 | 
|    }
 | 
| -  return (CXFA_Node*)pParentFormNode->GetDocument()->GetXFAObject(
 | 
| -      XFA_HASHCODE_Data);
 | 
| +  return ToNode(
 | 
| +      pParentFormNode->GetDocument()->GetXFAObject(XFA_HASHCODE_Data));
 | 
|  }
 | 
|  void CXFA_Document::DataMerge_UpdateBindingRelations(
 | 
|      CXFA_Node* pFormUpdateRoot) {
 | 
| @@ -1359,10 +1359,10 @@ void CXFA_Document::DataMerge_UpdateBindingRelations(
 | 
|    while (rgFormNodeList.GetCount()) {
 | 
|      FX_POSITION pos;
 | 
|      pos = rgFormNodeList.GetHeadPosition();
 | 
| -    CXFA_Node* pCurFormNode = (CXFA_Node*)rgFormNodeList.GetAt(pos);
 | 
| +    CXFA_Node* pCurFormNode = ToNode(rgFormNodeList.GetAt(pos));
 | 
|      rgFormNodeList.RemoveAt(pos);
 | 
|      pos = rgDataScopeList.GetHeadPosition();
 | 
| -    CXFA_Node* pCurDataScope = (CXFA_Node*)rgDataScopeList.GetAt(pos);
 | 
| +    CXFA_Node* pCurDataScope = ToNode(rgDataScopeList.GetAt(pos));
 | 
|      rgDataScopeList.RemoveAt(pos);
 | 
|      XFA_DataMerge_UpdateBindingRelations(this, pCurFormNode, pCurDataScope,
 | 
|                                           rgFormNodeList, rgDataScopeList);
 | 
| @@ -1371,19 +1371,14 @@ void CXFA_Document::DataMerge_UpdateBindingRelations(
 | 
|  }
 | 
|  CXFA_Node* CXFA_Document::GetNotBindNode(CXFA_ObjArray& arrayNodes) {
 | 
|    for (int32_t i = 0; i < arrayNodes.GetSize(); i++) {
 | 
| -    CXFA_Object* pObject = arrayNodes[i];
 | 
| -    if (!pObject->IsNode()) {
 | 
| -      continue;
 | 
| -    }
 | 
| -    if (((CXFA_Node*)pObject)->HasBindItem()) {
 | 
| -      continue;
 | 
| -    }
 | 
| -    return ((CXFA_Node*)pObject);
 | 
| +    CXFA_Node* pNode = arrayNodes[i]->AsNode();
 | 
| +    if (pNode && !pNode->HasBindItem())
 | 
| +      return pNode;
 | 
|    }
 | 
| -  return NULL;
 | 
| +  return nullptr;
 | 
|  }
 | 
|  void CXFA_Document::DoDataMerge() {
 | 
| -  CXFA_Node* pDatasetsRoot = (CXFA_Node*)GetXFAObject(XFA_HASHCODE_Datasets);
 | 
| +  CXFA_Node* pDatasetsRoot = ToNode(GetXFAObject(XFA_HASHCODE_Datasets));
 | 
|    if (!pDatasetsRoot) {
 | 
|      IFDE_XMLElement* pDatasetsXMLNode =
 | 
|          IFDE_XMLElement::Create(FX_WSTRC(L"xfa:datasets"));
 | 
| @@ -1537,7 +1532,7 @@ void CXFA_Document::DoDataMerge() {
 | 
|    }
 | 
|  }
 | 
|  void CXFA_Document::DoDataRemerge(FX_BOOL bDoDataMerge) {
 | 
| -  CXFA_Node* pFormRoot = (CXFA_Node*)this->GetXFAObject(XFA_HASHCODE_Form);
 | 
| +  CXFA_Node* pFormRoot = ToNode(GetXFAObject(XFA_HASHCODE_Form));
 | 
|    if (pFormRoot) {
 | 
|      while (CXFA_Node* pNode = pFormRoot->GetNodeItem(XFA_NODEITEM_FirstChild)) {
 | 
|        pFormRoot->RemoveChild(pNode);
 | 
| 
 |