@@ -101,6 +101,7 @@ static zend_object_handlers dom_modern_nodelist_object_handlers;
101101static zend_object_handlers dom_html_collection_object_handlers ;
102102static zend_object_handlers dom_object_namespace_node_handlers ;
103103static zend_object_handlers dom_modern_domimplementation_object_handlers ;
104+ static zend_object_handlers dom_modern_element_object_handlers ;
104105static zend_object_handlers dom_token_list_object_handlers ;
105106#ifdef LIBXML_XPATH_ENABLED
106107zend_object_handlers dom_xpath_object_handlers ;
@@ -669,6 +670,21 @@ static zend_object *dom_objects_store_clone_obj(zend_object *zobject) /* {{{ */
669670}
670671/* }}} */
671672
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+
672688static zend_object * dom_object_namespace_node_clone_obj (zend_object * zobject )
673689{
674690 dom_object_namespace_node * intern = php_dom_namespace_node_obj_from_obj (zobject );
@@ -778,6 +794,9 @@ PHP_MINIT_FUNCTION(dom)
778794 * one instance per parent object. */
779795 dom_modern_domimplementation_object_handlers .clone_obj = NULL ;
780796
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+
781800 memcpy (& dom_nnodemap_object_handlers , & dom_object_handlers , sizeof (zend_object_handlers ));
782801 dom_nnodemap_object_handlers .free_obj = dom_nnodemap_objects_free_storage ;
783802 dom_nnodemap_object_handlers .read_dimension = dom_nodemap_read_dimension ;
@@ -1108,7 +1127,7 @@ PHP_MINIT_FUNCTION(dom)
11081127
11091128 dom_modern_element_class_entry = register_class_Dom_Element (dom_modern_node_class_entry , dom_modern_parentnode_class_entry , dom_modern_childnode_class_entry );
11101129 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 ;
11121131
11131132 zend_hash_init (& dom_modern_element_prop_handlers , 0 , NULL , NULL , true);
11141133 DOM_REGISTER_PROP_HANDLER (& dom_modern_element_prop_handlers , "namespaceURI" , dom_node_namespace_uri_read , NULL );
@@ -1132,7 +1151,7 @@ PHP_MINIT_FUNCTION(dom)
11321151
11331152 dom_html_element_class_entry = register_class_Dom_HTMLElement (dom_modern_element_class_entry );
11341153 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 ;
11361155 zend_hash_add_new_ptr (& classes , dom_html_element_class_entry -> name , & dom_modern_element_prop_handlers );
11371156
11381157 dom_text_class_entry = register_class_DOMText (dom_characterdata_class_entry );
0 commit comments