summaryrefslogtreecommitdiff
path: root/ext/dom/node.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/dom/node.c')
-rw-r--r--ext/dom/node.c190
1 files changed, 93 insertions, 97 deletions
diff --git a/ext/dom/node.c b/ext/dom/node.c
index e200d91416..7563197cf3 100644
--- a/ext/dom/node.c
+++ b/ext/dom/node.c
@@ -217,7 +217,6 @@ Since:
*/
int dom_node_parent_node_read(dom_object *obj, zval **retval TSRMLS_DC)
{
- zval *wrapper;
xmlNode *nodep, *nodeparent;
int ret;
@@ -228,11 +227,9 @@ int dom_node_parent_node_read(dom_object *obj, zval **retval TSRMLS_DC)
return FAILURE;
}
- wrapper = dom_object_get_data(nodeparent);
- if (wrapper == NULL) {
- ALLOC_ZVAL(*retval);
- }
- if (NULL == (*retval = php_dom_create_object(nodeparent, &ret, wrapper, *retval TSRMLS_CC))) {
+ ALLOC_ZVAL(*retval);
+
+ if (NULL == (*retval = php_dom_create_object(nodeparent, &ret, NULL, *retval, obj TSRMLS_CC))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
return FAILURE;
}
@@ -264,13 +261,9 @@ int dom_node_child_nodes_read(dom_object *obj, zval **retval TSRMLS_DC)
if (last) {
while (last) {
- zval *child = NULL;
- zval *wrapper;
- wrapper = dom_object_get_data(last);
- if (wrapper == NULL) {
- MAKE_STD_ZVAL(child);
- }
- child = php_dom_create_object(last, &ret, wrapper, child TSRMLS_CC);
+ zval *child;
+ MAKE_STD_ZVAL(child);
+ child = php_dom_create_object(last, &ret, NULL, child, obj TSRMLS_CC);
add_next_index_zval(*retval, child);
last = last->next;
}
@@ -289,7 +282,6 @@ Since:
*/
int dom_node_first_child_read(dom_object *obj, zval **retval TSRMLS_DC)
{
- zval *wrapper;
xmlNode *nodep, *first;
int ret;
@@ -301,11 +293,9 @@ int dom_node_first_child_read(dom_object *obj, zval **retval TSRMLS_DC)
return FAILURE;
}
- wrapper = dom_object_get_data(first);
- if (wrapper == NULL) {
- ALLOC_ZVAL(*retval);
- }
- if (NULL == (*retval = php_dom_create_object(first, &ret, wrapper, *retval TSRMLS_CC))) {
+ ALLOC_ZVAL(*retval);
+
+ if (NULL == (*retval = php_dom_create_object(first, &ret, NULL, *retval, obj TSRMLS_CC))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
return FAILURE;
}
@@ -323,7 +313,6 @@ Since:
*/
int dom_node_last_child_read(dom_object *obj, zval **retval TSRMLS_DC)
{
- zval *wrapper;
xmlNode *nodep, *last;
int ret;
@@ -334,11 +323,9 @@ int dom_node_last_child_read(dom_object *obj, zval **retval TSRMLS_DC)
return FAILURE;
}
- wrapper = dom_object_get_data(last);
- if (wrapper == NULL) {
- ALLOC_ZVAL(*retval);
- }
- if (NULL == (*retval = php_dom_create_object(last, &ret, wrapper, *retval TSRMLS_CC))) {
+ ALLOC_ZVAL(*retval);
+
+ if (NULL == (*retval = php_dom_create_object(last, &ret, NULL, *retval, obj TSRMLS_CC))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
return FAILURE;
}
@@ -356,7 +343,6 @@ Since:
*/
int dom_node_previous_sibling_read(dom_object *obj, zval **retval TSRMLS_DC)
{
- zval *wrapper;
xmlNode *nodep, *prevsib;
int ret;
@@ -367,11 +353,9 @@ int dom_node_previous_sibling_read(dom_object *obj, zval **retval TSRMLS_DC)
return FAILURE;
}
- wrapper = dom_object_get_data(prevsib);
- if (wrapper == NULL) {
- ALLOC_ZVAL(*retval);
- }
- if (NULL == (*retval = php_dom_create_object(prevsib, &ret, wrapper, *retval TSRMLS_CC))) {
+ ALLOC_ZVAL(*retval);
+
+ if (NULL == (*retval = php_dom_create_object(prevsib, &ret, NULL, *retval, obj TSRMLS_CC))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
return FAILURE;
}
@@ -389,7 +373,6 @@ Since:
*/
int dom_node_next_sibling_read(dom_object *obj, zval **retval TSRMLS_DC)
{
- zval *wrapper;
xmlNode *nodep, *nextsib;
int ret;
@@ -400,11 +383,9 @@ int dom_node_next_sibling_read(dom_object *obj, zval **retval TSRMLS_DC)
return FAILURE;
}
- wrapper = dom_object_get_data(nextsib);
- if (wrapper == NULL) {
- ALLOC_ZVAL(*retval);
- }
- if (NULL == (*retval = php_dom_create_object(nextsib, &ret, wrapper, *retval TSRMLS_CC))) {
+ ALLOC_ZVAL(*retval);
+
+ if (NULL == (*retval = php_dom_create_object(nextsib, &ret, NULL, *retval, obj TSRMLS_CC))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
return FAILURE;
}
@@ -435,13 +416,9 @@ int dom_node_attributes_read(dom_object *obj, zval **retval TSRMLS_DC)
array_init(*retval);
while (attr) {
- zval *curattr = NULL;
- zval *wrapper;
- wrapper = dom_object_get_data((xmlNodePtr) attr);
- if (wrapper == NULL) {
- MAKE_STD_ZVAL(curattr);
- }
- curattr = php_dom_create_object((xmlNodePtr) attr, &ret, wrapper, curattr TSRMLS_CC);
+ zval *curattr;
+ MAKE_STD_ZVAL(curattr);
+ curattr = php_dom_create_object((xmlNodePtr) attr, &ret, NULL, curattr, obj TSRMLS_CC);
add_assoc_zval(*retval, (char *) attr->name, curattr);
attr = attr->next;
}
@@ -463,7 +440,6 @@ Since:
*/
int dom_node_owner_document_read(dom_object *obj, zval **retval TSRMLS_DC)
{
- zval *wrapper;
xmlNode *nodep;
xmlDocPtr docp;
int ret;
@@ -481,11 +457,9 @@ int dom_node_owner_document_read(dom_object *obj, zval **retval TSRMLS_DC)
return FAILURE;
}
- wrapper = dom_object_get_data((xmlNodePtr) docp);
- if (wrapper == NULL) {
- ALLOC_ZVAL(*retval);
- }
- if (NULL == (*retval = php_dom_create_object((xmlNodePtr) docp, &ret, wrapper, *retval TSRMLS_CC))) {
+ ALLOC_ZVAL(*retval);
+
+ if (NULL == (*retval = php_dom_create_object((xmlNodePtr) docp, &ret, NULL, *retval, obj TSRMLS_CC))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
return FAILURE;
}
@@ -721,31 +695,38 @@ PHP_FUNCTION(dom_node_insert_before)
{
zval *id, *node, *ref, *rv = NULL;
xmlNodePtr child, new_child, parentp, refp;
+ dom_object *intern, *childobj, *refpobj;
int ret;
- DOM_GET_THIS_OBJ(parentp, id, xmlNodePtr);
+ DOM_GET_THIS_OBJ(parentp, id, xmlNodePtr, intern);
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "oo!", &node, &ref) == FAILURE) {
return;
}
- DOM_GET_OBJ(child, node, xmlNodePtr);
+ DOM_GET_OBJ(child, node, xmlNodePtr, childobj);
new_child = NULL;
if (dom_hierarchy(parentp, child) == FAILURE) {
php_dom_throw_error(HIERARCHY_REQUEST_ERR, &return_value TSRMLS_CC);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Hierarchy Request Error");
+ RETURN_FALSE;
}
-
+
if (child->doc != parentp->doc && child->doc != NULL) {
php_dom_throw_error(WRONG_DOCUMENT_ERR, &return_value TSRMLS_CC);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't add newnode as it was created from a different document");
RETURN_FALSE;
}
+ if (child->doc == NULL && parentp->doc != NULL) {
+ childobj->document = intern->document;
+ increment_document_reference(childobj, NULL TSRMLS_CC);
+ }
+
if (ref != NULL) {
- DOM_GET_OBJ(refp, ref, xmlNodePtr);
+ DOM_GET_OBJ(refp, ref, xmlNodePtr, refpobj);
if (refp->parent != parentp) {
php_dom_throw_error(NOT_FOUND_ERR, &return_value TSRMLS_CC);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't add newnode as refnode is not child of node");
@@ -765,14 +746,14 @@ PHP_FUNCTION(dom_node_insert_before)
xmlNodeSetContent(refp, tmp);
xmlFree(tmp);
node_free_resource(child TSRMLS_CC);
- DOM_RET_OBJ(rv, refp, &ret);
+ DOM_RET_OBJ(rv, refp, &ret, intern);
return;
}
if ((refp->prev != NULL) && (refp->prev->type == XML_TEXT_NODE)
&& (refp->name == refp->prev->name)) {
xmlNodeAddContent(refp->prev, child->content);
node_free_resource(child TSRMLS_CC);
- DOM_RET_OBJ(rv, refp->prev, &ret);
+ DOM_RET_OBJ(rv, refp->prev, &ret, intern);
return;
}
} else if (child->type == XML_ATTRIBUTE_NODE) {
@@ -788,7 +769,7 @@ PHP_FUNCTION(dom_node_insert_before)
node_free_resource((xmlNodePtr) lastattr TSRMLS_CC);
xmlFreeProp(lastattr);
} else {
- DOM_RET_OBJ(rv, child, &ret);
+ DOM_RET_OBJ(rv, child, &ret, intern);
return;
}
}
@@ -805,7 +786,7 @@ PHP_FUNCTION(dom_node_insert_before)
(parentp != child)) {
xmlNodeAddContent(parentp, child->content);
node_free_resource(child TSRMLS_CC);
- DOM_RET_OBJ(rv, parentp, &ret);
+ DOM_RET_OBJ(rv, parentp, &ret, intern);
return;
}
if ((parentp->last != NULL) && (parentp->last->type == XML_TEXT_NODE) &&
@@ -813,7 +794,7 @@ PHP_FUNCTION(dom_node_insert_before)
(parentp->last != child)) {
xmlNodeAddContent(parentp->last, child->content);
node_free_resource(child TSRMLS_CC);
- DOM_RET_OBJ(rv, parentp->last, &ret);
+ DOM_RET_OBJ(rv, parentp->last, &ret, intern);
return;
}
} else if (child->type == XML_ATTRIBUTE_NODE) {
@@ -829,7 +810,7 @@ PHP_FUNCTION(dom_node_insert_before)
node_free_resource((xmlNodePtr) lastattr TSRMLS_CC);
xmlFreeProp(lastattr);
} else {
- DOM_RET_OBJ(rv, child, &ret);
+ DOM_RET_OBJ(rv, child, &ret, intern);
return;
}
}
@@ -838,8 +819,8 @@ PHP_FUNCTION(dom_node_insert_before)
if (new_child != NULL) {
child->children = NULL;
}
- dom_add_to_list(child, (xmlDocPtr) child->doc TSRMLS_CC);
- DOM_RET_OBJ(rv, new_child, &ret);
+ dom_add_to_list(child, intern TSRMLS_CC);
+ DOM_RET_OBJ(rv, new_child, &ret, intern);
return;
}
new_child = xmlAddChild(parentp, child);
@@ -850,9 +831,9 @@ PHP_FUNCTION(dom_node_insert_before)
RETURN_FALSE;
}
- dom_del_from_list(child, (xmlDocPtr) child->doc TSRMLS_CC);
+ dom_del_from_list(child, intern TSRMLS_CC);
- DOM_RET_OBJ(rv, new_child, &ret);
+ DOM_RET_OBJ(rv, new_child, &ret, intern);
}
/* }}} end dom_node_insert_before */
@@ -866,17 +847,19 @@ PHP_FUNCTION(dom_node_replace_child)
{
zval *id, *newnode, *oldnode;
xmlNodePtr children, newchild, oldchild, nodep;
+ dom_object *intern, *newchildobj, *oldchildobj;
int foundoldchild = 0;
+
int ret;
- DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr);
+ DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr, intern);
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "oo", &newnode, &oldnode) == FAILURE) {
return;
}
- DOM_GET_OBJ(newchild, newnode, xmlNodePtr);
- DOM_GET_OBJ(oldchild, oldnode, xmlNodePtr);
+ DOM_GET_OBJ(newchild, newnode, xmlNodePtr, newchildobj);
+ DOM_GET_OBJ(oldchild, oldnode, xmlNodePtr, oldchildobj);
children = nodep->children;
if (!children) {
@@ -892,6 +875,7 @@ PHP_FUNCTION(dom_node_replace_child)
if (dom_hierarchy(nodep, newchild) == FAILURE) {
php_dom_throw_error(HIERARCHY_REQUEST_ERR, &return_value TSRMLS_CC);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Hierarchy Request Error");
+ RETURN_FALSE;
}
/* check for the old child and wether the new child is already a child */
@@ -908,13 +892,17 @@ PHP_FUNCTION(dom_node_replace_child)
if (oldchild != newchild) {
xmlNodePtr node;
if (newchild->parent == NULL && newchild->doc != NULL) {
- dom_del_from_list(newchild, (xmlDocPtr) newchild->doc TSRMLS_CC);
+ dom_del_from_list(newchild, intern TSRMLS_CC);
+ }
+ if (newchild->doc == NULL && nodep->doc != NULL) {
+ newchildobj->document = intern->document;
+ increment_document_reference(newchildobj, NULL TSRMLS_CC);
}
if((node = xmlReplaceNode(oldchild, newchild)) != NULL) {
- dom_add_to_list(node, (xmlDocPtr) node->doc TSRMLS_CC);
+ dom_add_to_list(node, intern TSRMLS_CC);
}
}
- DOM_RET_OBJ(rv, oldchild, &ret);
+ DOM_RET_OBJ(rv, oldchild, &ret, intern);
return;
} else {
php_dom_throw_error(NOT_FOUND_ERR, &return_value TSRMLS_CC);
@@ -933,15 +921,16 @@ PHP_FUNCTION(dom_node_remove_child)
{
zval *id, *node;
xmlNodePtr children, child, nodep;
+ dom_object *intern, *childobj;
int ret;
- DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr);
+ DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr, intern);
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &node) == FAILURE) {
return;
}
- DOM_GET_OBJ(child, node, xmlNodePtr);
+ DOM_GET_OBJ(child, node, xmlNodePtr, childobj);
children = nodep->children;
if (!children) {
@@ -953,8 +942,8 @@ PHP_FUNCTION(dom_node_remove_child)
if (children == child) {
zval *rv = NULL;
xmlUnlinkNode(child);
- dom_add_to_list(child, (xmlDocPtr) child->doc TSRMLS_CC);
- DOM_RET_OBJ(rv, child, &ret);
+ dom_add_to_list(child, intern TSRMLS_CC);
+ DOM_RET_OBJ(rv, child, &ret, intern);
return;
}
children = children->next;
@@ -974,23 +963,21 @@ PHP_FUNCTION(dom_node_append_child)
{
zval *id, *node, *rv = NULL;
xmlNodePtr child, nodep, new_child = NULL;
+ dom_object *intern, *childobj;
int ret;
- DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr);
+ DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr, intern);
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &node) == FAILURE) {
return;
}
- if (!PZVAL_IS_REF(node)) {
- zval_add_ref(&node);
- }
-
- DOM_GET_OBJ(child, node, xmlNodePtr);
+ DOM_GET_OBJ(child, node, xmlNodePtr, childobj);
if (dom_hierarchy(nodep, child) == FAILURE) {
php_dom_throw_error(HIERARCHY_REQUEST_ERR, &return_value TSRMLS_CC);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Hierarchy Request Error");
+ RETURN_FALSE;
}
if (!(child->doc == NULL || child->doc == nodep->doc)) {
@@ -999,6 +986,11 @@ PHP_FUNCTION(dom_node_append_child)
RETURN_FALSE;
}
+ if (child->doc == NULL && nodep->doc != NULL) {
+ childobj->document = intern->document;
+ increment_document_reference(childobj, NULL TSRMLS_CC);
+ }
+
if (child->parent != NULL){
xmlUnlinkNode(child);
}
@@ -1008,14 +1000,14 @@ PHP_FUNCTION(dom_node_append_child)
(nodep->content != NULL)) {
xmlNodeAddContent(nodep, child->content);
node_free_resource(child TSRMLS_CC);
- DOM_RET_OBJ(rv, nodep, &ret);
+ DOM_RET_OBJ(rv, nodep, &ret, intern);
return;
}
if ((nodep->last != NULL) && (nodep->last->type == XML_TEXT_NODE) &&
(nodep->last->name == child->name)) {
xmlNodeAddContent(nodep->last, child->content);
node_free_resource(child TSRMLS_CC);
- DOM_RET_OBJ(rv, nodep->last, &ret);
+ DOM_RET_OBJ(rv, nodep->last, &ret, intern);
return;
}
} else if (child->type == XML_ATTRIBUTE_NODE) {
@@ -1037,22 +1029,21 @@ PHP_FUNCTION(dom_node_append_child)
if (new_child != NULL) {
child->children = NULL;
}
- dom_add_to_list(child, (xmlDocPtr) child->doc TSRMLS_CC);
- DOM_RET_OBJ(rv, new_child, &ret);
+ dom_add_to_list(child, intern TSRMLS_CC);
+ DOM_RET_OBJ(rv, new_child, &ret, intern);
return;
}
new_child = xmlAddChild(nodep, child);
if (new_child == NULL) {
- dom_add_to_list(child, (xmlDocPtr) child->doc TSRMLS_CC);
+ dom_add_to_list(child, intern TSRMLS_CC);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't append node");
RETURN_FALSE;
}
- dom_del_from_list(child, (xmlDocPtr) child->doc TSRMLS_CC);
-
- DOM_RET_OBJ(rv, new_child, &ret);
+ dom_del_from_list(child, intern TSRMLS_CC);
+ DOM_RET_OBJ(rv, new_child, &ret, intern);
}
/* }}} end dom_node_append_child */
@@ -1065,8 +1056,9 @@ PHP_FUNCTION(dom_node_has_child_nodes)
{
zval *id;
xmlNode *nodep;
+ dom_object *intern;
- DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr);
+ DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr, intern);
DOM_NO_ARGS();
@@ -1088,10 +1080,11 @@ PHP_FUNCTION(dom_node_clone_node)
zval *rv = NULL;
zval *id;
xmlNode *n, *node;
- int ret;
+ int ret;
+ dom_object *intern;
long recursive = 0;
- DOM_GET_THIS_OBJ(n, id, xmlNodePtr);
+ DOM_GET_THIS_OBJ(n, id, xmlNodePtr, intern);
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &recursive) == FAILURE) {
return;
@@ -1101,9 +1094,9 @@ PHP_FUNCTION(dom_node_clone_node)
if (!node) {
RETURN_FALSE;
}
- dom_add_to_list(node, (xmlDocPtr) node->doc TSRMLS_CC);
+ dom_add_to_list(node, intern TSRMLS_CC);
- DOM_RET_OBJ(rv, node, &ret);
+ DOM_RET_OBJ(rv, node, &ret, intern);
}
/* }}} end dom_node_clone_node */
@@ -1117,8 +1110,9 @@ PHP_FUNCTION(dom_node_normalize)
{
zval *id;
xmlNode *nodep;
+ dom_object *intern;
- DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr);
+ DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr, intern);
DOM_NO_ARGS();
@@ -1147,8 +1141,9 @@ PHP_FUNCTION(dom_node_has_attributes)
{
zval *id;
xmlNode *nodep;
+ dom_object *intern;
- DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr);
+ DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr, intern);
DOM_NO_ARGS();
@@ -1183,14 +1178,15 @@ PHP_FUNCTION(dom_node_is_same_node)
{
zval *id, *node;
xmlNodePtr nodeotherp, nodep;
+ dom_object *intern, *nodeotherobj;
- DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr);
+ DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr, intern);
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &node) == FAILURE) {
return;
}
- DOM_GET_OBJ(nodeotherp, node, xmlNodePtr);
+ DOM_GET_OBJ(nodeotherp, node, xmlNodePtr, nodeotherobj);
if (nodep == nodeotherp) {
RETURN_TRUE;