summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorNobuyoshi Nakada <[email protected]>2014-04-21 07:00:03 +0900
committerNobuyoshi Nakada <[email protected]>2014-04-21 07:00:57 +0900
commit9eaddfab4455513ef6f3dbb89eca80a7798bb49a (patch)
tree11dd45ca298a6862432d443be6fadbe55b31e491 /src
parenta3d6290d7b3302fbd602eb57e4569ba0afa7b8f2 (diff)
downloadmruby-9eaddfab4455513ef6f3dbb89eca80a7798bb49a.tar.gz
mruby-9eaddfab4455513ef6f3dbb89eca80a7798bb49a.zip
allow method definition in cmdarg
save cmdarg_stack and isolate command argument state from outer scope to allow method definition in cmdarg import from ruby/ruby@04bb9d6b75a55d4000700769eead5a5cb942c25b
Diffstat (limited to 'src')
-rw-r--r--src/parse.y6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/parse.y b/src/parse.y
index 3eb4a418f..1a3dadd61 100644
--- a/src/parse.y
+++ b/src/parse.y
@@ -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
{