This commit is contained in:
blueloveTH 2023-07-09 17:34:58 +08:00
parent cdd6776058
commit 90fa4b087f
4 changed files with 29 additions and 54 deletions

View File

@ -84,7 +84,6 @@ PK_EXPORT bool pkpy_to_string(pkpy_vm*, int index, char** ret);
//it is not null terminated //it is not null terminated
PK_EXPORT bool pkpy_to_stringn(pkpy_vm*, int index, const char** ret, int* size); 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 //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 //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_voidp(pkpy_vm*, int index);
PK_EXPORT bool pkpy_is_none(pkpy_vm*, int index); PK_EXPORT bool pkpy_is_none(pkpy_vm*, int index);
//will return true if global exists //will return true if global exists
PK_EXPORT bool pkpy_check_global(pkpy_vm*, const char* name); 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_setattr(pkpy_vm*, const char* name);
PK_EXPORT bool pkpy_eval(pkpy_vm*, const char* source); PK_EXPORT bool pkpy_eval(pkpy_vm*, const char* source);
/*********************************************************/ /* legacy api */
PK_EXPORT PK_EXPORT void pkpy_free(void* p);
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 PK_EXPORT void pkpy_vm_compile(void* vm, const char* source, const char* filename, int mode, bool* ok, char** res);
void pkpy_vm_exec(void* vm, const char* source); PK_EXPORT void* pkpy_new_repl(void* vm);
PK_EXPORT bool pkpy_repl_input(void* r, const char* line);
PK_EXPORT PK_EXPORT void pkpy_vm_add_module(void* vm, const char* name, const char* source);
void pkpy_vm_exec_2(void* vm, const char* source, const char* filename, int mode, const char* module); PK_EXPORT void* pkpy_new_vm(bool enable_os=true);
PK_EXPORT void pkpy_delete_vm(void* vm);
PK_EXPORT PK_EXPORT void pkpy_delete_repl(void* repl);
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 #ifdef __cplusplus
} }

View File

@ -108,7 +108,7 @@ __NEXT_STEP:;
TARGET(LOAD_FAST) { TARGET(LOAD_FAST) {
heap._auto_collect(); heap._auto_collect();
_0 = frame->_locals[byte.arg]; _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); PUSH(_0);
} DISPATCH(); } DISPATCH();
TARGET(LOAD_NAME) { TARGET(LOAD_NAME) {
@ -201,7 +201,7 @@ __NEXT_STEP:;
DISPATCH(); DISPATCH();
TARGET(DELETE_FAST) TARGET(DELETE_FAST)
_0 = frame->_locals[byte.arg]; _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; frame->_locals[byte.arg] = PY_NULL;
DISPATCH(); DISPATCH();
TARGET(DELETE_NAME) TARGET(DELETE_NAME)

View File

@ -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) { bool pkpy_vm_run(pkpy_vm* vm_handle, const char* source) {
CVM* vm = (CVM*) vm_handle; CVM* vm = (CVM*) vm_handle;
PyObject* res;
ERRHANDLER_OPEN ERRHANDLER_OPEN
CodeObject_ code = vm->compile(source, "<c-bound>", EXEC_MODE); CodeObject_ code = vm->compile(source, "<c-bound>", EXEC_MODE);
vm->_exec(code, vm->_main); res = vm->_exec(code, vm->_main);
ERRHANDLER_CLOSE ERRHANDLER_CLOSE
//unpack_return(w, result); //unpack_return(w, result);
//NOTE: it seems like vm->_exec should return whatever the last command it //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 //ran returned but instead it seems to pretty much always return None
//so I guess uncomment this line if that every changes //so I guess uncomment this line if that every changes
return res != nullptr;
return true;
} }
void pkpy_vm_destroy(pkpy_vm* vm_handle) { void pkpy_vm_destroy(pkpy_vm* vm_handle) {
@ -547,19 +547,21 @@ bool pkpy_eval(pkpy_vm* vm_handle, const char* code) {
free(p); free(p);
} }
void pkpy_vm_exec(void* vm, const char* source){ bool pkpy_vm_exec(void* vm, const char* source){
((VM*)vm)->exec(source, "main.py", EXEC_MODE); 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_; VM* vm = (VM*)vm_;
PyObject* mod; PyObject* mod;
if(module == nullptr) mod = vm->_main; if(module == nullptr) mod = vm->_main;
else{ else{
mod = vm->_modules.try_get(module); 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){ void pkpy_vm_compile(void* vm_, const char* source, const char* filename, int mode, bool* ok, char** res){

View File

@ -7,7 +7,7 @@
#ifdef _WIN32 #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); HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
std::wstringstream wss; std::wstringstream wss;
WCHAR buf; WCHAR buf;
@ -22,22 +22,17 @@ void pkpy_platform_getline(char* buffer, int size, bool* eof){
output.resize(length); output.resize(length);
WideCharToMultiByte(CP_UTF8, 0, wideInput.c_str(), (int)wideInput.length(), &output[0], length, NULL, NULL); WideCharToMultiByte(CP_UTF8, 0, wideInput.c_str(), (int)wideInput.length(), &output[0], length, NULL, NULL);
if(!output.empty() && output.back() == '\r') output.pop_back(); if(!output.empty() && output.back() == '\r') output.pop_back();
return output;
size = std::min<int>(size-1, output.size());
for(int i=0; i<size; i++) buffer[i] = output[i];
buffer[size] = '\0';
} }
#else #else
void pkpy_platform_getline(char* buffer, int size, bool* eof){ std::string pkpy_platform_getline(bool* eof){
std::string output; std::string output;
if(!std::getline(std::cin, output)){ if(!std::getline(std::cin, output)){
if(eof) *eof = true; if(eof) *eof = true;
} }
size = std::min<int>(size-1, output.size()); return output;
for(int i=0; i<size; i++) buffer[i] = output[i];
buffer[size] = '\0';
} }
#endif #endif
@ -47,7 +42,6 @@ void pkpy_platform_getline(char* buffer, int size, bool* eof){
// } // }
int main(int argc, char** argv){ int main(int argc, char** argv){
char buffer[1024];
#if _WIN32 #if _WIN32
// implicitly load pocketpy.dll in current directory // implicitly load pocketpy.dll in current directory
#elif __linux__ #elif __linux__
@ -64,9 +58,9 @@ int main(int argc, char** argv){
while(true){ while(true){
std::cout << (need_more_lines ? "... " : ">>> "); std::cout << (need_more_lines ? "... " : ">>> ");
bool eof = false; bool eof = false;
pkpy_platform_getline(buffer, 1024, &eof); std::string line = pkpy_platform_getline(&eof);
if(eof) break; 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); pkpy_delete_vm(vm);
return 0; return 0;