@@ -101,6 +101,7 @@ static zend_object_handlers dom_modern_nodelist_object_handlers;
101
101
static zend_object_handlers dom_html_collection_object_handlers ;
102
102
static zend_object_handlers dom_object_namespace_node_handlers ;
103
103
static zend_object_handlers dom_modern_domimplementation_object_handlers ;
104
+ static zend_object_handlers dom_modern_element_object_handlers ;
104
105
static zend_object_handlers dom_token_list_object_handlers ;
105
106
#ifdef LIBXML_XPATH_ENABLED
106
107
zend_object_handlers dom_xpath_object_handlers ;
@@ -669,6 +670,21 @@ static zend_object *dom_objects_store_clone_obj(zend_object *zobject) /* {{{ */
669
670
}
670
671
/* }}} */
671
672
673
+ static zend_object * dom_modern_element_clone_obj (zend_object * zobject )
674
+ {
675
+ zend_object * clone = dom_objects_store_clone_obj (zobject );
676
+
677
+ /* The $classList property is unique per element, and cached due to its [[SameObject]] requirement.
678
+ * Remove it from the clone so the clone will get a fresh instance upon demand. */
679
+ zval * class_list = dom_element_class_list_zval (php_dom_obj_from_obj (clone ));
680
+ if (!Z_ISUNDEF_P (class_list )) {
681
+ zval_ptr_dtor (class_list );
682
+ ZVAL_UNDEF (class_list );
683
+ }
684
+
685
+ return clone ;
686
+ }
687
+
672
688
static zend_object * dom_object_namespace_node_clone_obj (zend_object * zobject )
673
689
{
674
690
dom_object_namespace_node * intern = php_dom_namespace_node_obj_from_obj (zobject );
@@ -778,6 +794,9 @@ PHP_MINIT_FUNCTION(dom)
778
794
* one instance per parent object. */
779
795
dom_modern_domimplementation_object_handlers .clone_obj = NULL ;
780
796
797
+ memcpy (& dom_modern_element_object_handlers , & dom_object_handlers , sizeof (zend_object_handlers ));
798
+ dom_modern_element_object_handlers .clone_obj = dom_modern_element_clone_obj ;
799
+
781
800
memcpy (& dom_nnodemap_object_handlers , & dom_object_handlers , sizeof (zend_object_handlers ));
782
801
dom_nnodemap_object_handlers .free_obj = dom_nnodemap_objects_free_storage ;
783
802
dom_nnodemap_object_handlers .read_dimension = dom_nodemap_read_dimension ;
@@ -1108,7 +1127,7 @@ PHP_MINIT_FUNCTION(dom)
1108
1127
1109
1128
dom_modern_element_class_entry = register_class_Dom_Element (dom_modern_node_class_entry , dom_modern_parentnode_class_entry , dom_modern_childnode_class_entry );
1110
1129
dom_modern_element_class_entry -> create_object = dom_objects_new ;
1111
- dom_modern_element_class_entry -> default_object_handlers = & dom_object_handlers ;
1130
+ dom_modern_element_class_entry -> default_object_handlers = & dom_modern_element_object_handlers ;
1112
1131
1113
1132
zend_hash_init (& dom_modern_element_prop_handlers , 0 , NULL , NULL , true);
1114
1133
DOM_REGISTER_PROP_HANDLER (& dom_modern_element_prop_handlers , "namespaceURI" , dom_node_namespace_uri_read , NULL );
@@ -1132,7 +1151,7 @@ PHP_MINIT_FUNCTION(dom)
1132
1151
1133
1152
dom_html_element_class_entry = register_class_Dom_HTMLElement (dom_modern_element_class_entry );
1134
1153
dom_html_element_class_entry -> create_object = dom_objects_new ;
1135
- dom_html_element_class_entry -> default_object_handlers = & dom_object_handlers ;
1154
+ dom_html_element_class_entry -> default_object_handlers = & dom_modern_element_object_handlers ;
1136
1155
zend_hash_add_new_ptr (& classes , dom_html_element_class_entry -> name , & dom_modern_element_prop_handlers );
1137
1156
1138
1157
dom_text_class_entry = register_class_DOMText (dom_characterdata_class_entry );
0 commit comments