From: Etienne Kneuss Date: Sun, 24 Aug 2008 18:20:03 +0000 (+0000) Subject: - Fix the order, and avoid overwriting when implementing Serializable X-Git-Tag: BEFORE_HEAD_NS_CHANGE~589 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b48e65f5bf6fea56e9a2c45e25787107abb5b0b9;p=php - Fix the order, and avoid overwriting when implementing Serializable --- diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index ba8b747ad3..728443afcc 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2888,13 +2888,16 @@ ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent } ce->parent = parent_ce; + /* Transfer parent custom callbacks, if any */ + if (!ce->serialize) { + ce->serialize = parent_ce->serialize; + } + if (!ce->unserialize) { + ce->unserialize = parent_ce->unserialize; + } /* Inherit interfaces */ zend_do_inherit_interfaces(ce, parent_ce TSRMLS_CC); - /* Copy serialize/unserialize callbacks */ - ce->serialize = parent_ce->serialize; - ce->unserialize = parent_ce->unserialize; - /* Inherit properties */ zend_hash_merge(&ce->default_properties, &parent_ce->default_properties, (void (*)(void *)) zval_add_ref, NULL, sizeof(zval *), 0); if (parent_ce->type != ce->type) { diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c index 52a7c3bdf6..d821273b65 100755 --- a/Zend/zend_interfaces.c +++ b/Zend/zend_interfaces.c @@ -474,13 +474,17 @@ ZEND_API int zend_user_unserialize(zval **object, zend_class_entry *ce, int type /* {{{ zend_implement_serializable */ static int zend_implement_serializable(zend_class_entry *interface, zend_class_entry *class_type TSRMLS_DC) { - if ((class_type->serialize && class_type->serialize != zend_user_serialize) - || (class_type->unserialize && class_type->unserialize != zend_user_unserialize) - ) { + if (class_type->parent + && (class_type->parent->serialize || class_type->parent->unserialize) + && !instanceof_function_ex(class_type->parent, zend_ce_serializable, 1 TSRMLS_CC)) { return FAILURE; } - class_type->serialize = zend_user_serialize; - class_type->unserialize = zend_user_unserialize; + if (!class_type->serialize) { + class_type->serialize = zend_user_serialize; + } + if (!class_type->unserialize) { + class_type->unserialize = zend_user_unserialize; + } return SUCCESS; } /* }}}*/