summaryrefslogtreecommitdiff
path: root/vm.c
diff options
context:
space:
mode:
Diffstat (limited to 'vm.c')
-rw-r--r--vm.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/vm.c b/vm.c
index a2913c002c..c7ccbc9550 100644
--- a/vm.c
+++ b/vm.c
@@ -961,7 +961,14 @@ vm_make_env_each(const rb_execution_context_t * const ec, rb_control_frame_t *co
local_size = VM_ENV_DATA_SIZE;
}
else {
- local_size = ISEQ_BODY(cfp->iseq)->local_table_size + VM_ENV_DATA_SIZE;
+ local_size = ISEQ_BODY(cfp->iseq)->local_table_size;
+ if (ISEQ_BODY(cfp->iseq)->param.flags.forwardable && VM_ENV_LOCAL_P(cfp->ep)) {
+ int ci_offset = local_size - ISEQ_BODY(cfp->iseq)->param.size + VM_ENV_DATA_SIZE;
+
+ CALL_INFO ci = (CALL_INFO)VM_CF_LEP(cfp)[-ci_offset];
+ local_size += vm_ci_argc(ci);
+ }
+ local_size += VM_ENV_DATA_SIZE;
}
/*
@@ -1480,14 +1487,14 @@ rb_binding_add_dynavars(VALUE bindval, rb_binding_t *bind, int dyncount, const I
tmp_node.nd_body = 0;
tmp_node.nd_args = 0;
- VALUE vast = rb_ruby_ast_new(RNODE(&tmp_node));
+ VALUE ast_value = rb_ruby_ast_new(RNODE(&tmp_node));
if (base_iseq) {
- iseq = rb_iseq_new(vast, ISEQ_BODY(base_iseq)->location.label, path, realpath, base_iseq, ISEQ_TYPE_EVAL);
+ iseq = rb_iseq_new(ast_value, ISEQ_BODY(base_iseq)->location.label, path, realpath, base_iseq, ISEQ_TYPE_EVAL);
}
else {
VALUE tempstr = rb_fstring_lit("<temp>");
- iseq = rb_iseq_new_top(vast, tempstr, tempstr, tempstr, NULL);
+ iseq = rb_iseq_new_top(ast_value, tempstr, tempstr, tempstr, NULL);
}
tmp_node.nd_tbl = 0; /* reset table */
ALLOCV_END(idtmp);
@@ -2278,6 +2285,7 @@ vm_redefinition_bop_for_id(ID mid)
OP(NilP, NIL_P);
OP(Cmp, CMP);
OP(Default, DEFAULT);
+ OP(Pack, PACK);
#undef OP
}
return -1;
@@ -3077,6 +3085,7 @@ ruby_vm_destruct(rb_vm_t *vm)
rb_vm_postponed_job_free();
rb_id_table_free(vm->constant_cache);
+ st_free_table(vm->unused_block_warning_table);
if (th) {
xfree(th->nt);