@@ -99,6 +99,7 @@ static zend_object_handlers dom_modern_nodelist_object_handlers;
99
99
static zend_object_handlers dom_html_collection_object_handlers ;
100
100
static zend_object_handlers dom_object_namespace_node_handlers ;
101
101
static zend_object_handlers dom_modern_domimplementation_object_handlers ;
102
+ static zend_object_handlers dom_modern_element_object_handlers ;
102
103
static zend_object_handlers dom_token_list_object_handlers ;
103
104
#ifdef LIBXML_XPATH_ENABLED
104
105
zend_object_handlers dom_xpath_object_handlers ;
@@ -662,6 +663,21 @@ static zend_object *dom_objects_store_clone_obj(zend_object *zobject) /* {{{ */
662
663
}
663
664
/* }}} */
664
665
666
+ static zend_object * dom_modern_element_clone_obj (zend_object * zobject )
667
+ {
668
+ zend_object * clone = dom_objects_store_clone_obj (zobject );
669
+
670
+ /* The $classList property is unique per element, and cached due to its [[SameObject]] requirement.
671
+ * Remove it from the clone so the clone will get a fresh instance upon demand. */
672
+ zval * class_list = dom_element_class_list_zval (php_dom_obj_from_obj (clone ));
673
+ if (!Z_ISUNDEF_P (class_list )) {
674
+ zval_ptr_dtor (class_list );
675
+ ZVAL_UNDEF (class_list );
676
+ }
677
+
678
+ return clone ;
679
+ }
680
+
665
681
static zend_object * dom_object_namespace_node_clone_obj (zend_object * zobject )
666
682
{
667
683
dom_object_namespace_node * intern = php_dom_namespace_node_obj_from_obj (zobject );
@@ -756,6 +772,9 @@ PHP_MINIT_FUNCTION(dom)
756
772
* one instance per parent object. */
757
773
dom_modern_domimplementation_object_handlers .clone_obj = NULL ;
758
774
775
+ memcpy (& dom_modern_element_object_handlers , & dom_object_handlers , sizeof (zend_object_handlers ));
776
+ dom_modern_element_object_handlers .clone_obj = dom_modern_element_clone_obj ;
777
+
759
778
memcpy (& dom_nnodemap_object_handlers , & dom_object_handlers , sizeof (zend_object_handlers ));
760
779
dom_nnodemap_object_handlers .free_obj = dom_nnodemap_objects_free_storage ;
761
780
dom_nnodemap_object_handlers .read_dimension = dom_nodemap_read_dimension ;
@@ -1086,7 +1105,7 @@ PHP_MINIT_FUNCTION(dom)
1086
1105
1087
1106
dom_modern_element_class_entry = register_class_Dom_Element (dom_modern_node_class_entry , dom_modern_parentnode_class_entry , dom_modern_childnode_class_entry );
1088
1107
dom_modern_element_class_entry -> create_object = dom_objects_new ;
1089
- dom_modern_element_class_entry -> default_object_handlers = & dom_object_handlers ;
1108
+ dom_modern_element_class_entry -> default_object_handlers = & dom_modern_element_object_handlers ;
1090
1109
1091
1110
zend_hash_init (& dom_modern_element_prop_handlers , 0 , NULL , NULL , true);
1092
1111
DOM_REGISTER_PROP_HANDLER (& dom_modern_element_prop_handlers , "namespaceURI" , dom_node_namespace_uri_read , NULL );
@@ -1111,7 +1130,7 @@ PHP_MINIT_FUNCTION(dom)
1111
1130
1112
1131
dom_html_element_class_entry = register_class_Dom_HTMLElement (dom_modern_element_class_entry );
1113
1132
dom_html_element_class_entry -> create_object = dom_objects_new ;
1114
- dom_html_element_class_entry -> default_object_handlers = & dom_object_handlers ;
1133
+ dom_html_element_class_entry -> default_object_handlers = & dom_modern_element_object_handlers ;
1115
1134
zend_hash_add_new_ptr (& classes , dom_html_element_class_entry -> name , & dom_modern_element_prop_handlers );
1116
1135
1117
1136
dom_text_class_entry = register_class_DOMText (dom_characterdata_class_entry );
0 commit comments