@@ -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