summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-04-21 08:56:31 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-04-21 08:56:31 +0900
commit4654db4fdc3c83c6feb7d6e49afa61d341a74af7 (patch)
treebf88cf0c977429186d26d1b81a0405f38b0640cd
parent5f846923675fca5a931d6a317078e34e880d11a5 (diff)
parent9eaddfab4455513ef6f3dbb89eca80a7798bb49a (diff)
downloadmruby-4654db4fdc3c83c6feb7d6e49afa61d341a74af7.tar.gz
mruby-4654db4fdc3c83c6feb7d6e49afa61d341a74af7.zip
Merge pull request #2096 from nobu/def_in_cmdarg
Def in cmdarg
-rw-r--r--src/parse.y8
-rw-r--r--test/t/syntax.rb7
2 files changed, 14 insertions, 1 deletions
diff --git a/src/parse.y b/src/parse.y
index 053b5f3e9..1a3dadd61 100644
--- a/src/parse.y
+++ b/src/parse.y
@@ -997,7 +997,7 @@ heredoc_end(parser_state *p)
node *nd;
mrb_sym id;
int num;
- unsigned int stack;
+ stack_type stack;
const struct vtable *vars;
}
@@ -2226,6 +2226,8 @@ primary : literal
{
p->in_def++;
$<nd>$ = local_switch(p);
+ $<stack>1 = p->cmdarg_stack;
+ p->cmdarg_stack = 0;
}
f_arglist
bodystmt
@@ -2234,12 +2236,15 @@ primary : literal
$$ = new_def(p, $2, $4, $5);
local_resume(p, $<nd>3);
p->in_def--;
+ p->cmdarg_stack = $<stack>1;
}
| keyword_def singleton dot_or_colon {p->lstate = EXPR_FNAME;} fname
{
p->in_single++;
p->lstate = EXPR_ENDFN; /* force for args */
$<nd>$ = local_switch(p);
+ $<stack>1 = p->cmdarg_stack;
+ p->cmdarg_stack = 0;
}
f_arglist
bodystmt
@@ -2248,6 +2253,7 @@ primary : literal
$$ = new_sdef(p, $2, $5, $7, $8);
local_resume(p, $<nd>6);
p->in_single--;
+ p->cmdarg_stack = $<stack>1;
}
| keyword_break
{
diff --git a/test/t/syntax.rb b/test/t/syntax.rb
index d761b1991..2adfbc8ab 100644
--- a/test/t/syntax.rb
+++ b/test/t/syntax.rb
@@ -265,3 +265,10 @@ assert('parenthesed do-block in cmdarg') do
result = x.test (proc do :ok; end)
assert_equal :ok, result
end
+
+assert('method definition in cmdarg') do
+ if false
+ bar def foo; self.each do end end
+ end
+ true
+end