cvs: ZendEngine2(PHP_5_3) / zend_gc.c zend_objects.c zend_objects_API.c zend_objects_API.h

[email protected] ("Marcus Boerger")
Newsgroups php.zend-engine.cvs
Message-ID <cvshelly1219596560@cvsserver>
helly		Sun Aug 24 16:49:20 2008 UTC

  Modified files:              (Branch: PHP_5_3)
    /ZendEngine2	zend_objects_API.c zend_objects_API.h zend_objects.c 
                	zend_gc.c 
  Log:
  - MFH Fix issue with destruction of overloaded objects
  
  
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_objects_API.c?r1=1.47.2.6.2.6.2.6&r2=1.47.2.6.2.6.2.7&diff_format=u
Index: ZendEngine2/zend_objects_API.c
diff -u ZendEngine2/zend_objects_API.c:1.47.2.6.2.6.2.6 ZendEngine2/zend_objects_API.c:1.47.2.6.2.6.2.7
--- ZendEngine2/zend_objects_API.c:1.47.2.6.2.6.2.6	Tue Aug 12 17:20:24 2008
+++ ZendEngine2/zend_objects_API.c	Sun Aug 24 16:49:19 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_objects_API.c,v 1.47.2.6.2.6.2.6 2008/08/12 17:20:24 felipe Exp $ */
+/* $Id: zend_objects_API.c,v 1.47.2.6.2.6.2.7 2008/08/24 16:49:19 helly Exp $ */
 
 #include "zend.h"
 #include "zend_globals.h"
@@ -122,8 +122,8 @@
 	obj->object = object;
 	obj->dtor = dtor?dtor:(zend_objects_store_dtor_t)zend_objects_destroy_object;
 	obj->free_storage = free_storage;
-
 	obj->clone = clone;
+	obj->handlers = NULL;
 
 #if ZEND_DEBUG_OBJECTS
 	fprintf(stderr, "Allocated object id #%d\n", handle);
@@ -168,7 +168,7 @@
 	handle = Z_OBJ_HANDLE_P(zobject);
 
 	Z_ADDREF_P(zobject);
-	zend_objects_store_del_ref_by_handle(handle TSRMLS_CC);
+	zend_objects_store_del_ref_by_handle_ex(handle, Z_OBJ_HT_P(zobject) TSRMLS_CC);
 	Z_DELREF_P(zobject);
 
 	GC_ZOBJ_CHECK_POSSIBLE_ROOT(zobject);
@@ -177,7 +177,7 @@
 /*
  * Delete a reference to an objects store entry given the object handle.
  */
-ZEND_API void zend_objects_store_del_ref_by_handle(zend_object_handle handle TSRMLS_DC)
+ZEND_API void zend_objects_store_del_ref_by_handle_ex(zend_object_handle handle, const zend_object_handlers *handlers TSRMLS_DC) /* {{{ */
 {
 	struct _store_object *obj;
 	int failure = 0;
@@ -198,6 +198,9 @@
 				EG(objects_store).object_buckets[handle].destructor_called = 1;
 
 				if (obj->dtor) {
+					if (handlers && !obj->handlers) {
+						obj->handlers = handlers;
+					}
 					zend_try {
 						obj->dtor(obj->object, handle TSRMLS_CC);
 					} zend_catch {
@@ -232,6 +235,7 @@
 		zend_bailout();
 	}
 }
+/* }}} */
 
 ZEND_API zend_object_value zend_objects_store_clone_obj(zval *zobject TSRMLS_DC)
 {
@@ -250,6 +254,7 @@
 
 	retval.handle = zend_objects_store_put(new_object, obj->dtor, obj->free_storage, obj->clone TSRMLS_CC);
 	retval.handlers = Z_OBJ_HT_P(zobject);
+	EG(objects_store).object_buckets[handle].bucket.obj.handlers = retval.handlers;
 
 	return retval;
 }
@@ -288,8 +293,10 @@
 ZEND_API void zend_object_store_ctor_failed(zval *zobject TSRMLS_DC)
 {
 	zend_object_handle handle = Z_OBJ_HANDLE_P(zobject);
-
-	EG(objects_store).object_buckets[handle].destructor_called = 1;
+	zend_object_store_bucket *obj_bucket = &EG(objects_store).object_buckets[handle];
+	
+	obj_bucket->bucket.obj.handlers = Z_OBJ_HT_P(zobject);;
+	obj_bucket->destructor_called = 1;
 }
 
 
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_objects_API.h?r1=1.20.2.1.2.4.2.3&r2=1.20.2.1.2.4.2.4&diff_format=u
Index: ZendEngine2/zend_objects_API.h
diff -u ZendEngine2/zend_objects_API.h:1.20.2.1.2.4.2.3 ZendEngine2/zend_objects_API.h:1.20.2.1.2.4.2.4
--- ZendEngine2/zend_objects_API.h:1.20.2.1.2.4.2.3	Tue Aug 12 17:20:24 2008
+++ ZendEngine2/zend_objects_API.h	Sun Aug 24 16:49:19 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_objects_API.h,v 1.20.2.1.2.4.2.3 2008/08/12 17:20:24 felipe Exp $ */
+/* $Id: zend_objects_API.h,v 1.20.2.1.2.4.2.4 2008/08/24 16:49:19 helly Exp $ */
 
 #ifndef ZEND_OBJECTS_API_H
 #define ZEND_OBJECTS_API_H
@@ -37,6 +37,7 @@
 			zend_objects_store_dtor_t dtor;
 			zend_objects_free_object_storage_t free_storage;
 			zend_objects_store_clone_t clone;
+			const zend_object_handlers *handlers;
 			zend_uint refcount;
 			gc_root_buffer *buffered;
 		} obj;
