diff options
| -rw-r--r-- | src/vm.c | 20 | ||||
| -rw-r--r-- | test/t/float.rb | 2 |
2 files changed, 18 insertions, 4 deletions
@@ -151,14 +151,27 @@ uvset(mrb_state *mrb, int up, int idx, mrb_value v) mrb_write_barrier(mrb, (struct RBasic*)e); } +static inline int +is_strict(mrb_state *mrb, struct REnv *e) +{ + int cioff = e->cioff; + + if (cioff >= 0 && mrb->cibase[cioff].proc && + MRB_PROC_STRICT_P(mrb->cibase[cioff].proc)) { + return 1; + } + return 0; +} + struct REnv* -top_env(struct RProc *proc) +top_env(mrb_state *mrb, struct RProc *proc) { struct REnv *e = proc->env; + if (is_strict(mrb, e)) return e; while (e->c) { - if (!e) return 0; e = (struct REnv*)e->c; + if (is_strict(mrb, e)) return e; } return e; } @@ -1165,8 +1178,9 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) break; case OP_R_RETURN: if (!proc->env) goto NORMAL_RETURN; + if (MRB_PROC_STRICT_P(proc)) goto NORMAL_RETURN; else { - struct REnv *e = top_env(proc); + struct REnv *e = top_env(mrb, proc); if (e->cioff < 0) { localjump_error(mrb, "return"); diff --git a/test/t/float.rb b/test/t/float.rb index e2c139c03..abb5cf2e7 100644 --- a/test/t/float.rb +++ b/test/t/float.rb @@ -105,7 +105,7 @@ assert('Float#round', '15.2.9.3.12') do i = 3.423456789.round(3) a == 3 and b == 4 and c == 3 and d == -3 and e == -4 and - f == 12350 and g == 3 and h == 3.4 and i == 3.423 + f == 12350 and g == 3 and check_float(h, 3.4) and check_float(i, 3.423) end assert('Float#to_f', '15.2.9.3.13') do |
