From cc9a8ee528a4d25240a1d3971a34431358c57119 Mon Sep 17 00:00:00 2001 From: Etienne Kneuss Date: Sun, 24 Aug 2008 18:22:33 +0000 Subject: [PATCH] MFH: - Copy custom callback to the child class if any - Prevent overwriting valid parent callbacks when implementing Serializable - Export zend_user_(un)serialize to be available for custom callbacks --- Zend/zend_compile.c | 8 ++++++++ Zend/zend_interfaces.c | 18 +++++++++++------- Zend/zend_interfaces.h | 3 +++ 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 3cbd55b875..fa87fe8f33 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2780,6 +2780,14 @@ ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent } ce->parent = parent_ce; + /* Copy serialize/unserialize callbacks */ + 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); diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c index f4cf8f0421..a1e82a1978 100755 --- a/Zend/zend_interfaces.c +++ b/Zend/zend_interfaces.c @@ -405,7 +405,7 @@ static int zend_implement_arrayaccess(zend_class_entry *interface, zend_class_en /* }}}*/ /* {{{ zend_user_serialize */ -int zend_user_serialize(zval *object, unsigned char **buffer, zend_uint *buf_len, zend_serialize_data *data TSRMLS_DC) +ZEND_API int zend_user_serialize(zval *object, unsigned char **buffer, zend_uint *buf_len, zend_serialize_data *data TSRMLS_DC) { zend_class_entry * ce = Z_OBJCE_P(object); zval *retval; @@ -442,7 +442,7 @@ int zend_user_serialize(zval *object, unsigned char **buffer, zend_uint *buf_len /* }}} */ /* {{{ zend_user_unserialize */ -int zend_user_unserialize(zval **object, zend_class_entry *ce, const unsigned char *buf, zend_uint buf_len, zend_unserialize_data *data TSRMLS_DC) +ZEND_API int zend_user_unserialize(zval **object, zend_class_entry *ce, const unsigned char *buf, zend_uint buf_len, zend_unserialize_data *data TSRMLS_DC) { zval * zdata; @@ -466,13 +466,17 @@ int zend_user_unserialize(zval **object, zend_class_entry *ce, const unsigned ch /* {{{ 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; } /* }}}*/ diff --git a/Zend/zend_interfaces.h b/Zend/zend_interfaces.h index c498666d7a..4d9e417791 100755 --- a/Zend/zend_interfaces.h +++ b/Zend/zend_interfaces.h @@ -61,6 +61,9 @@ ZEND_API zend_object_iterator *zend_user_it_get_new_iterator(zend_class_entry *c ZEND_API void zend_register_interfaces(TSRMLS_D); +ZEND_API int zend_user_serialize(zval *object, unsigned char **buffer, zend_uint *buf_len, zend_serialize_data *data TSRMLS_DC); +ZEND_API int zend_user_unserialize(zval **object, zend_class_entry *ce, const unsigned char *buf, zend_uint buf_len, zend_unserialize_data *data TSRMLS_DC); + END_EXTERN_C() #endif /* ZEND_INTERFACES_H */ -- 2.40.0