mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-23 21:10:19 +00:00
...
This commit is contained in:
parent
cdd6776058
commit
90fa4b087f
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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){
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user