diff --git a/include/pocketpy/pocketpy_c.h b/include/pocketpy/pocketpy_c.h index d25b33ba..ad91d5ef 100644 --- a/include/pocketpy/pocketpy_c.h +++ b/include/pocketpy/pocketpy_c.h @@ -84,7 +84,6 @@ PK_EXPORT bool pkpy_to_string(pkpy_vm*, int index, char** ret); //it is not null terminated PK_EXPORT bool pkpy_to_stringn(pkpy_vm*, int index, const char** ret, int* size); - //these do not follow the same error semantics as above, their return values //just say whether the check succeeded or not, or else return the value asked for @@ -95,7 +94,6 @@ PK_EXPORT bool pkpy_is_string(pkpy_vm*, int index); PK_EXPORT bool pkpy_is_voidp(pkpy_vm*, int index); PK_EXPORT bool pkpy_is_none(pkpy_vm*, int index); - //will return true if global exists PK_EXPORT bool pkpy_check_global(pkpy_vm*, const char* name); @@ -112,36 +110,17 @@ PK_EXPORT bool pkpy_getattr(pkpy_vm*, const char* name); PK_EXPORT bool pkpy_setattr(pkpy_vm*, const char* name); PK_EXPORT bool pkpy_eval(pkpy_vm*, const char* source); -/*********************************************************/ -PK_EXPORT -void pkpy_free(void* p); - -PK_EXPORT -void pkpy_vm_exec(void* vm, const char* source); - -PK_EXPORT -void pkpy_vm_exec_2(void* vm, const char* source, const char* filename, int mode, const char* module); - -PK_EXPORT -void pkpy_vm_compile(void* vm, const char* source, const char* filename, int mode, bool* ok, char** res); - -PK_EXPORT -void* pkpy_new_repl(void* vm); - -PK_EXPORT -bool pkpy_repl_input(void* r, const char* line); - -PK_EXPORT -void pkpy_vm_add_module(void* vm, const char* name, const char* source); - -PK_EXPORT -void* pkpy_new_vm(bool enable_os=true); - -PK_EXPORT -void pkpy_delete_vm(void* vm); - -PK_EXPORT -void pkpy_delete_repl(void* repl); +/* legacy api */ +PK_EXPORT void pkpy_free(void* p); +PK_EXPORT bool pkpy_vm_exec(void* vm, const char* source); +PK_EXPORT bool pkpy_vm_exec_2(void* vm, const char* source, const char* filename, int mode, const char* module); +PK_EXPORT void pkpy_vm_compile(void* vm, const char* source, const char* filename, int mode, bool* ok, char** res); +PK_EXPORT void* pkpy_new_repl(void* vm); +PK_EXPORT bool pkpy_repl_input(void* r, const char* line); +PK_EXPORT void pkpy_vm_add_module(void* vm, const char* name, const char* source); +PK_EXPORT void* pkpy_new_vm(bool enable_os=true); +PK_EXPORT void pkpy_delete_vm(void* vm); +PK_EXPORT void pkpy_delete_repl(void* repl); #ifdef __cplusplus } diff --git a/src/ceval.cpp b/src/ceval.cpp index 35fbe982..559aba2f 100644 --- a/src/ceval.cpp +++ b/src/ceval.cpp @@ -108,7 +108,7 @@ __NEXT_STEP:; TARGET(LOAD_FAST) { heap._auto_collect(); _0 = frame->_locals[byte.arg]; - if(_0 == PY_NULL) vm->NameError(co->varnames[byte.arg]); + if(_0 == PY_NULL) vm->UnboundLocalError(co->varnames[byte.arg]); PUSH(_0); } DISPATCH(); TARGET(LOAD_NAME) { @@ -201,7 +201,7 @@ __NEXT_STEP:; DISPATCH(); TARGET(DELETE_FAST) _0 = frame->_locals[byte.arg]; - if(_0 == PY_NULL) vm->NameError(co->varnames[byte.arg]); + if(_0 == PY_NULL) vm->UnboundLocalError(co->varnames[byte.arg]); frame->_locals[byte.arg] = PY_NULL; DISPATCH(); TARGET(DELETE_NAME) diff --git a/src/pocketpy_c.cpp b/src/pocketpy_c.cpp index 4914eb7a..6d86e680 100644 --- a/src/pocketpy_c.cpp +++ b/src/pocketpy_c.cpp @@ -148,17 +148,17 @@ pkpy_vm* pkpy_vm_create(bool use_stdio, bool enable_os) { bool pkpy_vm_run(pkpy_vm* vm_handle, const char* source) { CVM* vm = (CVM*) vm_handle; + PyObject* res; ERRHANDLER_OPEN CodeObject_ code = vm->compile(source, "", EXEC_MODE); - vm->_exec(code, vm->_main); + res = vm->_exec(code, vm->_main); ERRHANDLER_CLOSE //unpack_return(w, result); //NOTE: it seems like vm->_exec should return whatever the last command it //ran returned but instead it seems to pretty much always return None //so I guess uncomment this line if that every changes - - return true; + return res != nullptr; } void pkpy_vm_destroy(pkpy_vm* vm_handle) { @@ -547,19 +547,21 @@ bool pkpy_eval(pkpy_vm* vm_handle, const char* code) { free(p); } - void pkpy_vm_exec(void* vm, const char* source){ - ((VM*)vm)->exec(source, "main.py", EXEC_MODE); + bool pkpy_vm_exec(void* vm, const char* source){ + void* res = ((VM*)vm)->exec(source, "main.py", EXEC_MODE); + return res != nullptr; } - void pkpy_vm_exec_2(void* vm_, const char* source, const char* filename, int mode, const char* module){ + bool pkpy_vm_exec_2(void* vm_, const char* source, const char* filename, int mode, const char* module){ VM* vm = (VM*)vm_; PyObject* mod; if(module == nullptr) mod = vm->_main; else{ mod = vm->_modules.try_get(module); - if(mod == nullptr) return; + if(mod == nullptr) return false; } - vm->exec(source, filename, (CompileMode)mode, mod); + void* res = vm->exec(source, filename, (CompileMode)mode, mod); + return res != nullptr; } void pkpy_vm_compile(void* vm_, const char* source, const char* filename, int mode, bool* ok, char** res){ diff --git a/src2/main.cpp b/src2/main.cpp index b9ff855d..1ba4df11 100644 --- a/src2/main.cpp +++ b/src2/main.cpp @@ -7,7 +7,7 @@ #ifdef _WIN32 -void pkpy_platform_getline(char* buffer, int size, bool* eof){ +std::string pkpy_platform_getline(bool* eof){ HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); std::wstringstream wss; WCHAR buf; @@ -22,22 +22,17 @@ void pkpy_platform_getline(char* buffer, int size, bool* eof){ output.resize(length); WideCharToMultiByte(CP_UTF8, 0, wideInput.c_str(), (int)wideInput.length(), &output[0], length, NULL, NULL); if(!output.empty() && output.back() == '\r') output.pop_back(); - - size = std::min(size-1, output.size()); - for(int i=0; i(size-1, output.size()); - for(int i=0; i>> "); bool eof = false; - pkpy_platform_getline(buffer, 1024, &eof); + std::string line = pkpy_platform_getline(&eof); if(eof) break; - need_more_lines = pkpy_repl_input(repl, buffer); + need_more_lines = pkpy_repl_input(repl, line.c_str()); } pkpy_delete_vm(vm); return 0;