Fixed GC bug

This commit is contained in:
Dmitry Stogov 2010-09-03 09:27:47 +00:00
parent d1f40f7439
commit 88bf6d2e16

View file

@ -414,19 +414,21 @@ static void gc_mark_roots(TSRMLS_D)
gc_root_buffer *current = GC_G(roots).next; gc_root_buffer *current = GC_G(roots).next;
while (current != &GC_G(roots)) { while (current != &GC_G(roots)) {
if (current->handle && EG(objects_store).object_buckets) { if (current->handle) {
struct _store_object *obj = &EG(objects_store).object_buckets[current->handle].bucket.obj; 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) { if (GC_GET_COLOR(obj->buffered) == GC_PURPLE) {
zval z; zval z;
INIT_PZVAL(&z); INIT_PZVAL(&z);
Z_OBJ_HANDLE(z) = current->handle; Z_OBJ_HANDLE(z) = current->handle;
Z_OBJ_HT(z) = current->u.handlers; Z_OBJ_HT(z) = current->u.handlers;
zobj_mark_grey(obj, &z TSRMLS_CC); zobj_mark_grey(obj, &z TSRMLS_CC);
} else { } else {
GC_SET_ADDRESS(obj->buffered, NULL); GC_SET_ADDRESS(obj->buffered, NULL);
GC_REMOVE_FROM_BUFFER(current); GC_REMOVE_FROM_BUFFER(current);
}
} }
} else { } else {
if (GC_ZVAL_GET_COLOR(current->u.pz) == GC_PURPLE) { 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; gc_root_buffer *current = GC_G(roots).next;
while (current != &GC_G(roots)) { while (current != &GC_G(roots)) {
if (current->handle && EG(objects_store).object_buckets) { if (current->handle) {
struct _store_object *obj = &EG(objects_store).object_buckets[current->handle].bucket.obj; if (EG(objects_store).object_buckets) {
zval z; struct _store_object *obj = &EG(objects_store).object_buckets[current->handle].bucket.obj;
zval z;
GC_SET_ADDRESS(obj->buffered, NULL); GC_SET_ADDRESS(obj->buffered, NULL);
INIT_PZVAL(&z); INIT_PZVAL(&z);
Z_OBJ_HANDLE(z) = current->handle; Z_OBJ_HANDLE(z) = current->handle;
Z_OBJ_HT(z) = current->u.handlers; Z_OBJ_HT(z) = current->u.handlers;
zobj_collect_white(&z TSRMLS_CC); zobj_collect_white(&z TSRMLS_CC);
}
} else { } else {
GC_ZVAL_SET_ADDRESS(current->u.pz, NULL); GC_ZVAL_SET_ADDRESS(current->u.pz, NULL);
zval_collect_white(current->u.pz TSRMLS_CC); zval_collect_white(current->u.pz TSRMLS_CC);