mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30:18 +00:00
up
Update obj.h Update vm.h Update vm.h
This commit is contained in:
parent
8d152c225f
commit
c3dc23dc64
@ -22,8 +22,7 @@ struct SourceMetadata {
|
|||||||
|
|
||||||
_Str getLine(int lineno) const {
|
_Str getLine(int lineno) const {
|
||||||
if(lineno == -1) return "<?>";
|
if(lineno == -1) return "<?>";
|
||||||
lineno -= 1;
|
const char* _start = lineStarts.at(lineno-1);
|
||||||
const char* _start = lineStarts.at(lineno < 0 ? 0 : lineno);
|
|
||||||
const char* i = _start;
|
const char* i = _start;
|
||||||
while(*i != '\n' && *i != '\0') i++;
|
while(*i != '\n' && *i != '\0') i++;
|
||||||
return _Str(_start, i-_start);
|
return _Str(_start, i-_start);
|
||||||
|
@ -112,6 +112,7 @@ int main(int argc, char** argv){
|
|||||||
vm->execAsync(code);
|
vm->execAsync(code);
|
||||||
_tvm_dispatch(vm);
|
_tvm_dispatch(vm);
|
||||||
});
|
});
|
||||||
|
pkpy_delete(vm);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
21
src/vm.h
21
src/vm.h
@ -44,12 +44,12 @@
|
|||||||
typedef void(*PrintFn)(const VM*, const char*);
|
typedef void(*PrintFn)(const VM*, const char*);
|
||||||
|
|
||||||
class VM: public PkExportedResource{
|
class VM: public PkExportedResource{
|
||||||
|
std::atomic<bool> _stopFlag = false;
|
||||||
protected:
|
protected:
|
||||||
std::deque< std::unique_ptr<Frame> > callstack;
|
std::deque< std::unique_ptr<Frame> > callstack;
|
||||||
PyVarDict _modules; // loaded modules
|
PyVarDict _modules; // loaded modules
|
||||||
std::map<_Str, _Code> _lazyModules; // lazy loaded modules
|
std::map<_Str, _Code> _lazyModules; // lazy loaded modules
|
||||||
PyVar __py2py_call_signal;
|
PyVar __py2py_call_signal;
|
||||||
std::atomic<bool> _stopFlag = false;
|
|
||||||
|
|
||||||
void _checkStopFlag(){
|
void _checkStopFlag(){
|
||||||
if(_stopFlag){
|
if(_stopFlag){
|
||||||
@ -60,10 +60,11 @@ protected:
|
|||||||
|
|
||||||
PyVar runFrame(Frame* frame){
|
PyVar runFrame(Frame* frame){
|
||||||
while(!frame->isCodeEnd()){
|
while(!frame->isCodeEnd()){
|
||||||
_checkStopFlag();
|
|
||||||
const ByteCode& byte = frame->readCode();
|
const ByteCode& byte = frame->readCode();
|
||||||
//printf("%s (%d) stack_size: %d\n", OP_NAMES[byte.op], byte.arg, frame->stackSize());
|
//printf("%s (%d) stack_size: %d\n", OP_NAMES[byte.op], byte.arg, frame->stackSize());
|
||||||
|
|
||||||
|
_checkStopFlag();
|
||||||
|
|
||||||
switch (byte.op)
|
switch (byte.op)
|
||||||
{
|
{
|
||||||
case OP_NO_OP: break; // do nothing
|
case OP_NO_OP: break; // do nothing
|
||||||
@ -1114,7 +1115,10 @@ class ThreadedVM : public VM {
|
|||||||
|
|
||||||
void __deleteThread(){
|
void __deleteThread(){
|
||||||
if(_thread != nullptr){
|
if(_thread != nullptr){
|
||||||
if(_state == THREAD_RUNNING || _state == THREAD_SUSPENDED) keyboardInterrupt();
|
if(_state == THREAD_RUNNING || _state == THREAD_SUSPENDED) {
|
||||||
|
keyboardInterrupt();
|
||||||
|
while(_state != THREAD_FINISHED);
|
||||||
|
}
|
||||||
_thread->join();
|
_thread->join();
|
||||||
delete _thread;
|
delete _thread;
|
||||||
_thread = nullptr;
|
_thread = nullptr;
|
||||||
@ -1183,11 +1187,12 @@ public:
|
|||||||
|
|
||||||
PyVarOrNull exec(const _Code& code, PyVar _module = nullptr) override {
|
PyVarOrNull exec(const _Code& code, PyVar _module = nullptr) override {
|
||||||
if(_state == THREAD_READY) return VM::exec(code, _module);
|
if(_state == THREAD_READY) return VM::exec(code, _module);
|
||||||
auto callstackBackup = std::move(callstack);
|
UNREACHABLE();
|
||||||
callstack.clear();
|
// auto callstackBackup = std::move(callstack);
|
||||||
PyVarOrNull ret = VM::exec(code, _module);
|
// callstack.clear();
|
||||||
callstack = std::move(callstackBackup);
|
// PyVarOrNull ret = VM::exec(code, _module);
|
||||||
return ret;
|
// callstack = std::move(callstackBackup);
|
||||||
|
// return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void resetState(){
|
void resetState(){
|
||||||
|
Loading…
x
Reference in New Issue
Block a user