]> granicus.if.org Git - php/commitdiff
Fixed GC bug
authorDmitry Stogov <dmitry@php.net>
Fri, 3 Sep 2010 09:27:47 +0000 (09:27 +0000)
committerDmitry Stogov <dmitry@php.net>
Fri, 3 Sep 2010 09:27:47 +0000 (09:27 +0000)
Zend/zend_gc.c

index db04652f09bc2e1a46532a46b134801fd758d2cc..3237768cbc38580dd29e3d165507e8cefa4137cc 100644 (file)
@@ -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);