summaryrefslogtreecommitdiffhomepage
path: root/src/vm.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-12-06 17:20:34 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-12-06 17:28:20 +0900
commit6975258efd567c58e483818189216d43b6d77036 (patch)
tree7896e4bf15dcdf1fd16333a58ab09ac71b50ffc6 /src/vm.c
parentae44e80668657a93dc316b9c7d3524ed311fb3dc (diff)
downloadmruby-6975258efd567c58e483818189216d43b6d77036.tar.gz
mruby-6975258efd567c58e483818189216d43b6d77036.zip
The proc with top-level env must be 'proc-closure'; fix #3871
Diffstat (limited to 'src/vm.c')
-rw-r--r--src/vm.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/vm.c b/src/vm.c
index f8c2d510f..7edbdf3cb 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -2019,8 +2019,15 @@ RETRY_TRY_BLOCK:
if (!MRB_PROC_ENV_P(proc) || !MRB_ENV_STACK_SHARED_P(MRB_PROC_ENV(proc))) {
goto L_BREAK_ERROR;
}
- if (MRB_PROC_ENV(proc)->cxt != mrb->c) {
- goto L_BREAK_ERROR;
+ else {
+ struct REnv *e = MRB_PROC_ENV(proc);
+
+ if (e == mrb->c->cibase->env && proc != mrb->c->cibase->proc) {
+ goto L_BREAK_ERROR;
+ }
+ if (e->cxt != mrb->c) {
+ goto L_BREAK_ERROR;
+ }
}
while (mrb->c->eidx > mrb->c->ci->epos) {
ecall_adjust();