@@ -1000,9 +1000,9 @@ PHP_METHOD(DOMNode, insertBefore)
1000
1000
PHP_METHOD (DOMNode , replaceChild )
1001
1001
{
1002
1002
zval * id , * newnode , * oldnode ;
1003
- xmlNodePtr children , newchild , oldchild , nodep ;
1003
+ xmlNodePtr newchild , oldchild , nodep ;
1004
1004
dom_object * intern , * newchildobj , * oldchildobj ;
1005
- int foundoldchild = 0 , stricterror ;
1005
+ int stricterror ;
1006
1006
1007
1007
int ret ;
1008
1008
@@ -1020,8 +1020,7 @@ PHP_METHOD(DOMNode, replaceChild)
1020
1020
DOM_GET_OBJ (newchild , newnode , xmlNodePtr , newchildobj );
1021
1021
DOM_GET_OBJ (oldchild , oldnode , xmlNodePtr , oldchildobj );
1022
1022
1023
- children = nodep -> children ;
1024
- if (!children ) {
1023
+ if (!nodep -> children ) {
1025
1024
RETURN_FALSE ;
1026
1025
}
1027
1026
@@ -1043,42 +1042,32 @@ PHP_METHOD(DOMNode, replaceChild)
1043
1042
RETURN_FALSE ;
1044
1043
}
1045
1044
1046
- /* check for the old child and whether the new child is already a child */
1047
- while (children ) {
1048
- if (children == oldchild ) {
1049
- foundoldchild = 1 ;
1050
- break ;
1051
- }
1052
- children = children -> next ;
1045
+ if (oldchild -> parent != nodep ) {
1046
+ php_dom_throw_error (NOT_FOUND_ERR , stricterror );
1047
+ RETURN_FALSE ;
1053
1048
}
1054
1049
1055
- if (foundoldchild ) {
1056
- if (newchild -> type == XML_DOCUMENT_FRAG_NODE ) {
1057
- xmlNodePtr prevsib , nextsib ;
1058
- prevsib = oldchild -> prev ;
1059
- nextsib = oldchild -> next ;
1050
+ if (newchild -> type == XML_DOCUMENT_FRAG_NODE ) {
1051
+ xmlNodePtr prevsib , nextsib ;
1052
+ prevsib = oldchild -> prev ;
1053
+ nextsib = oldchild -> next ;
1060
1054
1061
- xmlUnlinkNode (oldchild );
1055
+ xmlUnlinkNode (oldchild );
1062
1056
1063
- newchild = _php_dom_insert_fragment (nodep , prevsib , nextsib , newchild , intern , newchildobj );
1064
- if (newchild ) {
1065
- dom_reconcile_ns (nodep -> doc , newchild );
1066
- }
1067
- } else if (oldchild != newchild ) {
1068
- if (newchild -> doc == NULL && nodep -> doc != NULL ) {
1069
- xmlSetTreeDoc (newchild , nodep -> doc );
1070
- newchildobj -> document = intern -> document ;
1071
- php_libxml_increment_doc_ref ((php_libxml_node_object * )newchildobj , NULL );
1072
- }
1073
- xmlReplaceNode (oldchild , newchild );
1057
+ newchild = _php_dom_insert_fragment (nodep , prevsib , nextsib , newchild , intern , newchildobj );
1058
+ if (newchild ) {
1074
1059
dom_reconcile_ns (nodep -> doc , newchild );
1075
1060
}
1076
- DOM_RET_OBJ (oldchild , & ret , intern );
1077
- return ;
1078
- } else {
1079
- php_dom_throw_error (NOT_FOUND_ERR , stricterror );
1080
- RETURN_FALSE ;
1061
+ } else if (oldchild != newchild ) {
1062
+ if (newchild -> doc == NULL && nodep -> doc != NULL ) {
1063
+ xmlSetTreeDoc (newchild , nodep -> doc );
1064
+ newchildobj -> document = intern -> document ;
1065
+ php_libxml_increment_doc_ref ((php_libxml_node_object * )newchildobj , NULL );
1066
+ }
1067
+ xmlReplaceNode (oldchild , newchild );
1068
+ dom_reconcile_ns (nodep -> doc , newchild );
1081
1069
}
1070
+ DOM_RET_OBJ (oldchild , & ret , intern );
1082
1071
}
1083
1072
/* }}} end dom_node_replace_child */
1084
1073
@@ -1088,7 +1077,7 @@ PHP_METHOD(DOMNode, replaceChild)
1088
1077
PHP_METHOD (DOMNode , removeChild )
1089
1078
{
1090
1079
zval * id , * node ;
1091
- xmlNodePtr children , child , nodep ;
1080
+ xmlNodePtr child , nodep ;
1092
1081
dom_object * intern , * childobj ;
1093
1082
int ret , stricterror ;
1094
1083
@@ -1113,23 +1102,13 @@ PHP_METHOD(DOMNode, removeChild)
1113
1102
RETURN_FALSE ;
1114
1103
}
1115
1104
1116
- children = nodep -> children ;
1117
- if (!children ) {
1105
+ if (!nodep -> children || child -> parent != nodep ) {
1118
1106
php_dom_throw_error (NOT_FOUND_ERR , stricterror );
1119
1107
RETURN_FALSE ;
1120
1108
}
1121
1109
1122
- while (children ) {
1123
- if (children == child ) {
1124
- xmlUnlinkNode (child );
1125
- DOM_RET_OBJ (child , & ret , intern );
1126
- return ;
1127
- }
1128
- children = children -> next ;
1129
- }
1130
-
1131
- php_dom_throw_error (NOT_FOUND_ERR , stricterror );
1132
- RETURN_FALSE ;
1110
+ xmlUnlinkNode (child );
1111
+ DOM_RET_OBJ (child , & ret , intern );
1133
1112
}
1134
1113
/* }}} end dom_node_remove_child */
1135
1114
0 commit comments