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