summaryrefslogtreecommitdiff
path: root/Zend/zend_interfaces.c
diff options
context:
space:
mode:
authorEtienne Kneuss <colder@php.net>2008-08-24 18:22:33 +0000
committerEtienne Kneuss <colder@php.net>2008-08-24 18:22:33 +0000
commitcc9a8ee528a4d25240a1d3971a34431358c57119 (patch)
tree60520fe9045839ab9f534732e1a96c86ab5b2549 /Zend/zend_interfaces.c
parentce2f9bb0cf96fbb2aad317d8c9b6d947165ab02c (diff)
downloadphp-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-xZend/zend_interfaces.c18
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;
}
/* }}}*/