@@ -66,7 +67,10 @@
 ZEND_API void zend_objects_store_add_ref(zval *object TSRMLS_DC);
 ZEND_API void zend_objects_store_del_ref(zval *object TSRMLS_DC);
 ZEND_API void zend_objects_store_add_ref_by_handle(zend_object_handle handle TSRMLS_DC);
-ZEND_API void zend_objects_store_del_ref_by_handle(zend_object_handle handle TSRMLS_DC);
+ZEND_API void zend_objects_store_del_ref_by_handle_ex(zend_object_handle handle, const zend_object_handlers *handlers TSRMLS_DC);
+static inline void zend_objects_store_del_ref_by_handle(zend_object_handle handle TSRMLS_DC) {
+	zend_objects_store_del_ref_by_handle_ex(handle, NULL TSRMLS_CC);
+}
 ZEND_API zend_uint zend_objects_store_get_refcount(zval *object TSRMLS_DC);
 ZEND_API zend_object_value zend_objects_store_clone_obj(zval *object TSRMLS_DC);
 ZEND_API void *zend_object_store_get_object(const zval *object TSRMLS_DC);
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_objects.c?r1=1.56.2.3.2.6.2.6&r2=1.56.2.3.2.6.2.7&diff_format=u
Index: ZendEngine2/zend_objects.c
diff -u ZendEngine2/zend_objects.c:1.56.2.3.2.6.2.6 ZendEngine2/zend_objects.c:1.56.2.3.2.6.2.7
--- ZendEngine2/zend_objects.c:1.56.2.3.2.6.2.6	Thu Aug 14 10:24:51 2008
+++ ZendEngine2/zend_objects.c	Sun Aug 24 16:49:19 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_objects.c,v 1.56.2.3.2.6.2.6 2008/08/14 10:24:51 helly Exp $ */
+/* $Id: zend_objects.c,v 1.56.2.3.2.6.2.7 2008/08/24 16:49:19 helly Exp $ */
 
 #include "zend.h"
 #include "zend_globals.h"
@@ -53,6 +53,7 @@
 
 	if (destructor) {
 		zval *obj;
+		zend_object_store_bucket *obj_bucket;
 
 		if (destructor->op_array.fn_flags & (ZEND_ACC_PRIVATE|ZEND_ACC_PROTECTED)) {
 			if (destructor->op_array.fn_flags & ZEND_ACC_PRIVATE) {
@@ -87,8 +88,11 @@
 		MAKE_STD_ZVAL(obj);
 		Z_TYPE_P(obj) = IS_OBJECT;
 		Z_OBJ_HANDLE_P(obj) = handle;
-		/* TODO: We cannot set proper handlers. */
-		Z_OBJ_HT_P(obj) = &std_object_handlers; 
+		obj_bucket = &EG(objects_store).object_buckets[handle];
+		if (!obj_bucket->bucket.obj.handlers) {
+			obj_bucket->bucket.obj.handlers = &std_object_handlers;
+		}
+		Z_OBJ_HT_P(obj) = obj_bucket->bucket.obj.handlers;
 		zval_copy_ctor(obj);
 
 		/* Make sure that destructors are protected from previously thrown exceptions.
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_gc.c?r1=1.1.2.16&r2=1.1.2.17&diff_format=u
Index: ZendEngine2/zend_gc.c
diff -u ZendEngine2/zend_gc.c:1.1.2.16 ZendEngine2/zend_gc.c:1.1.2.17
--- ZendEngine2/zend_gc.c:1.1.2.16	Fri Aug 15 19:47:24 2008
+++ ZendEngine2/zend_gc.c	Sun Aug 24 16:49:19 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_gc.c,v 1.1.2.16 2008/08/15 19:47:24 felipe Exp $ */
+/* $Id: zend_gc.c,v 1.1.2.17 2008/08/24 16:49:19 helly Exp $ */
 
 #include "zend.h"
 #include "zend_API.h"
@@ -575,7 +575,7 @@
 					EG(objects_store).object_buckets[Z_OBJ_HANDLE(p->z)].bucket.obj.refcount <= 0) {
 					EG(objects_store).object_buckets[Z_OBJ_HANDLE(p->z)].bucket.obj.refcount = 1;
 					Z_TYPE(p->z) = IS_NULL;
-					zend_objects_store_del_ref_by_handle(Z_OBJ_HANDLE(p->z) TSRMLS_CC);
+					zend_objects_store_del_ref_by_handle_ex(Z_OBJ_HANDLE(p->z), Z_OBJ_HT(p->z) TSRMLS_CC);
 				}
 			} else if (Z_TYPE(p->z) == IS_ARRAY) {
 				Z_TYPE(p->z) = IS_NULL;
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.