From c7b95db5ab8e56f708e96611849b7d74a36e0699 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 3 Sep 2010 09:27:47 +0000 Subject: [PATCH] Fixed GC bug --- Zend/zend_gc.c | 42 +++++++++++++++++++++++------------------- 1 files changed, 23 insertions(+), 19 deletions(-) diff --git a/Zend/zend_gc.c b/Zend/zend_gc.c index db04652..3237768 100644 --- a/Zend/zend_gc.c +++ b/Zend/zend_gc.c @@ -414,19 +414,21 @@ static void gc_mark_roots(TSRMLS_D) gc_root_buffer *current = GC_G(roots).next; while (current != &GC_G(roots)) { - if (current->handle && EG(objects_store).object_buckets) { - struct _store_object *obj = &EG(objects_store).object_buckets[current->handle].bucket.obj; + if (current->handle) { + if (EG(objects_store).object_buckets) { + struct _store_object *obj = &EG(objects_store).object_buckets[current->handle].bucket.obj; - if (GC_GET_COLOR(obj->buffered) == GC_PURPLE) { - zval z; + if (GC_GET_COLOR(obj->buffered) == GC_PURPLE) { + zval z; - INIT_PZVAL(&z); - Z_OBJ_HANDLE(z) = current->handle; - Z_OBJ_HT(z) = current->u.handlers; - zobj_mark_grey(obj, &z TSRMLS_CC); - } else { - GC_SET_ADDRESS(obj->buffered, NULL); - GC_REMOVE_FROM_BUFFER(current); + INIT_PZVAL(&z); + Z_OBJ_HANDLE(z) = current->handle; + Z_OBJ_HT(z) = current->u.handlers; + zobj_mark_grey(obj, &z TSRMLS_CC); + } else { + GC_SET_ADDRESS(obj->buffered, NULL); + GC_REMOVE_FROM_BUFFER(current); + } } } else { if (GC_ZVAL_GET_COLOR(current->u.pz) == GC_PURPLE) { @@ -623,15 +625,17 @@ static void gc_collect_roots(TSRMLS_D) gc_root_buffer *current = GC_G(roots).next; while (current != &GC_G(roots)) { - if (current->handle && EG(objects_store).object_buckets) { - struct _store_object *obj = &EG(objects_store).object_buckets[current->handle].bucket.obj; - zval z; + if (current->handle) { + if (EG(objects_store).object_buckets) { + struct _store_object *obj = &EG(objects_store).object_buckets[current->handle].bucket.obj; + zval z; - GC_SET_ADDRESS(obj->buffered, NULL); - INIT_PZVAL(&z); - Z_OBJ_HANDLE(z) = current->handle; - Z_OBJ_HT(z) = current->u.handlers; - zobj_collect_white(&z TSRMLS_CC); + GC_SET_ADDRESS(obj->buffered, NULL); + INIT_PZVAL(&z); + Z_OBJ_HANDLE(z) = current->handle; + Z_OBJ_HT(z) = current->u.handlers; + zobj_collect_white(&z TSRMLS_CC); + } } else { GC_ZVAL_SET_ADDRESS(current->u.pz, NULL); zval_collect_white(current->u.pz TSRMLS_CC); -- 1.7.8