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

Reply via email to