mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 19:40:18 +00:00
some inline
This commit is contained in:
parent
887c9cea38
commit
bb93dd54dd
59
src/ceval.h
59
src/ceval.h
@ -5,9 +5,21 @@
|
|||||||
|
|
||||||
namespace pkpy{
|
namespace pkpy{
|
||||||
|
|
||||||
#define DISPATCH() goto __NEXT_STEP
|
inline PyObject* VM::_run_top_frame(){
|
||||||
|
FrameId frame = top_frame();
|
||||||
|
const int base_id = frame.index;
|
||||||
|
bool need_raise = false;
|
||||||
|
PyObject* __ret;
|
||||||
|
|
||||||
inline PyObject* VM::run_frame(FrameId frame){
|
while(true){
|
||||||
|
#if DEBUG_EXTRA_CHECK
|
||||||
|
if(frame->id < base_id) UNREACHABLE();
|
||||||
|
#endif
|
||||||
|
try{
|
||||||
|
if(need_raise){ need_raise = false; _raise(); }
|
||||||
|
/**********************************************************************/
|
||||||
|
#define DISPATCH() goto __NEXT_STEP
|
||||||
|
{
|
||||||
__NEXT_STEP:;
|
__NEXT_STEP:;
|
||||||
/* NOTE:
|
/* NOTE:
|
||||||
* Be aware of accidental gc!
|
* Be aware of accidental gc!
|
||||||
@ -284,7 +296,7 @@ __NEXT_STEP:;
|
|||||||
if(byte.op == OP_CALL_UNPACK) unpack_args(args);
|
if(byte.op == OP_CALL_UNPACK) unpack_args(args);
|
||||||
PyObject* callable = frame->popx();
|
PyObject* callable = frame->popx();
|
||||||
PyObject* ret = call(callable, std::move(args), no_arg(), true);
|
PyObject* ret = call(callable, std::move(args), no_arg(), true);
|
||||||
if(ret == _py_op_call) return ret;
|
if(ret == _py_op_call) { __ret=ret; goto __PY_OP_CALL; }
|
||||||
frame->push(std::move(ret));
|
frame->push(std::move(ret));
|
||||||
} DISPATCH();
|
} DISPATCH();
|
||||||
case OP_CALL_KWARGS: case OP_CALL_KWARGS_UNPACK: {
|
case OP_CALL_KWARGS: case OP_CALL_KWARGS_UNPACK: {
|
||||||
@ -300,10 +312,10 @@ __NEXT_STEP:;
|
|||||||
if(byte.op == OP_CALL_KWARGS_UNPACK) unpack_args(args);
|
if(byte.op == OP_CALL_KWARGS_UNPACK) unpack_args(args);
|
||||||
PyObject* callable = frame->popx();
|
PyObject* callable = frame->popx();
|
||||||
PyObject* ret = call(callable, std::move(args), kwargs, true);
|
PyObject* ret = call(callable, std::move(args), kwargs, true);
|
||||||
if(ret == _py_op_call) return ret;
|
if(ret == _py_op_call) { __ret=ret; goto __PY_OP_CALL; }
|
||||||
frame->push(std::move(ret));
|
frame->push(std::move(ret));
|
||||||
} DISPATCH();
|
} DISPATCH();
|
||||||
case OP_RETURN_VALUE: return frame->popx();
|
case OP_RETURN_VALUE: { __ret=frame->popx(); goto __PY_SIMPLE_RETURN; }
|
||||||
case OP_YIELD_VALUE: return _py_op_yield;
|
case OP_YIELD_VALUE: return _py_op_yield;
|
||||||
/*****************************************/
|
/*****************************************/
|
||||||
case OP_LIST_APPEND: {
|
case OP_LIST_APPEND: {
|
||||||
@ -456,7 +468,42 @@ __NEXT_STEP:;
|
|||||||
}
|
}
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef DISPATCH
|
#undef DISPATCH
|
||||||
|
/**********************************************************************/
|
||||||
|
__PY_SIMPLE_RETURN:
|
||||||
|
if(frame.index == base_id){ // [ frameBase<- ]
|
||||||
|
callstack.pop();
|
||||||
|
return __ret;
|
||||||
|
}else{
|
||||||
|
callstack.pop();
|
||||||
|
frame = top_frame();
|
||||||
|
frame->push(__ret);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
__PY_OP_CALL:
|
||||||
|
frame = top_frame(); // [ frameBase, newFrame<- ]
|
||||||
|
continue;
|
||||||
|
}catch(HandledException& e){
|
||||||
|
continue;
|
||||||
|
}catch(UnhandledException& e){
|
||||||
|
PyObject* obj = frame->popx();
|
||||||
|
Exception& _e = CAST(Exception&, obj);
|
||||||
|
_e.st_push(frame->snapshot());
|
||||||
|
callstack.pop();
|
||||||
|
if(callstack.empty()){
|
||||||
|
#if DEBUG_FULL_EXCEPTION
|
||||||
|
std::cerr << _e.summary() << std::endl;
|
||||||
|
#endif
|
||||||
|
throw _e;
|
||||||
|
}
|
||||||
|
frame = top_frame();
|
||||||
|
frame->push(obj);
|
||||||
|
if(frame.index < base_id) throw ToBeRaisedException();
|
||||||
|
need_raise = true;
|
||||||
|
}catch(ToBeRaisedException& e){
|
||||||
|
need_raise = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace pkpy
|
} // namespace pkpy
|
@ -64,7 +64,7 @@ public:
|
|||||||
inline PyObject* Generator::next(){
|
inline PyObject* Generator::next(){
|
||||||
if(state == 2) return nullptr;
|
if(state == 2) return nullptr;
|
||||||
vm->_push_new_frame(std::move(frame));
|
vm->_push_new_frame(std::move(frame));
|
||||||
PyObject* ret = vm->_exec();
|
PyObject* ret = vm->_run_top_frame();
|
||||||
if(ret == vm->_py_op_yield){
|
if(ret == vm->_py_op_yield){
|
||||||
frame = std::move(vm->callstack.top());
|
frame = std::move(vm->callstack.top());
|
||||||
vm->callstack.pop();
|
vm->callstack.pop();
|
||||||
|
57
src/vm.h
57
src/vm.h
@ -64,8 +64,6 @@ public:
|
|||||||
stack< Frame > callstack;
|
stack< Frame > callstack;
|
||||||
std::vector<PyTypeInfo> _all_types;
|
std::vector<PyTypeInfo> _all_types;
|
||||||
|
|
||||||
PyObject* run_frame(FrameId frame);
|
|
||||||
|
|
||||||
NameDict _modules; // loaded modules
|
NameDict _modules; // loaded modules
|
||||||
std::map<StrName, Str> _lazy_modules; // lazy loaded modules
|
std::map<StrName, Str> _lazy_modules; // lazy loaded modules
|
||||||
|
|
||||||
@ -206,7 +204,7 @@ public:
|
|||||||
template<typename ...Args>
|
template<typename ...Args>
|
||||||
PyObject* _exec(Args&&... args){
|
PyObject* _exec(Args&&... args){
|
||||||
_push_new_frame(std::forward<Args>(args)...);
|
_push_new_frame(std::forward<Args>(args)...);
|
||||||
return _exec();
|
return _run_top_frame();
|
||||||
}
|
}
|
||||||
|
|
||||||
PyObject* property(NativeFuncRaw fget){
|
PyObject* property(NativeFuncRaw fget){
|
||||||
@ -349,7 +347,7 @@ public:
|
|||||||
template<int ARGC>
|
template<int ARGC>
|
||||||
void bind_func(PyObject*, Str, NativeFuncRaw);
|
void bind_func(PyObject*, Str, NativeFuncRaw);
|
||||||
void _error(Exception);
|
void _error(Exception);
|
||||||
PyObject* _exec();
|
PyObject* _run_top_frame();
|
||||||
void post_init();
|
void post_init();
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -747,7 +745,7 @@ inline PyObject* VM::call(PyObject* callable, Args args, const Args& kwargs, boo
|
|||||||
}
|
}
|
||||||
_push_new_frame(fn.decl->code, _module, locals, fn._closure);
|
_push_new_frame(fn.decl->code, _module, locals, fn._closure);
|
||||||
if(opCall) return _py_op_call;
|
if(opCall) return _py_op_call;
|
||||||
return _exec();
|
return _run_top_frame();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(is_type(callable, tp_type)){
|
if(is_type(callable, tp_type)){
|
||||||
@ -906,55 +904,6 @@ inline void VM::_error(Exception e){
|
|||||||
_raise();
|
_raise();
|
||||||
}
|
}
|
||||||
|
|
||||||
inline PyObject* VM::_exec(){
|
|
||||||
FrameId frame = top_frame();
|
|
||||||
const int base_id = frame.index;
|
|
||||||
bool need_raise = false;
|
|
||||||
PyObject* ret;
|
|
||||||
|
|
||||||
while(true){
|
|
||||||
#if DEBUG_EXTRA_CHECK
|
|
||||||
if(frame->id < base_id) UNREACHABLE();
|
|
||||||
#endif
|
|
||||||
try{
|
|
||||||
if(need_raise){ need_raise = false; _raise(); }
|
|
||||||
ret = run_frame(frame);
|
|
||||||
if(ret == _py_op_yield) return _py_op_yield;
|
|
||||||
if(ret != _py_op_call){
|
|
||||||
if(frame.index == base_id){ // [ frameBase<- ]
|
|
||||||
callstack.pop();
|
|
||||||
return ret;
|
|
||||||
}else{
|
|
||||||
callstack.pop();
|
|
||||||
frame = top_frame();
|
|
||||||
frame->push(ret);
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
frame = top_frame(); // [ frameBase, newFrame<- ]
|
|
||||||
}
|
|
||||||
}catch(HandledException& e){
|
|
||||||
continue;
|
|
||||||
}catch(UnhandledException& e){
|
|
||||||
PyObject* obj = frame->popx();
|
|
||||||
Exception& _e = CAST(Exception&, obj);
|
|
||||||
_e.st_push(frame->snapshot());
|
|
||||||
callstack.pop();
|
|
||||||
if(callstack.empty()){
|
|
||||||
#if DEBUG_FULL_EXCEPTION
|
|
||||||
std::cerr << _e.summary() << std::endl;
|
|
||||||
#endif
|
|
||||||
throw _e;
|
|
||||||
}
|
|
||||||
frame = top_frame();
|
|
||||||
frame->push(obj);
|
|
||||||
if(frame.index < base_id) throw ToBeRaisedException();
|
|
||||||
need_raise = true;
|
|
||||||
}catch(ToBeRaisedException& e){
|
|
||||||
need_raise = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void ManagedHeap::mark() {
|
inline void ManagedHeap::mark() {
|
||||||
for(PyObject* obj: _no_gc) OBJ_MARK(obj);
|
for(PyObject* obj: _no_gc) OBJ_MARK(obj);
|
||||||
for(auto& frame : vm->callstack.data()) frame._gc_mark();
|
for(auto& frame : vm->callstack.data()) frame._gc_mark();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user