This commit is contained in:
blueloveTH 2022-12-30 20:26:45 +08:00
parent 4ccb124eec
commit 07ffe75102
7 changed files with 37 additions and 29 deletions

View File

@ -1,4 +1,4 @@
## 0.6.0+1 ## 0.6.0+2
+ Break change + Break change

View File

@ -1,6 +1,6 @@
name: pocketpy name: pocketpy
description: A lightweight Python interpreter for game engines. description: A lightweight Python interpreter for game engines.
version: 0.6.0+1 version: 0.6.0+2
homepage: https://pocketpy.dev homepage: https://pocketpy.dev
repository: https://github.com/blueloveth/pocketpy repository: https://github.com/blueloveth/pocketpy

View File

@ -4214,7 +4214,7 @@ protected:
_error("ImportError", "module '" + name + "' not found"); _error("ImportError", "module '" + name + "' not found");
}else{ }else{
const _Str& source = it2->second; const _Str& source = it2->second;
_Code code = compile(source.c_str(), name, EXEC_MODE); _Code code = compile(source, name, EXEC_MODE);
PyVar _m = newModule(name); PyVar _m = newModule(name);
_exec(code, _m, {}); _exec(code, _m, {});
frame->push(_m); frame->push(_m);
@ -4452,7 +4452,7 @@ public:
// repl mode is only for setting `frame->id` to 0 // repl mode is only for setting `frame->id` to 0
virtual PyVarOrNull exec(const char* source, _Str filename, CompileMode mode, PyVar _module=nullptr){ virtual PyVarOrNull exec(_Str source, _Str filename, CompileMode mode, PyVar _module=nullptr){
if(_module == nullptr) _module = _main; if(_module == nullptr) _module = _main;
try { try {
_Code code = compile(source, filename, mode); _Code code = compile(source, filename, mode);
@ -4466,7 +4466,7 @@ public:
return nullptr; return nullptr;
} }
virtual void execAsync(const char* source, _Str filename, CompileMode mode) { virtual void execAsync(_Str source, _Str filename, CompileMode mode) {
exec(source, filename, mode); exec(source, filename, mode);
} }
@ -4536,7 +4536,7 @@ public:
return obj; return obj;
} }
void addLazyModule(_Str name, const char* source){ void addLazyModule(_Str name, _Str source){
_lazyModules[name] = source; _lazyModules[name] = source;
} }
@ -4857,7 +4857,7 @@ public:
} }
} }
_Code compile(const char* source, _Str filename, CompileMode mode); _Code compile(_Str source, _Str filename, CompileMode mode);
}; };
/***** Pointers' Impl *****/ /***** Pointers' Impl *****/
@ -5047,7 +5047,7 @@ public:
_state = THREAD_RUNNING; _state = THREAD_RUNNING;
} }
void execAsync(const char* source, _Str filename, CompileMode mode) override { void execAsync(_Str source, _Str filename, CompileMode mode) override {
if(_state != THREAD_READY) UNREACHABLE(); if(_state != THREAD_READY) UNREACHABLE();
#ifdef __EMSCRIPTEN__ #ifdef __EMSCRIPTEN__
@ -5064,7 +5064,7 @@ public:
#endif #endif
} }
PyVarOrNull exec(const char* source, _Str filename, CompileMode mode, PyVar _module=nullptr) override { PyVarOrNull exec(_Str source, _Str filename, CompileMode mode, PyVar _module=nullptr) override {
if(_state == THREAD_READY) return VM::exec(source, filename, mode, _module); if(_state == THREAD_READY) return VM::exec(source, filename, mode, _module);
auto callstackBackup = std::move(callstack); auto callstackBackup = std::move(callstack);
callstack.clear(); callstack.clear();
@ -6196,20 +6196,24 @@ __NOT_ENOUGH_LINES:
} }
try{ try{
vm->execAsync(line.c_str(), "<stdin>", SINGLE_MODE); // duplicated compile to catch NeedMoreLines
return EXEC_DONE; vm->compile(line, "<stdin>", SINGLE_MODE);
}catch(NeedMoreLines& ne){ }catch(NeedMoreLines& ne){
buffer += line; buffer += line;
buffer += '\n'; buffer += '\n';
need_more_lines = ne.isClassDef ? 3 : 2; need_more_lines = ne.isClassDef ? 3 : 2;
return NEED_MORE_LINES; return NEED_MORE_LINES;
}catch(...){
// do nothing
} }
vm->execAsync(line, "<stdin>", SINGLE_MODE);
return EXEC_DONE;
} }
}; };
_Code VM::compile(const char* source, _Str filename, CompileMode mode) { _Code VM::compile(_Str source, _Str filename, CompileMode mode) {
Compiler compiler(this, source, filename, mode); Compiler compiler(this, source.c_str(), filename, mode);
try{ try{
return compiler.__fillCode(); return compiler.__fillCode();
}catch(_Error& e){ }catch(_Error& e){
@ -6270,7 +6274,7 @@ void __initializeBuiltinFunctions(VM* _vm) {
_vm->bindBuiltinFunc("eval", [](VM* vm, const pkpy::ArgList& args) { _vm->bindBuiltinFunc("eval", [](VM* vm, const pkpy::ArgList& args) {
vm->__checkArgSize(args, 1); vm->__checkArgSize(args, 1);
const _Str& expr = vm->PyStr_AS_C(args[0]); const _Str& expr = vm->PyStr_AS_C(args[0]);
_Code code = vm->compile(expr.c_str(), "<eval>", EVAL_MODE); _Code code = vm->compile(expr, "<eval>", EVAL_MODE);
return vm->_exec(code, vm->topFrame()->_module, vm->topFrame()->copy_f_locals()); return vm->_exec(code, vm->topFrame()->_module, vm->topFrame()->copy_f_locals());
}); });
@ -6854,7 +6858,7 @@ void __addModuleJson(VM* vm){
vm->bindFunc(mod, "loads", [](VM* vm, const pkpy::ArgList& args) { vm->bindFunc(mod, "loads", [](VM* vm, const pkpy::ArgList& args) {
vm->__checkArgSize(args, 1); vm->__checkArgSize(args, 1);
const _Str& expr = vm->PyStr_AS_C(args[0]); const _Str& expr = vm->PyStr_AS_C(args[0]);
_Code code = vm->compile(expr.c_str(), "<json>", JSON_MODE); _Code code = vm->compile(expr, "<json>", JSON_MODE);
return vm->_exec(code, vm->topFrame()->_module, vm->topFrame()->copy_f_locals()); return vm->_exec(code, vm->topFrame()->_module, vm->topFrame()->copy_f_locals());
}); });

@ -1 +1 @@
Subproject commit fb90950aa1d0967579661690fb17048fa93456cf Subproject commit 9766382dcb2bdeace0d209b9bf2813cf62c88fb7

View File

@ -4,8 +4,8 @@
#include "compiler.h" #include "compiler.h"
#include "repl.h" #include "repl.h"
_Code VM::compile(const char* source, _Str filename, CompileMode mode) { _Code VM::compile(_Str source, _Str filename, CompileMode mode) {
Compiler compiler(this, source, filename, mode); Compiler compiler(this, source.c_str(), filename, mode);
try{ try{
return compiler.__fillCode(); return compiler.__fillCode();
}catch(_Error& e){ }catch(_Error& e){
@ -66,7 +66,7 @@ void __initializeBuiltinFunctions(VM* _vm) {
_vm->bindBuiltinFunc("eval", [](VM* vm, const pkpy::ArgList& args) { _vm->bindBuiltinFunc("eval", [](VM* vm, const pkpy::ArgList& args) {
vm->__checkArgSize(args, 1); vm->__checkArgSize(args, 1);
const _Str& expr = vm->PyStr_AS_C(args[0]); const _Str& expr = vm->PyStr_AS_C(args[0]);
_Code code = vm->compile(expr.c_str(), "<eval>", EVAL_MODE); _Code code = vm->compile(expr, "<eval>", EVAL_MODE);
return vm->_exec(code, vm->topFrame()->_module, vm->topFrame()->copy_f_locals()); return vm->_exec(code, vm->topFrame()->_module, vm->topFrame()->copy_f_locals());
}); });
@ -652,7 +652,7 @@ void __addModuleJson(VM* vm){
vm->bindFunc(mod, "loads", [](VM* vm, const pkpy::ArgList& args) { vm->bindFunc(mod, "loads", [](VM* vm, const pkpy::ArgList& args) {
vm->__checkArgSize(args, 1); vm->__checkArgSize(args, 1);
const _Str& expr = vm->PyStr_AS_C(args[0]); const _Str& expr = vm->PyStr_AS_C(args[0]);
_Code code = vm->compile(expr.c_str(), "<json>", JSON_MODE); _Code code = vm->compile(expr, "<json>", JSON_MODE);
return vm->_exec(code, vm->topFrame()->_module, vm->topFrame()->copy_f_locals()); return vm->_exec(code, vm->topFrame()->_module, vm->topFrame()->copy_f_locals());
}); });

View File

@ -54,13 +54,17 @@ __NOT_ENOUGH_LINES:
} }
try{ try{
vm->execAsync(line.c_str(), "<stdin>", SINGLE_MODE); // duplicated compile to catch NeedMoreLines
return EXEC_DONE; vm->compile(line, "<stdin>", SINGLE_MODE);
}catch(NeedMoreLines& ne){ }catch(NeedMoreLines& ne){
buffer += line; buffer += line;
buffer += '\n'; buffer += '\n';
need_more_lines = ne.isClassDef ? 3 : 2; need_more_lines = ne.isClassDef ? 3 : 2;
return NEED_MORE_LINES; return NEED_MORE_LINES;
}catch(...){
// do nothing
} }
vm->execAsync(line, "<stdin>", SINGLE_MODE);
return EXEC_DONE;
} }
}; };

View File

@ -314,7 +314,7 @@ protected:
_error("ImportError", "module '" + name + "' not found"); _error("ImportError", "module '" + name + "' not found");
}else{ }else{
const _Str& source = it2->second; const _Str& source = it2->second;
_Code code = compile(source.c_str(), name, EXEC_MODE); _Code code = compile(source, name, EXEC_MODE);
PyVar _m = newModule(name); PyVar _m = newModule(name);
_exec(code, _m, {}); _exec(code, _m, {});
frame->push(_m); frame->push(_m);
@ -552,7 +552,7 @@ public:
// repl mode is only for setting `frame->id` to 0 // repl mode is only for setting `frame->id` to 0
virtual PyVarOrNull exec(const char* source, _Str filename, CompileMode mode, PyVar _module=nullptr){ virtual PyVarOrNull exec(_Str source, _Str filename, CompileMode mode, PyVar _module=nullptr){
if(_module == nullptr) _module = _main; if(_module == nullptr) _module = _main;
try { try {
_Code code = compile(source, filename, mode); _Code code = compile(source, filename, mode);
@ -566,7 +566,7 @@ public:
return nullptr; return nullptr;
} }
virtual void execAsync(const char* source, _Str filename, CompileMode mode) { virtual void execAsync(_Str source, _Str filename, CompileMode mode) {
exec(source, filename, mode); exec(source, filename, mode);
} }
@ -636,7 +636,7 @@ public:
return obj; return obj;
} }
void addLazyModule(_Str name, const char* source){ void addLazyModule(_Str name, _Str source){
_lazyModules[name] = source; _lazyModules[name] = source;
} }
@ -957,7 +957,7 @@ public:
} }
} }
_Code compile(const char* source, _Str filename, CompileMode mode); _Code compile(_Str source, _Str filename, CompileMode mode);
}; };
/***** Pointers' Impl *****/ /***** Pointers' Impl *****/
@ -1147,7 +1147,7 @@ public:
_state = THREAD_RUNNING; _state = THREAD_RUNNING;
} }
void execAsync(const char* source, _Str filename, CompileMode mode) override { void execAsync(_Str source, _Str filename, CompileMode mode) override {
if(_state != THREAD_READY) UNREACHABLE(); if(_state != THREAD_READY) UNREACHABLE();
#ifdef __EMSCRIPTEN__ #ifdef __EMSCRIPTEN__
@ -1164,7 +1164,7 @@ public:
#endif #endif
} }
PyVarOrNull exec(const char* source, _Str filename, CompileMode mode, PyVar _module=nullptr) override { PyVarOrNull exec(_Str source, _Str filename, CompileMode mode, PyVar _module=nullptr) override {
if(_state == THREAD_READY) return VM::exec(source, filename, mode, _module); if(_state == THREAD_READY) return VM::exec(source, filename, mode, _module);
auto callstackBackup = std::move(callstack); auto callstackBackup = std::move(callstack);
callstack.clear(); callstack.clear();