cvs: ZendEngine2(PHP_5_3) / zend_compile.c zend_interfaces.c zend_interfaces.h

[email protected] ("Etienne Kneuss")
Newsgroups php.zend-engine.cvs
Message-ID <cvscolder1219602153@cvsserver>
colder		Sun Aug 24 18:22:33 2008 UTC

  Modified files:              (Branch: PHP_5_3)
    /ZendEngine2	zend_compile.c zend_interfaces.c zend_interfaces.h 
  Log:
  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
  
  
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_compile.c?r1=1.647.2.27.2.41.2.83&r2=1.647.2.27.2.41.2.84&diff_format=u
Index: ZendEngine2/zend_compile.c
diff -u ZendEngine2/zend_compile.c:1.647.2.27.2.41.2.83 ZendEngine2/zend_compile.c:1.647.2.27.2.41.2.84
--- ZendEngine2/zend_compile.c:1.647.2.27.2.41.2.83	Fri Aug 22 15:54:20 2008
+++ ZendEngine2/zend_compile.c	Sun Aug 24 18:22:33 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_compile.c,v 1.647.2.27.2.41.2.83 2008/08/22 15:54:20 felipe Exp $ */
+/* $Id: zend_compile.c,v 1.647.2.27.2.41.2.84 2008/08/24 18:22:33 colder Exp $ */
 
 #include <zend_language_parser.h>
 #include "zend.h"
@@ -2780,6 +2780,14 @@
 	}
 
 	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);
 
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_interfaces.c?r1=1.33.2.4.2.6.2.5&r2=1.33.2.4.2.6.2.6&diff_format=u
Index: ZendEngine2/zend_interfaces.c
diff -u ZendEngine2/zend_interfaces.c:1.33.2.4.2.6.2.5 ZendEngine2/zend_interfaces.c:1.33.2.4.2.6.2.6
--- ZendEngine2/zend_interfaces.c:1.33.2.4.2.6.2.5	Thu Jul 24 09:42:15 2008
+++ ZendEngine2/zend_interfaces.c	Sun Aug 24 18:22:33 2008
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_interfaces.c,v 1.33.2.4.2.6.2.5 2008/07/24 09:42:15 dmitry Exp $ */
+/* $Id: zend_interfaces.c,v 1.33.2.4.2.6.2.6 2008/08/24 18:22:33 colder Exp $ */
 
 #include "zend.h"
 #include "zend_API.h"
@@ -405,7 +405,7 @@
 /* }}}*/
 
 /* {{{ 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 @@
 /* }}} */
 
 /* {{{ 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 @@
 /* {{{ 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;
 }
 /* }}}*/
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_interfaces.h?r1=1.11.2.1.2.2.2.1&r2=1.11.2.1.2.2.2.2&diff_format=u
Index: ZendEngine2/zend_interfaces.h
diff -u ZendEngine2/zend_interfaces.h:1.11.2.1.2.2.2.1 ZendEngine2/zend_interfaces.h:1.11.2.1.2.2.2.2
--- ZendEngine2/zend_interfaces.h:1.11.2.1.2.2.2.1	Mon Dec 31 07:17:04 2007
+++ ZendEngine2/zend_interfaces.h	Sun Aug 24 18:22:33 2008
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_interfaces.h,v 1.11.2.1.2.2.2.1 2007/12/31 07:17:04 sebastian Exp $ */
+/* $Id: zend_interfaces.h,v 1.11.2.1.2.2.2.2 2008/08/24 18:22:33 colder Exp $ */
 
 #ifndef ZEND_INTERFACES_H
 #define ZEND_INTERFACES_H
@@ -61,6 +61,9 @@
 
 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 */
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.