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
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
}

View File

@ -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)

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) {
CVM* vm = (CVM*) vm_handle;
PyObject* res;
ERRHANDLER_OPEN
CodeObject_ code = vm->compile(source, "<c-bound>", 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){

View File

@ -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<int>(size-1, output.size());
for(int i=0; i<size; i++) buffer[i] = output[i];
buffer[size] = '\0';
return output;
}
#else
void pkpy_platform_getline(char* buffer, int size, bool* eof){
std::string pkpy_platform_getline(bool* eof){
std::string output;
if(!std::getline(std::cin, output)){
if(eof) *eof = true;
}
size = std::min<int>(size-1, output.size());
for(int i=0; i<size; i++) buffer[i] = output[i];
buffer[size] = '\0';
return output;
}
#endif
@ -47,7 +42,6 @@ void pkpy_platform_getline(char* buffer, int size, bool* eof){
// }
int main(int argc, char** argv){
char buffer[1024];
#if _WIN32
// implicitly load pocketpy.dll in current directory
#elif __linux__
@ -64,9 +58,9 @@ int main(int argc, char** argv){
while(true){
std::cout << (need_more_lines ? "... " : ">>> ");
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;