mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-21 12:00:18 +00:00
up
This commit is contained in:
parent
075dd44d98
commit
22ed9ae16f
@ -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;
|
||||||
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
21
src/vm.h
21
src/vm.h
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user