summaryrefslogtreecommitdiffhomepage
path: root/src/kernel.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel.c')
-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;