diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1999-01-11 07:55:27 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1999-01-11 07:55:27 +0000 |
commit | a9c4c9041bd8ee877e062f93496a03d3c767d6e4 (patch) | |
tree | be7e553d1463426a284ad8c0588e9e717cfcf7b5 /gc.c | |
parent | fb1369446bbe1f53f4144ba12f76b89f1a542835 (diff) |
1.2.1 stable
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/v1_1r@362 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 26 |
1 files changed, 16 insertions, 10 deletions
@@ -592,10 +592,10 @@ gc_sweep() { RVALUE *p, *pend; int freed = 0; - int i; + int i, used = heaps_used; if (rb_in_compile) { - for (i = 0; i < heaps_used; i++) { + for (i = 0; i < used; i++) { p = heaps[i]; pend = p + HEAP_SLOTS; while (p < pend) { if (!(p->as.basic.flags&FL_MARK) && BUILTIN_TYPE(p) == T_NODE) @@ -606,19 +606,17 @@ gc_sweep() } freelist = 0; - for (i = 0; i < heaps_used; i++) { - RVALUE *nfreelist; + for (i = 0; i < used; i++) { int n = 0; - nfreelist = freelist; p = heaps[i]; pend = p + HEAP_SLOTS; while (p < pend) { if (!(p->as.basic.flags & FL_MARK)) { if (p->as.basic.flags) obj_free((VALUE)p); p->as.free.flag = 0; - p->as.free.next = nfreelist; - nfreelist = p; + p->as.free.next = freelist; + freelist = p; n++; } else @@ -626,7 +624,6 @@ gc_sweep() p++; } freed += n; - freelist = nfreelist; } alloc_objects = 0; if (freed < FREE_MIN) { @@ -725,8 +722,17 @@ obj_free(obj) if (RANY(obj)->as.bignum.digits) free(RANY(obj)->as.bignum.digits); break; case T_NODE: - if (nd_type(obj) == NODE_SCOPE && RANY(obj)->as.node.u1.tbl) { - free(RANY(obj)->as.node.u1.tbl); + switch (nd_type(obj)) { + case NODE_SCOPE: + if (RANY(obj)->as.node.u1.tbl) { + free(RANY(obj)->as.node.u1.tbl); + } + break; +#ifdef C_ALLOCA + case NODE_ALLOCA: + free(RANY(obj)->as.node.u1.value); + break; +#endif } return; /* no need to free iv_tbl */ |