summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--eval.c12
-rw-r--r--parse.y85
-rw-r--r--sample/test.rb6
4 files changed, 49 insertions, 60 deletions
diff --git a/ChangeLog b/ChangeLog
index b37b5f18f1..a24051fa8d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Fri Oct 6 06:53:46 2006 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * eval.c (rb_yield_0): small refactoring.
+
+ * parse.y (bparam_item): fixed bugs in handling parenthesized LHS.
+
Fri Oct 6 04:47:07 2006 Akinori MUSHA <knu@iDaemons.org>
* ext/digest/depend: Install digest.h.
diff --git a/eval.c b/eval.c
index 78448a6384..9e788df9e1 100644
--- a/eval.c
+++ b/eval.c
@@ -4780,16 +4780,14 @@ rb_yield_0(VALUE val, VALUE self, VALUE klass /* OK */, int flags)
massign(self, var, val, lambda);
}
else {
- if (lambda) {
- if (val == Qundef) {
- rb_raise(rb_eArgError, "wrong number of arguments (0 for 1)");
- }
- if (TYPE(val) == T_ARRAY && RARRAY_LEN(val) != 1) {
+ if (lambda && val == Qundef) {
+ rb_raise(rb_eArgError, "wrong number of arguments (0 for 1)");
+ }
+ if (ary_args) {
+ if (lambda && RARRAY_LEN(val) != 1) {
rb_raise(rb_eArgError, "wrong number of arguments (%ld for 1)",
RARRAY_LEN(val));
}
- }
- if (ary_args) {
if (RARRAY_LEN(val) == 0)
val = Qnil;
else
diff --git a/parse.y b/parse.y
index 6d7e7c901c..8e6af853d5 100644
--- a/parse.y
+++ b/parse.y
@@ -538,10 +538,9 @@ static void ripper_compile_error(struct parser_params*, const char *fmt, ...);
%type <node> mrhs superclass block_call block_command
%type <node> f_arglist f_args f_rest_arg f_post_arg
%type <node> f_optarg f_opt f_block_arg opt_f_block_arg
-%type <node> assoc_list assocs assoc undef_list backref string_dvar
-%type <node> for_var block_param opt_block_param block_param_def block_param0
-%type <node> block_param1 bparam_post
-%type <node> opt_bv_decl bv_decls bv_decl lambda f_larglist lambda_body
+%type <node> assoc_list assocs assoc undef_list backref string_dvar for_var
+%type <node> block_param opt_block_param block_param_def bparam_list bparam_item
+%type <node> opt_bv_decl bv_decls bvar lambda f_larglist lambda_body
%type <node> brace_block cmd_brace_block do_block lhs none fitem
%type <node> mlhs mlhs_head mlhs_basic mlhs_item mlhs_node mlhs_post
%type <id> fsym variable sym symbol operation operation2 operation3
@@ -2857,37 +2856,23 @@ for_var : lhs
| mlhs
;
-block_param1 : bv_decl
+bparam_item : bvar
| tLPAREN block_param rparen
{
/*%%%*/
- $$ = NEW_MASGN(NEW_LIST($2), 0);
+ if (nd_type($2) != NODE_MASGN) {
+ $$ = NEW_MASGN(NEW_LIST($2), 0);
+ }
+ else {
+ $$ = $2;
+ }
/*%
$$ = dispatch1(mlhs_paren, $2);
%*/
}
;
-bparam_post : block_param1
- {
- /*%%%*/
- $$ = NEW_LIST($1);
- /*%
- $$ = mlhs_add(mlhs_new(), $1);
- %*/
- }
- | bparam_post ',' block_param1
- {
- /*%%%*/
- $$ = list_append($1, $3);
- /*%
- $$ = mlhs_add($1, $3);
- %*/
- }
- ;
-
-
-block_param0 : block_param1
+bparam_list : bparam_item
{
/*%%%*/
$$ = NEW_LIST($1);
@@ -2895,7 +2880,7 @@ block_param0 : block_param1
$$ = mlhs_add(mlhs_new(), $1);
%*/
}
- | block_param0 ',' block_param1
+ | bparam_list ',' bparam_item
{
/*%%%*/
$$ = list_append($1, $3);
@@ -2905,10 +2890,10 @@ block_param0 : block_param1
}
;
-block_param : block_param0
+block_param : bparam_list
{
/*%%%*/
- if ($1->nd_alen == 1) {
+ if ($1->nd_alen == 1 && nd_type($1->nd_head) != NODE_MASGN) {
$$ = $1->nd_head;
rb_gc_force_recycle((VALUE)$1);
}
@@ -2919,7 +2904,7 @@ block_param : block_param0
$$ = blockvar_new($1);
%*/
}
- | block_param0 ','
+ | bparam_list ','
{
/*%%%*/
$$ = NEW_MASGN($1, 0);
@@ -2927,7 +2912,7 @@ block_param : block_param0
$$ = blockvar_new($1);
%*/
}
- | block_param0 ',' tAMPER lhs
+ | bparam_list ',' tAMPER bvar
{
/*%%%*/
$$ = NEW_BLOCK_PARAM($4, NEW_MASGN($1, 0));
@@ -2935,7 +2920,7 @@ block_param : block_param0
$$ = blockvar_add_block(blockvar_new($1), $4);
%*/
}
- | block_param0 ',' tSTAR lhs ',' bparam_post ',' tAMPER lhs
+ | bparam_list ',' tSTAR bvar ',' bparam_list ',' tAMPER bvar
{
/*%%%*/
$$ = NEW_BLOCK_PARAM($9, NEW_MASGN($1, NEW_POSTARG($4,$6)));
@@ -2944,7 +2929,7 @@ block_param : block_param0
$$ = blockvar_add_block($$, $9);
%*/
}
- | block_param0 ',' tSTAR lhs ',' tAMPER lhs
+ | bparam_list ',' tSTAR bvar ',' tAMPER bvar
{
/*%%%*/
$$ = NEW_BLOCK_PARAM($7, NEW_MASGN($1, $4));
@@ -2953,7 +2938,7 @@ block_param : block_param0
$$ = blockvar_add_block($$, $7);
%*/
}
- | block_param0 ',' tSTAR ',' tAMPER lhs
+ | bparam_list ',' tSTAR ',' tAMPER bvar
{
/*%%%*/
$$ = NEW_BLOCK_PARAM($6, NEW_MASGN($1, -1));
@@ -2962,7 +2947,7 @@ block_param : block_param0
$$ = blockvar_add_block($$, $6);
%*/
}
- | block_param0 ',' tSTAR ',' bparam_post ',' tAMPER lhs
+ | bparam_list ',' tSTAR ',' bparam_list ',' tAMPER bvar
{
/*%%%*/
$$ = NEW_BLOCK_PARAM($8, NEW_MASGN($1, NEW_POSTARG(-1,$5)));
@@ -2971,7 +2956,7 @@ block_param : block_param0
$$ = blockvar_add_block($$, $8);
%*/
}
- | block_param0 ',' tSTAR lhs
+ | bparam_list ',' tSTAR bvar
{
/*%%%*/
$$ = NEW_MASGN($1, $4);
@@ -2979,7 +2964,7 @@ block_param : block_param0
$$ = blockvar_add_star(blockvar_new($1), $4);
%*/
}
- | block_param0 ',' tSTAR lhs ',' bparam_post
+ | bparam_list ',' tSTAR bvar ',' bparam_list
{
/*%%%*/
$$ = NEW_MASGN($1, NEW_POSTARG($4,$6));
@@ -2987,7 +2972,7 @@ block_param : block_param0
$$ = blockvar_add_star(blockvar_new($1), $4);
%*/
}
- | block_param0 ',' tSTAR
+ | bparam_list ',' tSTAR
{
/*%%%*/
$$ = NEW_MASGN($1, -1);
@@ -2995,7 +2980,7 @@ block_param : block_param0
$$ = blockvar_add_star(blockvar_new($1), Qnil);
%*/
}
- | block_param0 ',' tSTAR ',' bparam_post
+ | bparam_list ',' tSTAR ',' bparam_list
{
/*%%%*/
$$ = NEW_MASGN($1, NEW_MASGN($1, NEW_POSTARG(-1,$5)));
@@ -3003,7 +2988,7 @@ block_param : block_param0
$$ = blockvar_add_star(blockvar_new($1), Qnil);
%*/
}
- | tSTAR lhs ',' tAMPER lhs
+ | tSTAR bvar ',' tAMPER bvar
{
/*%%%*/
$$ = NEW_BLOCK_PARAM($5, NEW_MASGN(0, $2));
@@ -3012,7 +2997,7 @@ block_param : block_param0
$$ = blockvar_add_block($$, $5);
%*/
}
- | tSTAR ',' tAMPER lhs
+ | tSTAR ',' tAMPER bvar
{
/*%%%*/
$$ = NEW_BLOCK_PARAM($4, NEW_MASGN(0, -1));
@@ -3021,7 +3006,7 @@ block_param : block_param0
$$ = blockvar_add_block($$, $4);
%*/
}
- | tSTAR lhs
+ | tSTAR bvar
{
/*%%%*/
$$ = NEW_MASGN(0, $2);
@@ -3029,7 +3014,7 @@ block_param : block_param0
$$ = blockvar_add_star(blockvar_new(Qnil), $2);
%*/
}
- | tSTAR lhs ',' bparam_post
+ | tSTAR bvar ',' bparam_list
{
/*%%%*/
$$ = NEW_MASGN(0, NEW_POSTARG($2,$4));
@@ -3037,7 +3022,7 @@ block_param : block_param0
$$ = blockvar_add_star(blockvar_new(Qnil), $2);
%*/
}
- | tSTAR lhs ',' bparam_post ',' tAMPER lhs
+ | tSTAR bvar ',' bparam_list ',' tAMPER bvar
{
/*%%%*/
$$ = NEW_BLOCK_PARAM($7, NEW_MASGN(0, NEW_POSTARG($2,$4)));
@@ -3054,7 +3039,7 @@ block_param : block_param0
$$ = blockvar_add_star(blockvar_new(Qnil), Qnil);
%*/
}
- | tSTAR ',' bparam_post
+ | tSTAR ',' bparam_list
{
/*%%%*/
$$ = NEW_MASGN(0, NEW_POSTARG(-1,$3));
@@ -3062,7 +3047,7 @@ block_param : block_param0
$$ = blockvar_add_star(blockvar_new(Qnil), Qnil);
%*/
}
- | tSTAR ',' bparam_post ',' tAMPER lhs
+ | tSTAR ',' bparam_list ',' tAMPER bvar
{
/*%%%*/
$$ = NEW_BLOCK_PARAM($6, NEW_MASGN(0, NEW_POSTARG(-1,$3)));
@@ -3071,7 +3056,7 @@ block_param : block_param0
$$ = blockvar_add_block($$, $6);
%*/
}
- | tAMPER lhs
+ | tAMPER bvar
{
/*%%%*/
$$ = NEW_BLOCK_PARAM($2, (NODE*)1);
@@ -3129,7 +3114,7 @@ opt_bv_decl : none
}
;
-bv_decls : bv_decl
+bv_decls : bvar
{
/*%%%*/
$$ = $1;
@@ -3137,7 +3122,7 @@ bv_decls : bv_decl
$$ = FIXME;
%*/
}
- | bv_decls ',' bv_decl
+ | bv_decls ',' bvar
{
/*%%%*/
$$ = block_append($1, $3);
@@ -3147,7 +3132,7 @@ bv_decls : bv_decl
}
;
-bv_decl : tIDENTIFIER
+bvar : tIDENTIFIER
{
/*%%%*/
$$ = new_bv($1, NEW_NIL());
diff --git a/sample/test.rb b/sample/test.rb
index a32dbcbec2..65b268d9cc 100644
--- a/sample/test.rb
+++ b/sample/test.rb
@@ -977,11 +977,11 @@ IterTest.new([[3]]).each3 {|x| test_ok(x == 3)}
IterTest.new([[4]]).each4 {|x| test_ok(x == [4])}
IterTest.new([[5]]).each5 {|x| test_ok(x == [5])}
IterTest.new([[6]]).each6 {|x| test_ok(x == [6])}
-IterTest.new([[7]]).each7 {|x| test_ok(x == [7])}
-IterTest.new([[8]]).each8 {|x| test_ok(x == [8])}
+IterTest.new([[7]]).each7 {|x| p x; test_ok(x == [7])}
+IterTest.new([[8]]).each8 {|x| p x; test_ok(x == [8])}
IterTest.new([[0,0]]).each0 {|*x| test_ok(x == [0,0])}
-IterTest.new([[8,8]]).each8 {|*x| test_ok(x == [8,8])}
+IterTest.new([[8,8]]).each8 {|*x| p x; test_ok(x == [8,8])}
def m0(v)
v