* eval.c (rb_eval): NODE_OP_ASGN1 should allow splat in its
argument list. [ruby-core:07366] * parse.y (arg): avoid unnecessary extra argument. [ruby-core:07366] * eval.c (rb_eval): honor visibility on OP_ASGN1 and OP_ASGN2. [ruby-core:07366] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9941 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
a95a1eff20
commit
8f5278b525
11
ChangeLog
11
ChangeLog
@ -1,3 +1,14 @@
|
|||||||
|
Wed Feb 15 16:52:52 2006 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
|
* eval.c (rb_eval): NODE_OP_ASGN1 should allow splat in its
|
||||||
|
argument list. [ruby-core:07366]
|
||||||
|
|
||||||
|
* parse.y (arg): avoid unnecessary extra argument.
|
||||||
|
[ruby-core:07366]
|
||||||
|
|
||||||
|
* eval.c (rb_eval): honor visibility on OP_ASGN1 and
|
||||||
|
OP_ASGN2. [ruby-core:07366]
|
||||||
|
|
||||||
Wed Feb 15 15:20:23 2006 Yukihiro Matsumoto <matz@ruby-lang.org>
|
Wed Feb 15 15:20:23 2006 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
* eval.c (error_line): remove void control path. [ruby-dev:28335]
|
* eval.c (error_line): remove void control path. [ruby-dev:28335]
|
||||||
|
27
eval.c
27
eval.c
@ -2124,7 +2124,7 @@ copy_node_scope(NODE *node, NODE *rval)
|
|||||||
# define TMP_ALLOC(n) ALLOCA_N(VALUE,n)
|
# define TMP_ALLOC(n) ALLOCA_N(VALUE,n)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define SETUP_ARGS0(anode,alen) do {\
|
#define SETUP_ARGS0(anode,alen,extra) do {\
|
||||||
NODE *n = anode;\
|
NODE *n = anode;\
|
||||||
if (!n) {\
|
if (!n) {\
|
||||||
argc = 0;\
|
argc = 0;\
|
||||||
@ -2151,12 +2151,12 @@ copy_node_scope(NODE *node, NODE *rval)
|
|||||||
if (TYPE(args) != T_ARRAY)\
|
if (TYPE(args) != T_ARRAY)\
|
||||||
args = rb_ary_to_ary(args);\
|
args = rb_ary_to_ary(args);\
|
||||||
argc = RARRAY(args)->len;\
|
argc = RARRAY(args)->len;\
|
||||||
argv = ALLOCA_N(VALUE, argc);\
|
argv = TMP_ALLOC(argc+extra);\
|
||||||
MEMCPY(argv, RARRAY(args)->ptr, VALUE, argc);\
|
MEMCPY(argv, RARRAY(args)->ptr, VALUE, argc);\
|
||||||
}\
|
}\
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define SETUP_ARGS(anode) SETUP_ARGS0(anode, anode->nd_alen)
|
#define SETUP_ARGS(anode) SETUP_ARGS0(anode, anode->nd_alen,0)
|
||||||
|
|
||||||
#define ZSUPER_ARGS() do {\
|
#define ZSUPER_ARGS() do {\
|
||||||
argc = ruby_frame->argc;\
|
argc = ruby_frame->argc;\
|
||||||
@ -3477,14 +3477,14 @@ rb_eval(VALUE self, NODE *n)
|
|||||||
case NODE_OP_ASGN1:
|
case NODE_OP_ASGN1:
|
||||||
{
|
{
|
||||||
int argc; VALUE *argv; /* used in SETUP_ARGS */
|
int argc; VALUE *argv; /* used in SETUP_ARGS */
|
||||||
VALUE recv, val;
|
VALUE recv, val, tmp;
|
||||||
NODE *rval;
|
NODE *rval;
|
||||||
TMP_PROTECT;
|
TMP_PROTECT;
|
||||||
|
|
||||||
recv = rb_eval(self, node->nd_recv);
|
recv = rb_eval(self, node->nd_recv);
|
||||||
rval = node->nd_args->nd_head;
|
rval = node->nd_args->nd_head;
|
||||||
SETUP_ARGS0(node->nd_args->nd_next, node->nd_args->nd_alen - 1);
|
SETUP_ARGS0(node->nd_args->nd_next, node->nd_args->nd_alen-1,1);
|
||||||
val = rb_funcall2(recv, aref, argc-1, argv);
|
val = rb_funcall3(recv, aref, argc, argv);
|
||||||
switch (node->nd_mid) {
|
switch (node->nd_mid) {
|
||||||
case 0: /* OR */
|
case 0: /* OR */
|
||||||
if (RTEST(val)) RETURN(val);
|
if (RTEST(val)) RETURN(val);
|
||||||
@ -3495,10 +3495,11 @@ rb_eval(VALUE self, NODE *n)
|
|||||||
val = rb_eval(self, rval);
|
val = rb_eval(self, rval);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
val = rb_funcall(val, node->nd_mid, 1, rb_eval(self, rval));
|
tmp = rb_eval(self, rval);
|
||||||
|
val = rb_funcall3(val, node->nd_mid, 1, &tmp);
|
||||||
}
|
}
|
||||||
argv[argc-1] = val;
|
argv[argc] = val;
|
||||||
rb_funcall2(recv, aset, argc, argv);
|
rb_funcall2(recv, aset, argc+1, argv);
|
||||||
result = val;
|
result = val;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -3506,10 +3507,10 @@ rb_eval(VALUE self, NODE *n)
|
|||||||
case NODE_OP_ASGN2:
|
case NODE_OP_ASGN2:
|
||||||
{
|
{
|
||||||
ID id = node->nd_next->nd_vid;
|
ID id = node->nd_next->nd_vid;
|
||||||
VALUE recv, val;
|
VALUE recv, val, tmp;
|
||||||
|
|
||||||
recv = rb_eval(self, node->nd_recv);
|
recv = rb_eval(self, node->nd_recv);
|
||||||
val = rb_funcall(recv, id, 0);
|
val = rb_funcall3(recv, id, 0, 0);
|
||||||
switch (node->nd_next->nd_mid) {
|
switch (node->nd_next->nd_mid) {
|
||||||
case 0: /* OR */
|
case 0: /* OR */
|
||||||
if (RTEST(val)) RETURN(val);
|
if (RTEST(val)) RETURN(val);
|
||||||
@ -3520,8 +3521,8 @@ rb_eval(VALUE self, NODE *n)
|
|||||||
val = rb_eval(self, node->nd_value);
|
val = rb_eval(self, node->nd_value);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
val = rb_funcall(val, node->nd_next->nd_mid, 1,
|
tmp = rb_eval(self, node->nd_value);
|
||||||
rb_eval(self, node->nd_value));
|
val = rb_funcall3(val, node->nd_next->nd_mid, 1, &tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
rb_funcall2(recv, node->nd_next->nd_aid, 1, &val);
|
rb_funcall2(recv, node->nd_next->nd_aid, 1, &val);
|
||||||
|
3
parse.y
3
parse.y
@ -1684,9 +1684,6 @@ arg : lhs '=' arg
|
|||||||
|
|
||||||
value_expr($6);
|
value_expr($6);
|
||||||
args = NEW_LIST($6);
|
args = NEW_LIST($6);
|
||||||
if ($3 && nd_type($3) != NODE_ARRAY)
|
|
||||||
$3 = NEW_LIST($3);
|
|
||||||
$3 = list_append($3, NEW_NIL());
|
|
||||||
list_concat(args, $3);
|
list_concat(args, $3);
|
||||||
if ($5 == tOROP) {
|
if ($5 == tOROP) {
|
||||||
$5 = 0;
|
$5 = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user