@@ -61,6 +61,7 @@ PHP_DOM_EXPORT zend_class_entry *dom_namespace_node_class_entry;
61
61
62
62
zend_object_handlers dom_object_handlers ;
63
63
zend_object_handlers dom_nnodemap_object_handlers ;
64
+ zend_object_handlers dom_object_namespace_node_handlers ;
64
65
#ifdef LIBXML_XPATH_ENABLED
65
66
zend_object_handlers dom_xpath_object_handlers ;
66
67
#endif
@@ -86,6 +87,9 @@ static HashTable dom_xpath_prop_handlers;
86
87
#endif
87
88
/* }}} */
88
89
90
+ static zend_object * dom_objects_namespace_node_new (zend_class_entry * class_type );
91
+ static void dom_object_namespace_node_free_storage (zend_object * object );
92
+
89
93
typedef int (* dom_read_t )(dom_object * obj , zval * retval );
90
94
typedef int (* dom_write_t )(dom_object * obj , zval * newval );
91
95
@@ -570,6 +574,10 @@ PHP_MINIT_FUNCTION(dom)
570
574
dom_nnodemap_object_handlers .read_dimension = dom_nodelist_read_dimension ;
571
575
dom_nnodemap_object_handlers .has_dimension = dom_nodelist_has_dimension ;
572
576
577
+ memcpy (& dom_object_namespace_node_handlers , & dom_object_handlers , sizeof (zend_object_handlers ));
578
+ dom_object_namespace_node_handlers .offset = XtOffsetOf (dom_object_namespace_node , dom .std );
579
+ dom_object_namespace_node_handlers .free_obj = dom_object_namespace_node_free_storage ;
580
+
573
581
zend_hash_init (& classes , 0 , NULL , NULL , 1 );
574
582
575
583
dom_domexception_class_entry = register_class_DOMException (zend_ce_exception );
@@ -604,7 +612,7 @@ PHP_MINIT_FUNCTION(dom)
604
612
zend_hash_add_ptr (& classes , dom_node_class_entry -> name , & dom_node_prop_handlers );
605
613
606
614
dom_namespace_node_class_entry = register_class_DOMNameSpaceNode ();
607
- dom_namespace_node_class_entry -> create_object = dom_objects_new ;
615
+ dom_namespace_node_class_entry -> create_object = dom_objects_namespace_node_new ;
608
616
609
617
zend_hash_init (& dom_namespace_node_prop_handlers , 0 , NULL , dom_dtor_prop_handler , 1 );
610
618
dom_register_prop_handler (& dom_namespace_node_prop_handlers , "nodeName" , sizeof ("nodeName" )- 1 , dom_node_node_name_read , NULL );
@@ -952,10 +960,8 @@ void dom_namednode_iter(dom_object *basenode, int ntype, dom_object *intern, xml
952
960
}
953
961
/* }}} */
954
962
955
- static dom_object * dom_objects_set_class (zend_class_entry * class_type ) /* {{{ */
963
+ static void dom_objects_set_class_ex (zend_class_entry * class_type , dom_object * intern )
956
964
{
957
- dom_object * intern = zend_object_alloc (sizeof (dom_object ), class_type );
958
-
959
965
zend_class_entry * base_class = class_type ;
960
966
while ((base_class -> type != ZEND_INTERNAL_CLASS || base_class -> info .internal .module -> module_number != dom_module_entry .module_number ) && base_class -> parent != NULL ) {
961
967
base_class = base_class -> parent ;
@@ -965,10 +971,14 @@ static dom_object* dom_objects_set_class(zend_class_entry *class_type) /* {{{ */
965
971
966
972
zend_object_std_init (& intern -> std , class_type );
967
973
object_properties_init (& intern -> std , class_type );
974
+ }
968
975
976
+ static dom_object * dom_objects_set_class (zend_class_entry * class_type )
977
+ {
978
+ dom_object * intern = zend_object_alloc (sizeof (dom_object ), class_type );
979
+ dom_objects_set_class_ex (class_type , intern );
969
980
return intern ;
970
981
}
971
- /* }}} */
972
982
973
983
/* {{{ dom_objects_new */
974
984
zend_object * dom_objects_new (zend_class_entry * class_type )
@@ -979,6 +989,25 @@ zend_object *dom_objects_new(zend_class_entry *class_type)
979
989
}
980
990
/* }}} */
981
991
992
+ static zend_object * dom_objects_namespace_node_new (zend_class_entry * class_type )
993
+ {
994
+ dom_object_namespace_node * intern = zend_object_alloc (sizeof (dom_object_namespace_node ), class_type );
995
+ dom_objects_set_class_ex (class_type , & intern -> dom );
996
+ intern -> dom .std .handlers = & dom_object_namespace_node_handlers ;
997
+ return & intern -> dom .std ;
998
+ }
999
+
1000
+ static void dom_object_namespace_node_free_storage (zend_object * object )
1001
+ {
1002
+ dom_object_namespace_node * intern = php_dom_namespace_node_obj_from_obj (object );
1003
+ if (intern -> parent_intern != NULL ) {
1004
+ zval tmp ;
1005
+ ZVAL_OBJ (& tmp , & intern -> parent_intern -> std );
1006
+ zval_ptr_dtor (& tmp );
1007
+ }
1008
+ dom_objects_free_storage (object );
1009
+ }
1010
+
982
1011
#ifdef LIBXML_XPATH_ENABLED
983
1012
/* {{{ zend_object dom_xpath_objects_new(zend_class_entry *class_type) */
984
1013
zend_object * dom_xpath_objects_new (zend_class_entry * class_type )
@@ -1501,6 +1530,28 @@ xmlNsPtr dom_get_nsdecl(xmlNode *node, xmlChar *localName) {
1501
1530
}
1502
1531
/* }}} end dom_get_nsdecl */
1503
1532
1533
+ /* Note: Assumes the additional lifetime was already added in the caller. */
1534
+ xmlNodePtr php_dom_create_fake_namespace_decl (xmlNodePtr nodep , xmlNsPtr original , zval * return_value , dom_object * parent_intern )
1535
+ {
1536
+ xmlNodePtr attrp ;
1537
+ xmlNsPtr curns = xmlNewNs (NULL , original -> href , NULL );
1538
+ if (original -> prefix ) {
1539
+ curns -> prefix = xmlStrdup (original -> prefix );
1540
+ attrp = xmlNewDocNode (nodep -> doc , NULL , (xmlChar * ) original -> prefix , original -> href );
1541
+ } else {
1542
+ attrp = xmlNewDocNode (nodep -> doc , NULL , (xmlChar * )"xmlns" , original -> href );
1543
+ }
1544
+ attrp -> type = XML_NAMESPACE_DECL ;
1545
+ attrp -> parent = nodep ;
1546
+ attrp -> ns = curns ;
1547
+
1548
+ php_dom_create_object (attrp , return_value , parent_intern );
1549
+ /* This object must exist, because we just created an object for it via php_dom_create_object(). */
1550
+ dom_object * obj = ((php_libxml_node_ptr * )attrp -> _private )-> _private ;
1551
+ php_dom_namespace_node_obj_from_obj (& obj -> std )-> parent_intern = parent_intern ;
1552
+ return attrp ;
1553
+ }
1554
+
1504
1555
static zval * dom_nodelist_read_dimension (zend_object * object , zval * offset , int type , zval * rv ) /* {{{ */
1505
1556
{
1506
1557
zval offset_copy ;
0 commit comments