Skip to content

Commit ee06bbb

Browse files
matzclaude
andcommitted
vm.c: replace type assertions with runtime checks
Replace mrb_assert with mrb_ensure_*_type for VM opcodes that require specific types: - OP_ARYCAT: mrb_ensure_array_type - OP_ARYPUSH: mrb_ensure_array_type - OP_ASET: mrb_ensure_array_type (also fixed: was checking wrong register) - OP_INTERN: mrb_ensure_string_type - OP_HASHCAT: mrb_ensure_hash_type These checks catch codegen bugs with clear error messages in both debug and release builds. Co-authored-by: Claude <noreply@anthropic.com>
1 parent 6b482ee commit ee06bbb

File tree

1 file changed

+5
-5
lines changed

1 file changed

+5
-5
lines changed

src/vm.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3003,15 +3003,15 @@ mrb_vm_exec(mrb_state *mrb, const struct RProc *begin_proc, const mrb_code *iseq
30033003
regs[a] = splat;
30043004
}
30053005
else {
3006-
mrb_assert(mrb_array_p(regs[a]));
3006+
mrb_ensure_array_type(mrb, regs[a]);
30073007
mrb_ary_concat(mrb, regs[a], splat);
30083008
}
30093009
mrb_gc_arena_restore(mrb, ai);
30103010
NEXT;
30113011
}
30123012

30133013
CASE(OP_ARYPUSH, BB) {
3014-
mrb_assert(mrb_array_p(regs[a]));
3014+
mrb_ensure_array_type(mrb, regs[a]);
30153015
for (mrb_int i=0; i<b; i++) {
30163016
mrb_ary_push(mrb, regs[a], regs[a+i+1]);
30173017
}
@@ -3045,7 +3045,7 @@ mrb_vm_exec(mrb_state *mrb, const struct RProc *begin_proc, const mrb_code *iseq
30453045
}
30463046

30473047
CASE(OP_ASET, BBB) {
3048-
mrb_assert(mrb_array_p(regs[a]));
3048+
mrb_ensure_array_type(mrb, regs[b]);
30493049
mrb_ary_set(mrb, regs[b], c, regs[a]);
30503050
NEXT;
30513051
}
@@ -3085,7 +3085,7 @@ mrb_vm_exec(mrb_state *mrb, const struct RProc *begin_proc, const mrb_code *iseq
30853085
}
30863086

30873087
CASE(OP_INTERN, B) {
3088-
mrb_assert(mrb_string_p(regs[a]));
3088+
mrb_ensure_string_type(mrb, regs[a]);
30893089
mrb_sym sym = mrb_intern_str(mrb, regs[a]);
30903090
regs[a] = mrb_symbol_value(sym);
30913091
NEXT;
@@ -3158,7 +3158,7 @@ mrb_vm_exec(mrb_state *mrb, const struct RProc *begin_proc, const mrb_code *iseq
31583158
CASE(OP_HASHCAT, B) {
31593159
mrb_value hash = regs[a];
31603160

3161-
mrb_assert(mrb_hash_p(hash));
3161+
mrb_ensure_hash_type(mrb, hash);
31623162
mrb_hash_merge(mrb, hash, regs[a+1]);
31633163
ci = mrb->c->ci;
31643164
mrb_gc_arena_restore(mrb, ai);

0 commit comments

Comments
 (0)