]> granicus.if.org Git - php/commitdiff
- Fix the order, and avoid overwriting when implementing Serializable
authorEtienne Kneuss <colder@php.net>
Sun, 24 Aug 2008 18:20:03 +0000 (18:20 +0000)
committerEtienne Kneuss <colder@php.net>
Sun, 24 Aug 2008 18:20:03 +0000 (18:20 +0000)
Zend/zend_compile.c
Zend/zend_interfaces.c

index ba8b747ad37331659af53a6c938c47f5e94e2cf6..728443afcc7c570664bb383542e87ffee3c59658 100644 (file)
@@ -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) {
index 52a7c3bdf6f64fd3f8d888d977d8b01de1af72e3..d821273b65ad87bbaf2fb6f783373c34de5fbf16 100755 (executable)
@@ -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;
 }
 /* }}}*/