mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* 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. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@10431 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
d7ac2f0cd2
commit
4df2cb8053
4 changed files with 22 additions and 2 deletions
13
ChangeLog
13
ChangeLog
|
@ -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.
|
||||
|
|
6
eval.c
6
eval.c
|
@ -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;
|
||||
}
|
||||
|
|
3
gc.c
3
gc.c
|
@ -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 */
|
||||
|
|
2
parse.y
2
parse.y
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue