From 8d152c225fa4d71c103fb3d0507795b27cf34c65 Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Thu, 1 Dec 2022 18:00:01 +0800 Subject: [PATCH] up up Update vm.h Update vm.h --- src/error.h | 3 ++- src/obj.h | 2 +- src/pocketpy.h | 10 ++++++++++ src/vm.h | 13 ++++++++++--- 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/error.h b/src/error.h index 2ac58fcc..6a26c630 100644 --- a/src/error.h +++ b/src/error.h @@ -22,7 +22,8 @@ struct SourceMetadata { _Str getLine(int lineno) const { if(lineno == -1) return ""; - const char* _start = lineStarts.at(lineno-1); + lineno -= 1; + const char* _start = lineStarts.at(lineno < 0 ? 0 : lineno); const char* i = _start; while(*i != '\n' && *i != '\0') i++; return _Str(_start, i-_start); diff --git a/src/obj.h b/src/obj.h index 01e6d581..9f2e2efd 100644 --- a/src/obj.h +++ b/src/obj.h @@ -5,7 +5,7 @@ typedef int64_t _Int; typedef double _Float; -#define PK_VERSION "0.3.8" +#define PK_VERSION "0.3.9" class CodeObject; class BasePointer; diff --git a/src/pocketpy.h b/src/pocketpy.h index 9eed130c..711a9d2f 100644 --- a/src/pocketpy.h +++ b/src/pocketpy.h @@ -597,6 +597,16 @@ void __addModuleTime(VM* vm){ auto now = std::chrono::high_resolution_clock::now(); return vm->PyFloat(std::chrono::duration_cast(now.time_since_epoch()).count() / 1000000.0); }); + + vm->bindFunc(mod, "sleep", [](VM* vm, const pkpy::ArgList& args) { + vm->__checkArgSize(args, 1); + if(!vm->isIntOrFloat(args[0])){ + vm->typeError("time.sleep() argument must be int or float"); + } + double sec = vm->numToFloat(args[0]); + vm->sleepForSecs(sec); + return vm->None; + }); } void __addModuleSys(VM* vm){ diff --git a/src/vm.h b/src/vm.h index 2c8483fe..bef0ba4d 100644 --- a/src/vm.h +++ b/src/vm.h @@ -49,7 +49,7 @@ protected: PyVarDict _modules; // loaded modules std::map<_Str, _Code> _lazyModules; // lazy loaded modules PyVar __py2py_call_signal; - bool _stopFlag = false; + std::atomic _stopFlag = false; void _checkStopFlag(){ if(_stopFlag){ @@ -412,6 +412,14 @@ public: _stopFlag = true; } + void sleepForSecs(_Float sec){ + _Int ms = (_Int)(sec * 1000); + for(_Int i=0; ijoin(); delete _thread; _thread = nullptr;