@@ -99,6 +99,7 @@ static zend_object_handlers dom_modern_nodelist_object_handlers;
9999static zend_object_handlers dom_html_collection_object_handlers ;
100100static zend_object_handlers dom_object_namespace_node_handlers ;
101101static zend_object_handlers dom_modern_domimplementation_object_handlers ;
102+ static zend_object_handlers dom_modern_element_object_handlers ;
102103static zend_object_handlers dom_token_list_object_handlers ;
103104#ifdef LIBXML_XPATH_ENABLED
104105zend_object_handlers dom_xpath_object_handlers ;
@@ -662,6 +663,21 @@ static zend_object *dom_objects_store_clone_obj(zend_object *zobject) /* {{{ */
662663}
663664/* }}} */
664665
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+
665681static zend_object * dom_object_namespace_node_clone_obj (zend_object * zobject )
666682{
667683 dom_object_namespace_node * intern = php_dom_namespace_node_obj_from_obj (zobject );
@@ -756,6 +772,9 @@ PHP_MINIT_FUNCTION(dom)
756772 * one instance per parent object. */
757773 dom_modern_domimplementation_object_handlers .clone_obj = NULL ;
758774
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+
759778 memcpy (& dom_nnodemap_object_handlers , & dom_object_handlers , sizeof (zend_object_handlers ));
760779 dom_nnodemap_object_handlers .free_obj = dom_nnodemap_objects_free_storage ;
761780 dom_nnodemap_object_handlers .read_dimension = dom_nodemap_read_dimension ;
@@ -1086,7 +1105,7 @@ PHP_MINIT_FUNCTION(dom)
10861105
10871106 dom_modern_element_class_entry = register_class_Dom_Element (dom_modern_node_class_entry , dom_modern_parentnode_class_entry , dom_modern_childnode_class_entry );
10881107 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 ;
10901109
10911110 zend_hash_init (& dom_modern_element_prop_handlers , 0 , NULL , NULL , true);
10921111 DOM_REGISTER_PROP_HANDLER (& dom_modern_element_prop_handlers , "namespaceURI" , dom_node_namespace_uri_read , NULL );
@@ -1111,7 +1130,7 @@ PHP_MINIT_FUNCTION(dom)
11111130
11121131 dom_html_element_class_entry = register_class_Dom_HTMLElement (dom_modern_element_class_entry );
11131132 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 ;
11151134 zend_hash_add_new_ptr (& classes , dom_html_element_class_entry -> name , & dom_modern_element_prop_handlers );
11161135
11171136 dom_text_class_entry = register_class_DOMText (dom_characterdata_class_entry );
0 commit comments