ze1_compatibility_mode when set on calls clone on objects implicitly and is causing some issues with extensions such as dom and xsl to name a few. Is it possible to add something like the contained patch, which would allow an object to implement an additional clone handler used only when the clone call is from the engine's ze1_compatibility_mode calls?
i.e. the objects ze1 clone handler would be something like: zend_object_value dom_objects_ze1_clone_obj(zval *zobject TSRMLS_DC) { zend_objects_store_add_ref(zobject TSRMLS_CC); return zobject->value.obj; } so that a reference is returned rather than really cloning the internal object as a real clone is not desireable here unless the developer explicitly calls clone $obj. Rob
Index: zend_execute.c =================================================================== RCS file: /repository/ZendEngine2/zend_execute.c,v retrieving revision 1.669 diff -r1.669 zend_execute.c 433c433 < if (Z_OBJ_HANDLER_P(value, clone_obj) == NULL) { --- > if (Z_OBJ_HANDLER_P(value, clone_obj) == NULL && > Z_OBJ_HANDLER_P(value, ze1_clone_obj) == NULL) { 436,437c436,441 < zend_error(E_STRICT, "Implicit cloning object of class '%s' because of 'zend.ze1_compatibility_mode'", Z_OBJCE_P(orig_value)->name); < value->value.obj = Z_OBJ_HANDLER_P(orig_value, clone_obj)(orig_value TSRMLS_CC); --- > zend_error(E_STRICT, "Implicit cloning object of class '%s' because of > 'zend.ze1_compatibility_mode'", Z_OBJCE_P(orig_value)->name); > if (Z_OBJ_HANDLER_P(value, ze1_clone_obj) != NULL) { > value->value.obj = Z_OBJ_HANDLER_P(orig_value, > ze1_clone_obj)(orig_value TSRMLS_CC); > } else { > value->value.obj = Z_OBJ_HANDLER_P(orig_value, > clone_obj)(orig_value TSRMLS_CC); > } 607c611 < if (Z_OBJ_HANDLER_P(value, clone_obj) == NULL) { --- > if (Z_OBJ_HANDLER_P(value, clone_obj) == NULL && > Z_OBJ_HANDLER_P(value, ze1_clone_obj) == NULL) { 622c626,630 < variable_ptr->value.obj = Z_OBJ_HANDLER_P(value, clone_obj)(value TSRMLS_CC); --- > if (Z_OBJ_HANDLER_P(value, ze1_clone_obj) != NULL) { > variable_ptr->value.obj = > Z_OBJ_HANDLER_P(value, ze1_clone_obj)(value TSRMLS_CC); > } else { > variable_ptr->value.obj = > Z_OBJ_HANDLER_P(value, clone_obj)(value TSRMLS_CC); > } 639c647,651 < variable_ptr->value.obj = Z_OBJ_HANDLER_P(value, clone_obj)(value TSRMLS_CC); --- > if (Z_OBJ_HANDLER_P(value, ze1_clone_obj) != NULL) { > variable_ptr->value.obj = Z_OBJ_HANDLER_P(value, > ze1_clone_obj)(value TSRMLS_CC); > } else { > variable_ptr->value.obj = Z_OBJ_HANDLER_P(value, > clone_obj)(value TSRMLS_CC); > } 3162c3174 < if (Z_OBJ_HT_P(retval_ptr)->clone_obj == NULL) { --- > if (Z_OBJ_HT_P(retval_ptr)->clone_obj == NULL && > Z_OBJ_HT_P(retval_ptr)->ze1_clone_obj == NULL) { 3166c3178,3182 < (*EG(return_value_ptr_ptr))->value.obj = Z_OBJ_HT_P(retval_ptr)->clone_obj(retval_ptr TSRMLS_CC); --- > if (Z_OBJ_HT_P(retval_ptr)->ze1_clone_obj != NULL) { > (*EG(return_value_ptr_ptr))->value.obj = > Z_OBJ_HT_P(retval_ptr)->ze1_clone_obj(retval_ptr TSRMLS_CC); > } else { > (*EG(return_value_ptr_ptr))->value.obj = > Z_OBJ_HT_P(retval_ptr)->clone_obj(retval_ptr TSRMLS_CC); > } Index: zend_object_handlers.c =================================================================== RCS file: /repository/ZendEngine2/zend_object_handlers.c,v retrieving revision 1.104 diff -r1.104 zend_object_handlers.c 981a982 > NULL, /* > ze1_clone_obj */ Index: zend_object_handlers.h =================================================================== RCS file: /repository/ZendEngine2/zend_object_handlers.h,v retrieving revision 1.41 diff -r1.41 zend_object_handlers.h 89a90 > typedef zend_object_value (*zend_object_ze1_clone_obj_t)(zval *object TSRMLS_DC); 125a127 > zend_object_ze1_clone_obj_t ze1_clone_obj;
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php