summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--bootstraptest/test_block.rb31
-rw-r--r--insnhelper.ci4
-rw-r--r--parse.y8
4 files changed, 46 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 7a86b717bd..33f4a49739 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Sat Jul 7 16:12:48 2007 Koichi Sasada <ko1@atdot.net>
+
+ * parse.y: fix node construction (around f_margs).
+ [ruby-dev:31143]
+
+ * bootstraptest/test_block.rb: add a test for above.
+
+ * insnhelper.ci: fix indent.
+
Sat Jul 7 15:36:50 2007 Tanaka Akira <akr@fsij.org>
* lib/pp.rb (PP::PPMethods#pp_hash): sort if
diff --git a/bootstraptest/test_block.rb b/bootstraptest/test_block.rb
index 21d13439ad..cdfd3e4407 100644
--- a/bootstraptest/test_block.rb
+++ b/bootstraptest/test_block.rb
@@ -336,6 +336,36 @@ assert_equal %q{[1, nil]}, %q{
}
}
+# block parameter (shouldn't SEGV: [ruby-dev:31143])
+assert_equal '0', %q{
+def m()
+end
+m {|(v0,*,(*)),|}
+m {|(*v0,(*)),|}
+m {|(v0,*v1,(*)),|}
+m {|((v0,*v1,v2)),|}
+m {|(v0,*v1,v2),|}
+m {|(v0,*v1,(v2)),|}
+m {|((*),*v0,v1),|}
+m {|((v0),*v1,v2),|}
+m {|(v0,v1,*v2,v3),|}
+m {|v0,(v1,*v2,v3),|}
+m {|(v0,*v1,v2),v3,|}
+m {|(v0,*v1,v2)|}
+m {|(v0,*v1,v2),&v3|}
+m {|(v0,*v1,v2),*|}
+m {|(v0,*v1,v2),*,&v3|}
+m {|*,(v0,*v1,v2)|}
+m {|*,(v0,*v1,v2),&v3|}
+m {|v0,*,(v1,*v2,v3)|}
+m {|v0,*,(v1,*v2,v3),&v4|}
+m {|(v0,*v1,v2),*,v3|}
+m {|(v0,*v1,v2),*,v3,&v4|}
+m {|(v0, *v1, v2)|}
+m {|(*,v)|}
+0
+}
+
# [ruby-dev:31147]
assert_equal 'nil', %q{
def m
@@ -343,3 +373,4 @@ assert_equal 'nil', %q{
end
m{|&b| b}.inspect
}
+
diff --git a/insnhelper.ci b/insnhelper.ci
index 385a31eda9..2fe540d1cb 100644
--- a/insnhelper.ci
+++ b/insnhelper.ci
@@ -620,8 +620,8 @@ vm_yield_setup_args(rb_thread_t *th, rb_iseq_t *iseq,
if (lambda) {
/* call as method */
- return vm_callee_setup_arg(th, iseq, argc, argv, &blockptr);
- }
+ return vm_callee_setup_arg(th, iseq, argc, argv, &blockptr);
+ }
else {
int i;
const int m = iseq->argc;
diff --git a/parse.y b/parse.y
index d24cf06157..bb39af8e30 100644
--- a/parse.y
+++ b/parse.y
@@ -3003,7 +3003,7 @@ f_marg : f_norm_arg
| tLPAREN f_margs rparen
{
/*%%%*/
- $$ = $2;
+ $$ = NEW_LIST($2);
/*%
$$ = dispatch1(mlhs_paren, $2);
%*/
@@ -3013,7 +3013,7 @@ f_marg : f_norm_arg
f_marg_head : f_marg
{
/*%%%*/
- $$ = NEW_LIST($1);
+ $$ = $1;
/*%
$$ = mlhs_add(mlhs_new(), $1);
%*/
@@ -3047,7 +3047,7 @@ f_margs : f_marg_head
| f_marg_head ',' tSTAR f_norm_arg ',' f_marg
{
/*%%%*/
- $$ = NEW_MASGN($1, NEW_POSTARG($4,$6));
+ $$ = NEW_MASGN($1, NEW_POSTARG(assignable($4, 0), $6));
/*%
$$ = mlhs_add_star($1, $4);
%*/
@@ -3063,7 +3063,7 @@ f_margs : f_marg_head
| f_marg_head ',' tSTAR ',' f_marg
{
/*%%%*/
- $$ = NEW_MASGN($1, NEW_POSTARG(-1,$5));
+ $$ = NEW_MASGN($1, NEW_POSTARG(-1, $5));
/*%
$$ = mlhs_add_star($1, $5);
%*/