summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2015-01-31 13:51:25 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2015-01-31 13:51:25 +0900
commit089f1f6c75d1642f96c84d12c3c2f4cb567343b9 (patch)
treed2458900d46a2712f1a4064107713a9193997364 /src
parent02b54e5379f1f5901a70782b5990a91afe7f5930 (diff)
downloadmruby-089f1f6c75d1642f96c84d12c3c2f4cb567343b9.tar.gz
mruby-089f1f6c75d1642f96c84d12c3c2f4cb567343b9.zip
block_given? should work with nested block; fix #2695 close #2712
Diffstat (limited to 'src')
-rw-r--r--src/kernel.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/src/kernel.c b/src/kernel.c
index 485485da5..d1e10a7f8 100644
--- a/src/kernel.c
+++ b/src/kernel.c
@@ -186,14 +186,21 @@ mrb_f_block_given_p_m(mrb_state *mrb, mrb_value self)
}
else {
/* block_given? called within block; check upper scope */
- if (ci->proc->env && ci->proc->env->stack) {
- mrb_value *sp = ci->proc->env->stack;
-
- /* top-level does not have block slot (alway false) */
- if (sp == mrb->c->stbase)
- return mrb_false_value();
- ci = mrb->c->cibase + ci->proc->env->cioff;
- bp = ci[1].stackent + 1;
+ if (ci->proc->env) {
+ struct REnv *e = ci->proc->env;
+ mrb_value *sp;
+
+ while (e->c) {
+ e = (struct REnv*)e->c;
+ }
+ sp = e->stack;
+ if (sp) {
+ /* top-level does not have block slot (alway false) */
+ if (sp == mrb->c->stbase)
+ return mrb_false_value();
+ ci = mrb->c->cibase + e->cioff;
+ bp = ci[1].stackent + 1;
+ }
}
if (ci->argc > 0) {
bp += ci->argc;