blueloveTH 2 år sedan
förälder
incheckning
90fa4b087f
4 ändrade filer med 29 tillägg och 54 borttagningar
  1. 11 32
      include/pocketpy/pocketpy_c.h
  2. 2 2
      src/ceval.cpp
  3. 10 8
      src/pocketpy_c.cpp
  4. 6 12
      src2/main.cpp

+ 11 - 32
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
 //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);
 
 
-/*********************************************************/
-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
 #ifdef __cplusplus
 }
 }

+ 2 - 2
src/ceval.cpp

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

+ 10 - 8
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) {
 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 true;
+    return res != nullptr;
 }
 }
 
 
 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){
-        ((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_;
         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){

+ 6 - 12
src2/main.cpp

@@ -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();
-
-    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
 #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());
-    for(int i=0; i<size; i++) buffer[i] = output[i];
-    buffer[size] = '\0';
+    return output;
 }
 }
 
 
 #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;