mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30:18 +00:00
some fix
This commit is contained in:
parent
1417dc37df
commit
844813b787
@ -69,7 +69,7 @@ struct ValueStack {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct Frame {
|
struct Frame {
|
||||||
int _ip;
|
const Bytecode* _ip_addr;
|
||||||
// This is for unwinding only, use `actual_sp_base()` for value stack access
|
// This is for unwinding only, use `actual_sp_base()` for value stack access
|
||||||
PyVar* _sp_base;
|
PyVar* _sp_base;
|
||||||
|
|
||||||
@ -80,18 +80,19 @@ struct Frame {
|
|||||||
|
|
||||||
NameDict& f_globals() { return _module->attr(); }
|
NameDict& f_globals() { return _module->attr(); }
|
||||||
PyVar f_closure_try_get(StrName name);
|
PyVar f_closure_try_get(StrName name);
|
||||||
|
int ip() const { return _ip_addr - co->codes.data(); }
|
||||||
|
|
||||||
// function scope
|
// function scope
|
||||||
Frame(PyVar* p0, const CodeObject* co, PyVar _module, PyVar _callable, PyVar* _locals_base)
|
Frame(PyVar* p0, const CodeObject* co, PyVar _module, PyVar _callable, PyVar* _locals_base)
|
||||||
: _ip(-1), _sp_base(p0), co(co), _module(_module), _callable(_callable), _locals(co, _locals_base) { }
|
: _ip_addr(co->codes.data()-1), _sp_base(p0), co(co), _module(_module), _callable(_callable), _locals(co, _locals_base) { }
|
||||||
|
|
||||||
// exec/eval
|
// exec/eval
|
||||||
Frame(PyVar* p0, const CodeObject* co, PyVar _module, PyVar _callable, FastLocals _locals)
|
Frame(PyVar* p0, const CodeObject* co, PyVar _module, PyVar _callable, FastLocals _locals)
|
||||||
: _ip(-1), _sp_base(p0), co(co), _module(_module), _callable(_callable), _locals(_locals) { }
|
: _ip_addr(co->codes.data()-1), _sp_base(p0), co(co), _module(_module), _callable(_callable), _locals(_locals) { }
|
||||||
|
|
||||||
// global scope
|
// global scope
|
||||||
Frame(PyVar* p0, const CodeObject_& co, PyVar _module)
|
Frame(PyVar* p0, const CodeObject_& co, PyVar _module)
|
||||||
: _ip(-1), _sp_base(p0), co(co.get()), _module(_module), _callable(nullptr), _locals(co.get(), p0) {}
|
: _ip_addr(co->codes.data()-1), _sp_base(p0), co(co.get()), _module(_module), _callable(nullptr), _locals(co.get(), p0) {}
|
||||||
|
|
||||||
PyVar* actual_sp_base() const { return _locals.a; }
|
PyVar* actual_sp_base() const { return _locals.a; }
|
||||||
|
|
||||||
@ -103,12 +104,12 @@ struct Frame {
|
|||||||
int _exit_block(ValueStack*, int);
|
int _exit_block(ValueStack*, int);
|
||||||
|
|
||||||
[[nodiscard]] int prepare_loop_break(ValueStack* s_data){
|
[[nodiscard]] int prepare_loop_break(ValueStack* s_data){
|
||||||
int target = co->_get_block_codei(_ip).end;
|
int target = co->_get_block_codei(ip()).end;
|
||||||
prepare_jump_break(s_data, target);
|
prepare_jump_break(s_data, target);
|
||||||
return target;
|
return target;
|
||||||
}
|
}
|
||||||
|
|
||||||
int curr_lineno() const { return co->lines[_ip].lineno; }
|
int curr_lineno() const { return co->lines[ip()].lineno; }
|
||||||
|
|
||||||
void _gc_mark() const {
|
void _gc_mark() const {
|
||||||
PK_OBJ_MARK(_module);
|
PK_OBJ_MARK(_module);
|
||||||
|
@ -94,8 +94,8 @@ bool VM::py_ge(PyVar _0, PyVar _1){
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define DISPATCH() { frame->_ip++; goto __NEXT_STEP; }
|
#define DISPATCH() { frame->_ip_addr++; goto __NEXT_STEP; }
|
||||||
#define DISPATCH_JUMP(__target) { frame->_ip = __target; goto __NEXT_STEP; }
|
#define DISPATCH_JUMP(__target) { frame->_ip_addr = co_codes+__target; goto __NEXT_STEP; }
|
||||||
|
|
||||||
PyVar VM::__run_top_frame(){
|
PyVar VM::__run_top_frame(){
|
||||||
Frame* frame = &callstack.top();
|
Frame* frame = &callstack.top();
|
||||||
@ -107,12 +107,16 @@ PyVar VM::__run_top_frame(){
|
|||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
{
|
{
|
||||||
__NEXT_FRAME:
|
__NEXT_FRAME:
|
||||||
|
// TODO: when jit is enabled, co_codes may not be const
|
||||||
|
const Bytecode* co_codes = frame->co->codes.data();
|
||||||
|
Bytecode byte;
|
||||||
|
|
||||||
if(__internal_exception.type == InternalExceptionType::Null){
|
if(__internal_exception.type == InternalExceptionType::Null){
|
||||||
// None
|
// None
|
||||||
frame->_ip++;
|
frame->_ip_addr++;
|
||||||
}else if(__internal_exception.type == InternalExceptionType::Handled){
|
}else if(__internal_exception.type == InternalExceptionType::Handled){
|
||||||
// HandledException + continue
|
// HandledException + continue
|
||||||
frame->_ip = __internal_exception.arg;
|
frame->_ip_addr = co_codes + __internal_exception.arg;
|
||||||
__internal_exception = {};
|
__internal_exception = {};
|
||||||
}else{
|
}else{
|
||||||
// UnhandledException + continue (need_raise = true)
|
// UnhandledException + continue (need_raise = true)
|
||||||
@ -121,12 +125,8 @@ __NEXT_FRAME:
|
|||||||
__raise_exc(); // no return
|
__raise_exc(); // no return
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: when jit is enabled, co_codes may not be const
|
|
||||||
const Bytecode* co_codes = frame->co->codes.data();
|
|
||||||
Bytecode byte;
|
|
||||||
|
|
||||||
__NEXT_STEP:
|
__NEXT_STEP:
|
||||||
byte = co_codes[frame->_ip];
|
byte = *frame->_ip_addr;
|
||||||
CEVAL_STEP_CALLBACK()
|
CEVAL_STEP_CALLBACK()
|
||||||
|
|
||||||
#if PK_DEBUG_CEVAL_STEP
|
#if PK_DEBUG_CEVAL_STEP
|
||||||
@ -542,13 +542,11 @@ __NEXT_STEP:
|
|||||||
case OP_COMPARE_EQ:{
|
case OP_COMPARE_EQ:{
|
||||||
PyVar _1 = POPX();
|
PyVar _1 = POPX();
|
||||||
PyVar _0 = TOP();
|
PyVar _0 = TOP();
|
||||||
PREDICT_INT_OP(==)
|
|
||||||
TOP() = VAR(py_eq(_0, _1));
|
TOP() = VAR(py_eq(_0, _1));
|
||||||
} DISPATCH()
|
} DISPATCH()
|
||||||
case OP_COMPARE_NE:{
|
case OP_COMPARE_NE:{
|
||||||
PyVar _1 = POPX();
|
PyVar _1 = POPX();
|
||||||
PyVar _0 = TOP();
|
PyVar _0 = TOP();
|
||||||
PREDICT_INT_OP(!=)
|
|
||||||
TOP() = VAR(py_ne(_0, _1));
|
TOP() = VAR(py_ne(_0, _1));
|
||||||
} DISPATCH()
|
} DISPATCH()
|
||||||
case OP_COMPARE_GT:{
|
case OP_COMPARE_GT:{
|
||||||
|
@ -25,7 +25,7 @@ namespace pkpy{
|
|||||||
|
|
||||||
int Frame::prepare_jump_exception_handler(ValueStack* _s){
|
int Frame::prepare_jump_exception_handler(ValueStack* _s){
|
||||||
// try to find a parent try block
|
// try to find a parent try block
|
||||||
int block = co->iblocks[_ip];
|
int block = co->iblocks[ip()];
|
||||||
while(block >= 0){
|
while(block >= 0){
|
||||||
if(co->blocks[block].type == CodeBlockType::TRY_EXCEPT) break;
|
if(co->blocks[block].type == CodeBlockType::TRY_EXCEPT) break;
|
||||||
block = co->blocks[block].parent;
|
block = co->blocks[block].parent;
|
||||||
@ -47,7 +47,7 @@ namespace pkpy{
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Frame::prepare_jump_break(ValueStack* _s, int target){
|
void Frame::prepare_jump_break(ValueStack* _s, int target){
|
||||||
int i = co->iblocks[_ip];
|
int i = co->iblocks[ip()];
|
||||||
if(target >= co->codes.size()){
|
if(target >= co->codes.size()){
|
||||||
while(i>=0) i = _exit_block(_s, i);
|
while(i>=0) i = _exit_block(_s, i);
|
||||||
}else{
|
}else{
|
||||||
|
@ -19,7 +19,7 @@ void LineProfiler::begin(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
void LineProfiler::_step(int callstack_size, Frame* frame){
|
void LineProfiler::_step(int callstack_size, Frame* frame){
|
||||||
auto line_info = frame->co->lines[frame->_ip];
|
auto line_info = frame->co->lines[frame->ip()];
|
||||||
if(line_info.is_virtual) return;
|
if(line_info.is_virtual) return;
|
||||||
std::string_view filename = frame->co->src->filename.sv();
|
std::string_view filename = frame->co->src->filename.sv();
|
||||||
int line = line_info.lineno;
|
int line = line_info.lineno;
|
||||||
|
@ -224,6 +224,7 @@ namespace pkpy{
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool VM::py_eq(PyVar lhs, PyVar rhs){
|
bool VM::py_eq(PyVar lhs, PyVar rhs){
|
||||||
|
if(is_int(lhs) && is_int(rhs)) return lhs.as<i64>() == rhs.as<i64>();
|
||||||
const PyTypeInfo* ti = _tp_info(lhs);
|
const PyTypeInfo* ti = _tp_info(lhs);
|
||||||
PyVar res;
|
PyVar res;
|
||||||
if(ti->m__eq__){
|
if(ti->m__eq__){
|
||||||
@ -1394,12 +1395,12 @@ void VM::__raise_exc(bool re_raise){
|
|||||||
Frame* frame = &callstack.top();
|
Frame* frame = &callstack.top();
|
||||||
Exception& e = PK_OBJ_GET(Exception, s_data.top());
|
Exception& e = PK_OBJ_GET(Exception, s_data.top());
|
||||||
if(!re_raise){
|
if(!re_raise){
|
||||||
e._ip_on_error = frame->_ip;
|
e._ip_on_error = frame->ip();
|
||||||
e._code_on_error = (void*)frame->co;
|
e._code_on_error = (void*)frame->co;
|
||||||
}
|
}
|
||||||
int next_ip = frame->prepare_jump_exception_handler(&s_data);
|
int next_ip = frame->prepare_jump_exception_handler(&s_data);
|
||||||
|
|
||||||
int actual_ip = frame->_ip;
|
int actual_ip = frame->ip();
|
||||||
if(e._ip_on_error >= 0 && e._code_on_error == (void*)frame->co) actual_ip = e._ip_on_error;
|
if(e._ip_on_error >= 0 && e._code_on_error == (void*)frame->co) actual_ip = e._ip_on_error;
|
||||||
int current_line = frame->co->lines[actual_ip].lineno; // current line
|
int current_line = frame->co->lines[actual_ip].lineno; // current line
|
||||||
auto current_f_name = frame->co->name.sv(); // current function name
|
auto current_f_name = frame->co->name.sv(); // current function name
|
||||||
|
Loading…
x
Reference in New Issue
Block a user