mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30:18 +00:00
up
This commit is contained in:
parent
8f3f08503a
commit
2d8db01cf1
27
src/ceval.h
27
src/ceval.h
@ -18,18 +18,20 @@ inline PyObject* VM::_run_top_frame(){
|
|||||||
try{
|
try{
|
||||||
if(need_raise){ need_raise = false; _raise(); }
|
if(need_raise){ need_raise = false; _raise(); }
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
|
#define USE_COMPUTED_GOTO 0
|
||||||
|
|
||||||
|
#if USE_COMPUTED_GOTO
|
||||||
static void* OP_LABELS[] = {
|
static void* OP_LABELS[] = {
|
||||||
#define OPCODE(name) &&CASE_OP_##name,
|
#define OPCODE(name) &&CASE_OP_##name,
|
||||||
#include "opcodes.h"
|
#include "opcodes.h"
|
||||||
#undef OPCODE
|
#undef OPCODE
|
||||||
};
|
};
|
||||||
|
|
||||||
#define USE_COMPUTED_GOTO 1
|
|
||||||
|
|
||||||
#if USE_COMPUTED_GOTO
|
|
||||||
#define DISPATCH() {heap._auto_collect(); byte = frame->next_bytecode(); goto *OP_LABELS[byte.op];}
|
#define DISPATCH() {heap._auto_collect(); byte = frame->next_bytecode(); goto *OP_LABELS[byte.op];}
|
||||||
|
#define PREDICTED_DISPATCH(x) {heap._auto_collect(); byte = frame->next_bytecode(); if(byte.op == OP_##x) goto CASE_OP_##x; goto *OP_LABELS[byte.op];}
|
||||||
#else
|
#else
|
||||||
#define DISPATCH() {heap._auto_collect(); byte = frame->next_bytecode(); goto __NEXT_STEP;}
|
#define DISPATCH() {heap._auto_collect(); byte = frame->next_bytecode(); goto __NEXT_STEP;}
|
||||||
|
#define PREDICTED_DISPATCH(x) {heap._auto_collect(); byte = frame->next_bytecode(); if(byte.op == OP_##x) goto CASE_OP_##x; goto __NEXT_STEP;}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define TARGET(op) case OP_##op: \
|
#define TARGET(op) case OP_##op: \
|
||||||
@ -218,41 +220,56 @@ __NEXT_STEP:;
|
|||||||
args[1] = frame->popx(); \
|
args[1] = frame->popx(); \
|
||||||
args[0] = frame->top(); \
|
args[0] = frame->top(); \
|
||||||
frame->top() = fast_call(func, std::move(args));\
|
frame->top() = fast_call(func, std::move(args));\
|
||||||
} \
|
}
|
||||||
DISPATCH();
|
|
||||||
|
|
||||||
TARGET(BINARY_ADD)
|
TARGET(BINARY_ADD)
|
||||||
INT_BINARY_OP(+, __add__)
|
INT_BINARY_OP(+, __add__)
|
||||||
|
DISPATCH()
|
||||||
TARGET(BINARY_SUB)
|
TARGET(BINARY_SUB)
|
||||||
INT_BINARY_OP(-, __sub__)
|
INT_BINARY_OP(-, __sub__)
|
||||||
|
DISPATCH()
|
||||||
TARGET(BINARY_MUL)
|
TARGET(BINARY_MUL)
|
||||||
INT_BINARY_OP(*, __mul__)
|
INT_BINARY_OP(*, __mul__)
|
||||||
|
DISPATCH()
|
||||||
TARGET(BINARY_FLOORDIV)
|
TARGET(BINARY_FLOORDIV)
|
||||||
INT_BINARY_OP(/, __floordiv__)
|
INT_BINARY_OP(/, __floordiv__)
|
||||||
|
DISPATCH()
|
||||||
TARGET(BINARY_MOD)
|
TARGET(BINARY_MOD)
|
||||||
INT_BINARY_OP(%, __mod__)
|
INT_BINARY_OP(%, __mod__)
|
||||||
|
DISPATCH()
|
||||||
TARGET(COMPARE_LT)
|
TARGET(COMPARE_LT)
|
||||||
INT_BINARY_OP(<, __lt__)
|
INT_BINARY_OP(<, __lt__)
|
||||||
|
PREDICTED_DISPATCH(POP_JUMP_IF_FALSE)
|
||||||
TARGET(COMPARE_LE)
|
TARGET(COMPARE_LE)
|
||||||
INT_BINARY_OP(<=, __le__)
|
INT_BINARY_OP(<=, __le__)
|
||||||
|
PREDICTED_DISPATCH(POP_JUMP_IF_FALSE)
|
||||||
TARGET(COMPARE_EQ)
|
TARGET(COMPARE_EQ)
|
||||||
INT_BINARY_OP(==, __eq__)
|
INT_BINARY_OP(==, __eq__)
|
||||||
|
PREDICTED_DISPATCH(POP_JUMP_IF_FALSE)
|
||||||
TARGET(COMPARE_NE)
|
TARGET(COMPARE_NE)
|
||||||
INT_BINARY_OP(!=, __ne__)
|
INT_BINARY_OP(!=, __ne__)
|
||||||
|
PREDICTED_DISPATCH(POP_JUMP_IF_FALSE)
|
||||||
TARGET(COMPARE_GT)
|
TARGET(COMPARE_GT)
|
||||||
INT_BINARY_OP(>, __gt__)
|
INT_BINARY_OP(>, __gt__)
|
||||||
|
PREDICTED_DISPATCH(POP_JUMP_IF_FALSE)
|
||||||
TARGET(COMPARE_GE)
|
TARGET(COMPARE_GE)
|
||||||
INT_BINARY_OP(>=, __ge__)
|
INT_BINARY_OP(>=, __ge__)
|
||||||
|
PREDICTED_DISPATCH(POP_JUMP_IF_FALSE)
|
||||||
TARGET(BITWISE_LSHIFT)
|
TARGET(BITWISE_LSHIFT)
|
||||||
INT_BINARY_OP(<<, __lshift__)
|
INT_BINARY_OP(<<, __lshift__)
|
||||||
|
DISPATCH()
|
||||||
TARGET(BITWISE_RSHIFT)
|
TARGET(BITWISE_RSHIFT)
|
||||||
INT_BINARY_OP(>>, __rshift__)
|
INT_BINARY_OP(>>, __rshift__)
|
||||||
|
DISPATCH()
|
||||||
TARGET(BITWISE_AND)
|
TARGET(BITWISE_AND)
|
||||||
INT_BINARY_OP(&, __and__)
|
INT_BINARY_OP(&, __and__)
|
||||||
|
DISPATCH()
|
||||||
TARGET(BITWISE_OR)
|
TARGET(BITWISE_OR)
|
||||||
INT_BINARY_OP(|, __or__)
|
INT_BINARY_OP(|, __or__)
|
||||||
|
DISPATCH()
|
||||||
TARGET(BITWISE_XOR)
|
TARGET(BITWISE_XOR)
|
||||||
INT_BINARY_OP(^, __xor__)
|
INT_BINARY_OP(^, __xor__)
|
||||||
|
DISPATCH()
|
||||||
#undef INT_BINARY_OP
|
#undef INT_BINARY_OP
|
||||||
TARGET(IS_OP) {
|
TARGET(IS_OP) {
|
||||||
PyObject* rhs = frame->popx();
|
PyObject* rhs = frame->popx();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user