This commit is contained in:
blueloveTH 2022-12-01 17:40:57 +08:00
parent 075dd44d98
commit 22ed9ae16f
3 changed files with 20 additions and 17 deletions

View File

@ -5,12 +5,7 @@
typedef int64_t _Int; typedef int64_t _Int;
typedef double _Float; typedef double _Float;
const _Int _Int_MAX_POS = 9223372036854775807LL; #define PK_VERSION "0.3.8"
const _Int _Int_MAX_NEG = -9223372036854775807LL;
const _Float _FLOAT_INF_POS = INFINITY;
const _Float _FLOAT_INF_NEG = -INFINITY;
#define PK_VERSION "0.3.7"
class CodeObject; class CodeObject;
class BasePointer; class BasePointer;

View File

@ -253,8 +253,8 @@ void __initializeBuiltinFunctions(VM* _vm) {
if (args[0]->isType(vm->_tp_bool)) return vm->PyFloat(vm->PyBool_AS_C(args[0]) ? 1.0 : 0.0); if (args[0]->isType(vm->_tp_bool)) return vm->PyFloat(vm->PyBool_AS_C(args[0]) ? 1.0 : 0.0);
if (args[0]->isType(vm->_tp_str)) { if (args[0]->isType(vm->_tp_str)) {
const _Str& s = vm->PyStr_AS_C(args[0]); const _Str& s = vm->PyStr_AS_C(args[0]);
if(s == "inf") return vm->PyFloat(_FLOAT_INF_POS); if(s == "inf") return vm->PyFloat(INFINITY);
if(s == "-inf") return vm->PyFloat(_FLOAT_INF_NEG); if(s == "-inf") return vm->PyFloat(-INFINITY);
try{ try{
_Float val = std::stod(s.str()); _Float val = std::stod(s.str());
return vm->PyFloat(val); return vm->PyFloat(val);
@ -771,4 +771,9 @@ extern "C" {
void pkpy_tvm_resume(ThreadedVM* vm, const char* value){ void pkpy_tvm_resume(ThreadedVM* vm, const char* value){
vm->resume(value); vm->resume(value);
} }
__EXPORT
void pkpy_vm_keyboard_interrupt(VM* vm){
vm->keyboardInterrupt();
}
} }

View File

@ -51,17 +51,16 @@ protected:
PyVar __py2py_call_signal; PyVar __py2py_call_signal;
bool _stopFlag = false; bool _stopFlag = false;
void emitKeyboardInterrupt(){ void _checkStopFlag(){
_stopFlag = true; if(_stopFlag){
_stopFlag = false;
_error("KeyboardInterrupt", "");
}
} }
PyVar runFrame(Frame* frame){ PyVar runFrame(Frame* frame){
while(!frame->isCodeEnd()){ while(!frame->isCodeEnd()){
if(_stopFlag){ _checkStopFlag();
_stopFlag = false;
_error("KeyboardInterrupt", "");
}
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());
@ -409,6 +408,10 @@ public:
initializeBuiltinClasses(); initializeBuiltinClasses();
} }
void keyboardInterrupt(){
_stopFlag = true;
}
PyVar asStr(const PyVar& obj){ PyVar asStr(const PyVar& obj){
PyVarOrNull str_fn = getAttr(obj, __str__, false); PyVarOrNull str_fn = getAttr(obj, __str__, false);
if(str_fn != nullptr) return call(str_fn, {}); if(str_fn != nullptr) return call(str_fn, {});
@ -1104,7 +1107,7 @@ class ThreadedVM : public VM {
void __deleteThread(){ void __deleteThread(){
if(_thread != nullptr){ if(_thread != nullptr){
emitKeyboardInterrupt(); keyboardInterrupt();
_thread->join(); _thread->join();
delete _thread; delete _thread;
_thread = nullptr; _thread = nullptr;
@ -1134,7 +1137,7 @@ public:
_state = THREAD_SUSPENDED; _state = THREAD_SUSPENDED;
// 50 fps is enough // 50 fps is enough
while(_state == THREAD_SUSPENDED){ while(_state == THREAD_SUSPENDED){
if(_stopFlag) break; _checkStopFlag();
std::this_thread::sleep_for(std::chrono::milliseconds(20)); std::this_thread::sleep_for(std::chrono::milliseconds(20));
} }
} }