Move entry_table to separated header file.
This commit is contained in:
parent
8c1bec4ae7
commit
9309d9982f
87
py/entry_table.h
Normal file
87
py/entry_table.h
Normal file
@ -0,0 +1,87 @@
|
||||
static void* entry_table[256] = {
|
||||
[0 ... 255] = &&entry_default,
|
||||
[MP_BC_LOAD_CONST_FALSE] = &&entry_MP_BC_LOAD_CONST_FALSE,
|
||||
[MP_BC_LOAD_CONST_NONE] = &&entry_MP_BC_LOAD_CONST_NONE,
|
||||
[MP_BC_LOAD_CONST_TRUE] = &&entry_MP_BC_LOAD_CONST_TRUE,
|
||||
[MP_BC_LOAD_CONST_ELLIPSIS] = &&entry_MP_BC_LOAD_CONST_ELLIPSIS,
|
||||
[MP_BC_LOAD_CONST_SMALL_INT] = &&entry_MP_BC_LOAD_CONST_SMALL_INT,
|
||||
[MP_BC_LOAD_CONST_INT] = &&entry_MP_BC_LOAD_CONST_INT,
|
||||
[MP_BC_LOAD_CONST_DEC] = &&entry_MP_BC_LOAD_CONST_DEC,
|
||||
[MP_BC_LOAD_CONST_ID] = &&entry_MP_BC_LOAD_CONST_ID,
|
||||
[MP_BC_LOAD_CONST_BYTES] = &&entry_MP_BC_LOAD_CONST_BYTES,
|
||||
[MP_BC_LOAD_CONST_STRING] = &&entry_MP_BC_LOAD_CONST_STRING,
|
||||
[MP_BC_LOAD_NULL] = &&entry_MP_BC_LOAD_NULL,
|
||||
[MP_BC_LOAD_FAST_0] = &&entry_MP_BC_LOAD_FAST_0,
|
||||
[MP_BC_LOAD_FAST_1] = &&entry_MP_BC_LOAD_FAST_1,
|
||||
[MP_BC_LOAD_FAST_2] = &&entry_MP_BC_LOAD_FAST_2,
|
||||
[MP_BC_LOAD_FAST_N] = &&entry_MP_BC_LOAD_FAST_N,
|
||||
[MP_BC_LOAD_DEREF] = &&entry_MP_BC_LOAD_DEREF,
|
||||
[MP_BC_LOAD_NAME] = &&entry_MP_BC_LOAD_NAME,
|
||||
[MP_BC_LOAD_GLOBAL] = &&entry_MP_BC_LOAD_GLOBAL,
|
||||
[MP_BC_LOAD_ATTR] = &&entry_MP_BC_LOAD_ATTR,
|
||||
[MP_BC_LOAD_METHOD] = &&entry_MP_BC_LOAD_METHOD,
|
||||
[MP_BC_LOAD_BUILD_CLASS] = &&entry_MP_BC_LOAD_BUILD_CLASS,
|
||||
[MP_BC_STORE_FAST_0] = &&entry_MP_BC_STORE_FAST_0,
|
||||
[MP_BC_STORE_FAST_1] = &&entry_MP_BC_STORE_FAST_1,
|
||||
[MP_BC_STORE_FAST_2] = &&entry_MP_BC_STORE_FAST_2,
|
||||
[MP_BC_STORE_FAST_N] = &&entry_MP_BC_STORE_FAST_N,
|
||||
[MP_BC_STORE_DEREF] = &&entry_MP_BC_STORE_DEREF,
|
||||
[MP_BC_STORE_NAME] = &&entry_MP_BC_STORE_NAME,
|
||||
[MP_BC_STORE_GLOBAL] = &&entry_MP_BC_STORE_GLOBAL,
|
||||
[MP_BC_STORE_ATTR] = &&entry_MP_BC_STORE_ATTR,
|
||||
[MP_BC_STORE_SUBSCR] = &&entry_MP_BC_STORE_SUBSCR,
|
||||
[MP_BC_DELETE_FAST] = &&entry_MP_BC_DELETE_FAST,
|
||||
[MP_BC_DELETE_DEREF] = &&entry_MP_BC_DELETE_DEREF,
|
||||
[MP_BC_DELETE_NAME] = &&entry_MP_BC_DELETE_NAME,
|
||||
[MP_BC_DELETE_GLOBAL] = &&entry_MP_BC_DELETE_GLOBAL,
|
||||
[MP_BC_DUP_TOP] = &&entry_MP_BC_DUP_TOP,
|
||||
[MP_BC_DUP_TOP_TWO] = &&entry_MP_BC_DUP_TOP_TWO,
|
||||
[MP_BC_POP_TOP] = &&entry_MP_BC_POP_TOP,
|
||||
[MP_BC_ROT_TWO] = &&entry_MP_BC_ROT_TWO,
|
||||
[MP_BC_ROT_THREE] = &&entry_MP_BC_ROT_THREE,
|
||||
[MP_BC_JUMP] = &&entry_MP_BC_JUMP,
|
||||
[MP_BC_POP_JUMP_IF_TRUE] = &&entry_MP_BC_POP_JUMP_IF_TRUE,
|
||||
[MP_BC_POP_JUMP_IF_FALSE] = &&entry_MP_BC_POP_JUMP_IF_FALSE,
|
||||
[MP_BC_JUMP_IF_TRUE_OR_POP] = &&entry_MP_BC_JUMP_IF_TRUE_OR_POP,
|
||||
[MP_BC_JUMP_IF_FALSE_OR_POP] = &&entry_MP_BC_JUMP_IF_FALSE_OR_POP,
|
||||
// [MP_BC_SETUP_LOOP] = &&entry_MP_BC_SETUP_LOOP,
|
||||
[MP_BC_SETUP_WITH] = &&entry_MP_BC_SETUP_WITH,
|
||||
[MP_BC_WITH_CLEANUP] = &&entry_MP_BC_WITH_CLEANUP,
|
||||
[MP_BC_UNWIND_JUMP] = &&entry_MP_BC_UNWIND_JUMP,
|
||||
[MP_BC_SETUP_EXCEPT] = &&entry_MP_BC_SETUP_EXCEPT,
|
||||
[MP_BC_SETUP_FINALLY] = &&entry_MP_BC_SETUP_FINALLY,
|
||||
[MP_BC_END_FINALLY] = &&entry_MP_BC_END_FINALLY,
|
||||
[MP_BC_GET_ITER] = &&entry_MP_BC_GET_ITER,
|
||||
[MP_BC_FOR_ITER] = &&entry_MP_BC_FOR_ITER,
|
||||
[MP_BC_POP_BLOCK] = &&entry_MP_BC_POP_BLOCK,
|
||||
[MP_BC_POP_EXCEPT] = &&entry_MP_BC_POP_EXCEPT,
|
||||
[MP_BC_NOT] = &&entry_MP_BC_NOT,
|
||||
[MP_BC_UNARY_OP] = &&entry_MP_BC_UNARY_OP,
|
||||
[MP_BC_BINARY_OP] = &&entry_MP_BC_BINARY_OP,
|
||||
[MP_BC_BUILD_TUPLE] = &&entry_MP_BC_BUILD_TUPLE,
|
||||
[MP_BC_BUILD_LIST] = &&entry_MP_BC_BUILD_LIST,
|
||||
[MP_BC_LIST_APPEND] = &&entry_MP_BC_LIST_APPEND,
|
||||
[MP_BC_BUILD_MAP] = &&entry_MP_BC_BUILD_MAP,
|
||||
[MP_BC_STORE_MAP] = &&entry_MP_BC_STORE_MAP,
|
||||
[MP_BC_MAP_ADD] = &&entry_MP_BC_MAP_ADD,
|
||||
[MP_BC_BUILD_SET] = &&entry_MP_BC_BUILD_SET,
|
||||
[MP_BC_SET_ADD] = &&entry_MP_BC_SET_ADD,
|
||||
[MP_BC_BUILD_SLICE] = &&entry_MP_BC_BUILD_SLICE,
|
||||
[MP_BC_UNPACK_SEQUENCE] = &&entry_MP_BC_UNPACK_SEQUENCE,
|
||||
[MP_BC_UNPACK_EX] = &&entry_MP_BC_UNPACK_EX,
|
||||
[MP_BC_MAKE_FUNCTION] = &&entry_MP_BC_MAKE_FUNCTION,
|
||||
[MP_BC_MAKE_FUNCTION_DEFARGS] = &&entry_MP_BC_MAKE_FUNCTION_DEFARGS,
|
||||
[MP_BC_MAKE_CLOSURE] = &&entry_MP_BC_MAKE_CLOSURE,
|
||||
[MP_BC_MAKE_CLOSURE_DEFARGS] = &&entry_MP_BC_MAKE_CLOSURE_DEFARGS,
|
||||
[MP_BC_CALL_FUNCTION] = &&entry_MP_BC_CALL_FUNCTION,
|
||||
[MP_BC_CALL_FUNCTION_VAR_KW] = &&entry_MP_BC_CALL_FUNCTION_VAR_KW,
|
||||
[MP_BC_CALL_METHOD] = &&entry_MP_BC_CALL_METHOD,
|
||||
[MP_BC_CALL_METHOD_VAR_KW] = &&entry_MP_BC_CALL_METHOD_VAR_KW,
|
||||
[MP_BC_RETURN_VALUE] = &&entry_MP_BC_RETURN_VALUE,
|
||||
[MP_BC_RAISE_VARARGS] = &&entry_MP_BC_RAISE_VARARGS,
|
||||
[MP_BC_YIELD_VALUE] = &&entry_MP_BC_YIELD_VALUE,
|
||||
[MP_BC_YIELD_FROM] = &&entry_MP_BC_YIELD_FROM,
|
||||
[MP_BC_IMPORT_NAME] = &&entry_MP_BC_IMPORT_NAME,
|
||||
[MP_BC_IMPORT_FROM] = &&entry_MP_BC_IMPORT_FROM,
|
||||
[MP_BC_IMPORT_STAR] = &&entry_MP_BC_IMPORT_STAR,
|
||||
};
|
@ -156,8 +156,8 @@ typedef double mp_float_t;
|
||||
|
||||
// Whether to use computed gotos in the VM, or a switch
|
||||
// Computed gotos are roughly 10% faster, and increase VM code size by a little
|
||||
#ifndef MICROPY_USE_COMPUTED_GOTO
|
||||
#define MICROPY_USE_COMPUTED_GOTO (0)
|
||||
#ifndef MICROPY_USE_COMPUTED_GOTOS
|
||||
#define MICROPY_USE_COMPUTED_GOTOS (0)
|
||||
#endif
|
||||
|
||||
// Additional builtin function definitions - see builtintables.c:builtin_object_table for format.
|
||||
|
116
py/vm.c
116
py/vm.c
@ -167,107 +167,19 @@ mp_vm_return_kind_t mp_execute_byte_code_2(const byte *code_info, const byte **i
|
||||
volatile mp_obj_t inject_exc) {
|
||||
// careful: be sure to declare volatile any variables read in the exception handler (written is ok, I think)
|
||||
|
||||
#if MICROPY_USE_COMPUTED_GOTO
|
||||
|
||||
# define DISPATCH() do { \
|
||||
save_ip = ip; \
|
||||
op = *ip++; \
|
||||
goto *entry_table[op]; \
|
||||
#if MICROPY_USE_COMPUTED_GOTOS
|
||||
#include "entry_table.h"
|
||||
#define DISPATCH() do { \
|
||||
save_ip = ip; \
|
||||
op = *ip++; \
|
||||
goto *entry_table[op]; \
|
||||
} while(0)
|
||||
# define ENTRY(op) entry_##op
|
||||
# define ENTRY_DEFAULT entry_default
|
||||
|
||||
static void* entry_table[256] = {
|
||||
[0 ... 255] = &&entry_default,
|
||||
[MP_BC_LOAD_CONST_FALSE] = &&entry_MP_BC_LOAD_CONST_FALSE,
|
||||
[MP_BC_LOAD_CONST_NONE] = &&entry_MP_BC_LOAD_CONST_NONE,
|
||||
[MP_BC_LOAD_CONST_TRUE] = &&entry_MP_BC_LOAD_CONST_TRUE,
|
||||
[MP_BC_LOAD_CONST_ELLIPSIS] = &&entry_MP_BC_LOAD_CONST_ELLIPSIS,
|
||||
[MP_BC_LOAD_CONST_SMALL_INT] = &&entry_MP_BC_LOAD_CONST_SMALL_INT,
|
||||
[MP_BC_LOAD_CONST_INT] = &&entry_MP_BC_LOAD_CONST_INT,
|
||||
[MP_BC_LOAD_CONST_DEC] = &&entry_MP_BC_LOAD_CONST_DEC,
|
||||
[MP_BC_LOAD_CONST_ID] = &&entry_MP_BC_LOAD_CONST_ID,
|
||||
[MP_BC_LOAD_CONST_BYTES] = &&entry_MP_BC_LOAD_CONST_BYTES,
|
||||
[MP_BC_LOAD_CONST_STRING] = &&entry_MP_BC_LOAD_CONST_STRING,
|
||||
[MP_BC_LOAD_NULL] = &&entry_MP_BC_LOAD_NULL,
|
||||
[MP_BC_LOAD_FAST_0] = &&entry_MP_BC_LOAD_FAST_0,
|
||||
[MP_BC_LOAD_FAST_1] = &&entry_MP_BC_LOAD_FAST_1,
|
||||
[MP_BC_LOAD_FAST_2] = &&entry_MP_BC_LOAD_FAST_2,
|
||||
[MP_BC_LOAD_FAST_N] = &&entry_MP_BC_LOAD_FAST_N,
|
||||
[MP_BC_LOAD_DEREF] = &&entry_MP_BC_LOAD_DEREF,
|
||||
[MP_BC_LOAD_NAME] = &&entry_MP_BC_LOAD_NAME,
|
||||
[MP_BC_LOAD_GLOBAL] = &&entry_MP_BC_LOAD_GLOBAL,
|
||||
[MP_BC_LOAD_ATTR] = &&entry_MP_BC_LOAD_ATTR,
|
||||
[MP_BC_LOAD_METHOD] = &&entry_MP_BC_LOAD_METHOD,
|
||||
[MP_BC_LOAD_BUILD_CLASS] = &&entry_MP_BC_LOAD_BUILD_CLASS,
|
||||
[MP_BC_STORE_FAST_0] = &&entry_MP_BC_STORE_FAST_0,
|
||||
[MP_BC_STORE_FAST_1] = &&entry_MP_BC_STORE_FAST_1,
|
||||
[MP_BC_STORE_FAST_2] = &&entry_MP_BC_STORE_FAST_2,
|
||||
[MP_BC_STORE_FAST_N] = &&entry_MP_BC_STORE_FAST_N,
|
||||
[MP_BC_STORE_DEREF] = &&entry_MP_BC_STORE_DEREF,
|
||||
[MP_BC_STORE_NAME] = &&entry_MP_BC_STORE_NAME,
|
||||
[MP_BC_STORE_GLOBAL] = &&entry_MP_BC_STORE_GLOBAL,
|
||||
[MP_BC_STORE_ATTR] = &&entry_MP_BC_STORE_ATTR,
|
||||
[MP_BC_STORE_SUBSCR] = &&entry_MP_BC_STORE_SUBSCR,
|
||||
[MP_BC_DELETE_FAST] = &&entry_MP_BC_DELETE_FAST,
|
||||
[MP_BC_DELETE_DEREF] = &&entry_MP_BC_DELETE_DEREF,
|
||||
[MP_BC_DELETE_NAME] = &&entry_MP_BC_DELETE_NAME,
|
||||
[MP_BC_DELETE_GLOBAL] = &&entry_MP_BC_DELETE_GLOBAL,
|
||||
[MP_BC_DUP_TOP] = &&entry_MP_BC_DUP_TOP,
|
||||
[MP_BC_DUP_TOP_TWO] = &&entry_MP_BC_DUP_TOP_TWO,
|
||||
[MP_BC_POP_TOP] = &&entry_MP_BC_POP_TOP,
|
||||
[MP_BC_ROT_TWO] = &&entry_MP_BC_ROT_TWO,
|
||||
[MP_BC_ROT_THREE] = &&entry_MP_BC_ROT_THREE,
|
||||
[MP_BC_JUMP] = &&entry_MP_BC_JUMP,
|
||||
[MP_BC_POP_JUMP_IF_TRUE] = &&entry_MP_BC_POP_JUMP_IF_TRUE,
|
||||
[MP_BC_POP_JUMP_IF_FALSE] = &&entry_MP_BC_POP_JUMP_IF_FALSE,
|
||||
[MP_BC_JUMP_IF_TRUE_OR_POP] = &&entry_MP_BC_JUMP_IF_TRUE_OR_POP,
|
||||
[MP_BC_JUMP_IF_FALSE_OR_POP] = &&entry_MP_BC_JUMP_IF_FALSE_OR_POP,
|
||||
// [MP_BC_SETUP_LOOP] = &&entry_MP_BC_SETUP_LOOP,
|
||||
[MP_BC_SETUP_WITH] = &&entry_MP_BC_SETUP_WITH,
|
||||
[MP_BC_WITH_CLEANUP] = &&entry_MP_BC_WITH_CLEANUP,
|
||||
[MP_BC_UNWIND_JUMP] = &&entry_MP_BC_UNWIND_JUMP,
|
||||
[MP_BC_SETUP_EXCEPT] = &&entry_MP_BC_SETUP_EXCEPT,
|
||||
[MP_BC_SETUP_FINALLY] = &&entry_MP_BC_SETUP_FINALLY,
|
||||
[MP_BC_END_FINALLY] = &&entry_MP_BC_END_FINALLY,
|
||||
[MP_BC_GET_ITER] = &&entry_MP_BC_GET_ITER,
|
||||
[MP_BC_FOR_ITER] = &&entry_MP_BC_FOR_ITER,
|
||||
[MP_BC_POP_BLOCK] = &&entry_MP_BC_POP_BLOCK,
|
||||
[MP_BC_POP_EXCEPT] = &&entry_MP_BC_POP_EXCEPT,
|
||||
[MP_BC_NOT] = &&entry_MP_BC_NOT,
|
||||
[MP_BC_UNARY_OP] = &&entry_MP_BC_UNARY_OP,
|
||||
[MP_BC_BINARY_OP] = &&entry_MP_BC_BINARY_OP,
|
||||
[MP_BC_BUILD_TUPLE] = &&entry_MP_BC_BUILD_TUPLE,
|
||||
[MP_BC_BUILD_LIST] = &&entry_MP_BC_BUILD_LIST,
|
||||
[MP_BC_LIST_APPEND] = &&entry_MP_BC_LIST_APPEND,
|
||||
[MP_BC_BUILD_MAP] = &&entry_MP_BC_BUILD_MAP,
|
||||
[MP_BC_STORE_MAP] = &&entry_MP_BC_STORE_MAP,
|
||||
[MP_BC_MAP_ADD] = &&entry_MP_BC_MAP_ADD,
|
||||
[MP_BC_BUILD_SET] = &&entry_MP_BC_BUILD_SET,
|
||||
[MP_BC_SET_ADD] = &&entry_MP_BC_SET_ADD,
|
||||
[MP_BC_BUILD_SLICE] = &&entry_MP_BC_BUILD_SLICE,
|
||||
[MP_BC_UNPACK_SEQUENCE] = &&entry_MP_BC_UNPACK_SEQUENCE,
|
||||
[MP_BC_UNPACK_EX] = &&entry_MP_BC_UNPACK_EX,
|
||||
[MP_BC_MAKE_FUNCTION] = &&entry_MP_BC_MAKE_FUNCTION,
|
||||
[MP_BC_MAKE_FUNCTION_DEFARGS] = &&entry_MP_BC_MAKE_FUNCTION_DEFARGS,
|
||||
[MP_BC_MAKE_CLOSURE] = &&entry_MP_BC_MAKE_CLOSURE,
|
||||
[MP_BC_MAKE_CLOSURE_DEFARGS] = &&entry_MP_BC_MAKE_CLOSURE_DEFARGS,
|
||||
[MP_BC_CALL_FUNCTION] = &&entry_MP_BC_CALL_FUNCTION,
|
||||
[MP_BC_CALL_FUNCTION_VAR_KW] = &&entry_MP_BC_CALL_FUNCTION_VAR_KW,
|
||||
[MP_BC_CALL_METHOD] = &&entry_MP_BC_CALL_METHOD,
|
||||
[MP_BC_CALL_METHOD_VAR_KW] = &&entry_MP_BC_CALL_METHOD_VAR_KW,
|
||||
[MP_BC_RETURN_VALUE] = &&entry_MP_BC_RETURN_VALUE,
|
||||
[MP_BC_RAISE_VARARGS] = &&entry_MP_BC_RAISE_VARARGS,
|
||||
[MP_BC_YIELD_VALUE] = &&entry_MP_BC_YIELD_VALUE,
|
||||
[MP_BC_YIELD_FROM] = &&entry_MP_BC_YIELD_FROM,
|
||||
[MP_BC_IMPORT_NAME] = &&entry_MP_BC_IMPORT_NAME,
|
||||
[MP_BC_IMPORT_FROM] = &&entry_MP_BC_IMPORT_FROM,
|
||||
[MP_BC_IMPORT_STAR] = &&entry_MP_BC_IMPORT_STAR,
|
||||
};
|
||||
#define ENTRY(op) entry_##op
|
||||
#define ENTRY_DEFAULT entry_default
|
||||
#else
|
||||
# define DISPATCH() break
|
||||
# define ENTRY(op) case op
|
||||
# define ENTRY_DEFAULT default
|
||||
#define DISPATCH() break
|
||||
#define ENTRY(op) case op
|
||||
#define ENTRY_DEFAULT default
|
||||
#endif
|
||||
|
||||
int op = 0;
|
||||
@ -299,7 +211,7 @@ outer_dispatch_loop:
|
||||
// loop to execute byte code
|
||||
for (;;) {
|
||||
dispatch_loop:
|
||||
#if MICROPY_USE_COMPUTED_GOTO
|
||||
#if MICROPY_USE_COMPUTED_GOTOS
|
||||
DISPATCH();
|
||||
#else
|
||||
save_ip = ip;
|
||||
@ -1005,8 +917,8 @@ yield:
|
||||
nlr_pop();
|
||||
fastn[0] = obj1;
|
||||
return MP_VM_RETURN_EXCEPTION;
|
||||
#if !MICROPY_USE_COMPUTED_GOTO
|
||||
}
|
||||
#if !MICROPY_USE_COMPUTED_GOTOS
|
||||
} // switch
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -14,7 +14,7 @@
|
||||
#define MICROPY_FLOAT_IMPL (MICROPY_FLOAT_IMPL_DOUBLE)
|
||||
#define MICROPY_LONGINT_IMPL (MICROPY_LONGINT_IMPL_MPZ)
|
||||
#define MICROPY_PATH_MAX (PATH_MAX)
|
||||
#define MICROPY_USE_COMPUTED_GOTO (1)
|
||||
#define MICROPY_USE_COMPUTED_GOTOS (1)
|
||||
#define MICROPY_MOD_SYS_STDFILES (1)
|
||||
|
||||
// type definitions for the specific machine
|
||||
|
Loading…
Reference in New Issue
Block a user