diff options
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | eval.c | 6 | ||||
-rw-r--r-- | gc.c | 3 | ||||
-rw-r--r-- | parse.y | 2 |
4 files changed, 22 insertions, 2 deletions
@@ -1,3 +1,16 @@ +Thu Jun 29 23:04:36 2006 Yukihiro Matsumoto <matz@ruby-lang.org> + + * parse.y: use ARGSPUSH instead of ARGSCAT to prevent too much + splat expansion. + + * eval.c (when_check): need to handle ARGSPUSH as well. + + * eval.c (block_orphan): lambda and proc from method are always + orphan. + + * gc.c (gc_mark_children): proper marking for NODE_BLOCK_PASS and + NODE_LAMBDA. + Thu Jun 29 22:47:30 2006 Tanaka Akira <akr@m17n.org> * eval.c (SETUP_ARGS0): avoid GC problem. @@ -2711,6 +2711,9 @@ when_check(NODE *tag, VALUE val, VALUE self) case NODE_ARGSCAT: if (when_check(tag->nd_head, val, self)) return Qtrue; return when_check(tag->nd_body, val, self); + case NODE_ARGSPUSH: + if (when_check(tag->nd_head, val, self)) return Qtrue; + if (when_cond(val, rb_eval(self, tag->nd_body))) return Qtrue; default: if (when_cond(val, rb_eval(self, tag))) return Qtrue; break; @@ -8352,6 +8355,9 @@ proc_lambda(void) static int block_orphan(struct BLOCK *data) { + if (data->flags & (BLOCK_LAMBDA|BLOCK_FROM_METHOD)) { + return 1; + } if (data->scope->flags & SCOPE_NOSTACK) { return 1; } @@ -794,7 +794,6 @@ gc_mark_children(VALUE ptr, int lev) case NODE_RESBODY: case NODE_CLASS: case NODE_ARGS: - case NODE_BLOCK_PASS: gc_mark((VALUE)obj->as.node.u2.node, lev); /* fall through */ case NODE_BLOCK: /* 1,3 */ @@ -834,6 +833,8 @@ gc_mark_children(VALUE ptr, int lev) case NODE_MODULE: case NODE_ALIAS: case NODE_VALIAS: + case NODE_BLOCK_PASS: + case NODE_LAMBDA: gc_mark((VALUE)obj->as.node.u1.node, lev); /* fall through */ case NODE_METHOD: /* 2 */ @@ -7291,7 +7291,7 @@ arg_append(NODE *node1, NODE *node2) node1->nd_head = arg_append(node1->nd_head, node2); return node1; default: - return NEW_ARGSCAT(node1, node2); + return NEW_ARGSPUSH(node1, node2); } } |