Skip to content

Commit b7e2324

Browse files
committed
fix(vm): Use designated initializers to pad dispatch table to 256 entries to prevent SIGSEGV
1 parent c8e57a8 commit b7e2324

1 file changed

Lines changed: 54 additions & 16 deletions

File tree

src/runtime/vm.c

Lines changed: 54 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -131,22 +131,55 @@ static InterpretResult run(VM *vm) {
131131
#ifdef __GNUC__
132132
#define DISPATCH() goto *dispatch_table[*frame->ip++]
133133

134-
static void* dispatch_table[] = {
135-
&&DO_OP_CONSTANT, &&DO_OP_NOP, &&DO_OP_NIL, &&DO_OP_TRUE, &&DO_OP_FALSE,
136-
&&DO_OP_POP,
137-
&&DO_OP_DUP, &&DO_OP_BUILD_LIST, &&DO_OP_BUILD_MAP, &&DO_OP_GET_INDEX, &&DO_OP_SET_INDEX,
138-
&&DO_OP_GET_LOCAL, &&DO_OP_SET_LOCAL,
139-
&&DO_OP_GET_GLOBAL, &&DO_OP_DEFINE_GLOBAL, &&DO_OP_SET_GLOBAL,
140-
&&DO_OP_GET_UPVALUE, &&DO_OP_SET_UPVALUE,
141-
&&DO_OP_GET_PROPERTY, &&DO_OP_SET_PROPERTY, &&DO_OP_GET_SUPER,
142-
&&DO_OP_EQUAL, &&DO_OP_GREATER, &&DO_OP_LESS,
143-
&&DO_OP_ADD, &&DO_OP_SUBTRACT, &&DO_OP_MULTIPLY,
144-
&&DO_OP_DIVIDE, &&DO_OP_NOT, &&DO_OP_NEGATE, &&DO_OP_PRINT,
145-
&&DO_OP_JUMP, &&DO_OP_JUMP_IF_FALSE, &&DO_OP_LOOP,
146-
&&DO_OP_CALL, &&DO_OP_INVOKE, &&DO_OP_SUPER_INVOKE,
147-
&&DO_OP_CLOSURE, &&DO_OP_CLOSE_UPVALUE,
148-
&&DO_OP_RETURN, &&DO_OP_CLASS, &&DO_OP_INHERIT, &&DO_OP_METHOD,
149-
&&DO_OP_USE, &&DO_OP_TRY, &&DO_OP_CATCH, &&DO_OP_END_TRY
134+
static void* dispatch_table[256] = {
135+
[0 ... 255] = &&DO_OP_UNKNOWN,
136+
[OP_CONSTANT] = &&DO_OP_CONSTANT,
137+
[OP_NOP] = &&DO_OP_NOP,
138+
[OP_NIL] = &&DO_OP_NIL,
139+
[OP_TRUE] = &&DO_OP_TRUE,
140+
[OP_FALSE] = &&DO_OP_FALSE,
141+
[OP_POP] = &&DO_OP_POP,
142+
[OP_DUP] = &&DO_OP_DUP,
143+
[OP_BUILD_LIST] = &&DO_OP_BUILD_LIST,
144+
[OP_BUILD_MAP] = &&DO_OP_BUILD_MAP,
145+
[OP_GET_INDEX] = &&DO_OP_GET_INDEX,
146+
[OP_SET_INDEX] = &&DO_OP_SET_INDEX,
147+
[OP_GET_LOCAL] = &&DO_OP_GET_LOCAL,
148+
[OP_SET_LOCAL] = &&DO_OP_SET_LOCAL,
149+
[OP_GET_GLOBAL] = &&DO_OP_GET_GLOBAL,
150+
[OP_DEFINE_GLOBAL] = &&DO_OP_DEFINE_GLOBAL,
151+
[OP_SET_GLOBAL] = &&DO_OP_SET_GLOBAL,
152+
[OP_GET_UPVALUE] = &&DO_OP_GET_UPVALUE,
153+
[OP_SET_UPVALUE] = &&DO_OP_SET_UPVALUE,
154+
[OP_GET_PROPERTY] = &&DO_OP_GET_PROPERTY,
155+
[OP_SET_PROPERTY] = &&DO_OP_SET_PROPERTY,
156+
[OP_GET_SUPER] = &&DO_OP_GET_SUPER,
157+
[OP_EQUAL] = &&DO_OP_EQUAL,
158+
[OP_GREATER] = &&DO_OP_GREATER,
159+
[OP_LESS] = &&DO_OP_LESS,
160+
[OP_ADD] = &&DO_OP_ADD,
161+
[OP_SUBTRACT] = &&DO_OP_SUBTRACT,
162+
[OP_MULTIPLY] = &&DO_OP_MULTIPLY,
163+
[OP_DIVIDE] = &&DO_OP_DIVIDE,
164+
[OP_NOT] = &&DO_OP_NOT,
165+
[OP_NEGATE] = &&DO_OP_NEGATE,
166+
[OP_PRINT] = &&DO_OP_PRINT,
167+
[OP_JUMP] = &&DO_OP_JUMP,
168+
[OP_JUMP_IF_FALSE] = &&DO_OP_JUMP_IF_FALSE,
169+
[OP_LOOP] = &&DO_OP_LOOP,
170+
[OP_CALL] = &&DO_OP_CALL,
171+
[OP_INVOKE] = &&DO_OP_INVOKE,
172+
[OP_SUPER_INVOKE] = &&DO_OP_SUPER_INVOKE,
173+
[OP_CLOSURE] = &&DO_OP_CLOSURE,
174+
[OP_CLOSE_UPVALUE] = &&DO_OP_CLOSE_UPVALUE,
175+
[OP_RETURN] = &&DO_OP_RETURN,
176+
[OP_CLASS] = &&DO_OP_CLASS,
177+
[OP_INHERIT] = &&DO_OP_INHERIT,
178+
[OP_METHOD] = &&DO_OP_METHOD,
179+
[OP_USE] = &&DO_OP_USE,
180+
[OP_TRY] = &&DO_OP_TRY,
181+
[OP_CATCH] = &&DO_OP_CATCH,
182+
[OP_END_TRY] = &&DO_OP_END_TRY
150183
};
151184

152185
DISPATCH();
@@ -541,6 +574,11 @@ static InterpretResult run(VM *vm) {
541574
return INTERPRET_RUNTIME_ERROR;
542575
}
543576

577+
DO_OP_UNKNOWN: {
578+
runtimeError(vm, "Unknown opcode %d.", frame->ip[-1]);
579+
return INTERPRET_RUNTIME_ERROR;
580+
}
581+
544582
#else
545583
// Fallback for MSVC / Standard C
546584
for (;;) {

0 commit comments

Comments
 (0)