Skip to content

Commit aa7f98d

Browse files
committed
vm.c (hash_new_from_regs): stack may be reallocated.
1 parent af5acf3 commit aa7f98d

File tree

1 file changed

+7
-6
lines changed

1 file changed

+7
-6
lines changed

Diff for: src/vm.c

+7-6
Original file line numberDiff line numberDiff line change
@@ -1159,18 +1159,20 @@ check_target_class(mrb_state *mrb)
11591159
return target;
11601160
}
11611161

1162+
#define regs (mrb->c->ci->stack)
1163+
11621164
static mrb_value
1163-
hash_new_from_values(mrb_state *mrb, mrb_int argc, mrb_value *regs)
1165+
hash_new_from_regs(mrb_state *mrb, mrb_int argc, mrb_int idx)
11641166
{
11651167
mrb_value hash = mrb_hash_new_capa(mrb, argc);
11661168
while (argc--) {
1167-
mrb_hash_set(mrb, hash, regs[0], regs[1]);
1168-
regs += 2;
1169+
mrb_hash_set(mrb, hash, regs[idx+0], regs[idx+1]);
1170+
idx += 2;
11691171
}
11701172
return hash;
11711173
}
11721174

1173-
#define ARGUMENT_NORMALIZE(arg_base, arg_info, insn) do { \
1175+
#define ARGUMENT_NORMALIZE(arg_base, arg_info, insn) do { \
11741176
int n = *(arg_info)&0xf; \
11751177
int nk = (*(arg_info)>>4)&0xf; \
11761178
mrb_int bidx = (arg_base) + mrb_bidx(*(arg_info)); \
@@ -1179,7 +1181,7 @@ hash_new_from_values(mrb_state *mrb, mrb_int argc, mrb_value *regs)
11791181
} \
11801182
else if (nk > 0) { /* pack keyword arguments */ \
11811183
mrb_int kidx = (arg_base)+(n==CALL_MAXARGS?1:n)+1; \
1182-
mrb_value kdict = hash_new_from_values(mrb, nk, regs+kidx); \
1184+
mrb_value kdict = hash_new_from_regs(mrb, nk, kidx); \
11831185
regs[kidx] = kdict; \
11841186
nk = CALL_MAXARGS; \
11851187
*(arg_info) = n | (nk<<4); \
@@ -1242,7 +1244,6 @@ mrb_vm_exec(mrb_state *mrb, const struct RProc *proc, const mrb_code *pc)
12421244
mrb->jmp = &c_jmp;
12431245
mrb_vm_ci_proc_set(mrb->c->ci, proc);
12441246

1245-
#define regs (mrb->c->ci->stack)
12461247
INIT_DISPATCH {
12471248
CASE(OP_NOP, Z) {
12481249
/* do nothing */

0 commit comments

Comments
 (0)