diff options
| author | Etienne Kneuss <colder@php.net> | 2008-08-24 18:22:33 +0000 |
|---|---|---|
| committer | Etienne Kneuss <colder@php.net> | 2008-08-24 18:22:33 +0000 |
| commit | cc9a8ee528a4d25240a1d3971a34431358c57119 (patch) | |
| tree | 60520fe9045839ab9f534732e1a96c86ab5b2549 /Zend/zend_interfaces.c | |
| parent | ce2f9bb0cf96fbb2aad317d8c9b6d947165ab02c (diff) | |
| download | php-git-cc9a8ee528a4d25240a1d3971a34431358c57119.tar.gz | |
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
Diffstat (limited to 'Zend/zend_interfaces.c')
| -rwxr-xr-x | Zend/zend_interfaces.c | 18 |
1 files changed, 11 insertions, 7 deletions
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; } /* }}}*/ |
