Pārlūkot izejas kodu

add `pkpy_set_main_argv`

blueloveTH 1 gadu atpakaļ
vecāks
revīzija
5d4294b457

+ 4 - 0
docs/C-API/introduction.md

@@ -36,3 +36,7 @@ C-APIs are always stable and backward compatible.
 + `bool pkpy_exec_2(pkpy_vm*, const char* source, const char* filename, int mode, const char* module)`
 
     Wraps `vm->exec_2`. Execute a string of source code with more options.
+
++ `void pkpy_set_main_argv(pkpy_vm*, int argc, char** argv)`
+
+    Wraps `vm->set_main_argv`. Set the `sys.argv` before executing scripts.

+ 1 - 1
include/pocketpy/frame.h

@@ -84,7 +84,7 @@ struct Frame {
     PyObject* _callable;    // a function object or nullptr (global scope)
     FastLocals _locals;
 
-    NameDict& f_globals() noexcept { return _module->attr(); }
+    NameDict& f_globals() { return _module->attr(); }
     PyObject* f_closure_try_get(StrName name);
 
     // function scope

+ 1 - 1
include/pocketpy/obj.h

@@ -180,7 +180,7 @@ struct Py_ final: PyObject {
 struct MappingProxy{
     PyObject* obj;
     MappingProxy(PyObject* obj) : obj(obj) {}
-    NameDict& attr() noexcept { return obj->attr(); }
+    NameDict& attr() { return obj->attr(); }
 };
 
 #define PK_OBJ_GET(T, obj) (((Py_<T>*)(obj))->_value)

+ 1 - 0
include/pocketpy/pocketpy_c.h

@@ -23,6 +23,7 @@ PK_EXPORT pkpy_vm* pkpy_new_vm(bool enable_os);
 PK_EXPORT void pkpy_delete_vm(pkpy_vm*);
 PK_EXPORT bool pkpy_exec(pkpy_vm*, const char* source);
 PK_EXPORT bool pkpy_exec_2(pkpy_vm*, const char* source, const char* filename, int mode, const char* module);
+PK_EXPORT void pkpy_set_main_argv(pkpy_vm*, int argc, char** argv);
 
 /* Stack Manipulation */
 PK_EXPORT bool pkpy_dup(pkpy_vm*, int i);

+ 10 - 2
include/pocketpy/vm.h

@@ -153,8 +153,16 @@ public:
 
     VM(bool enable_os=true);
 
-    Frame* top_frame();
-    void _pop_frame();
+    void set_main_argv(int argc, char** argv);
+
+    Frame* top_frame(){
+        return &callstack.top();
+    }
+
+    void _pop_frame(){
+        s_data.reset(callstack.top()._sp_base);
+        callstack.pop();
+    }
 
     PyObject* py_str(PyObject* obj);
     PyObject* py_repr(PyObject* obj);

+ 5 - 0
src/pocketpy_c.cpp

@@ -91,6 +91,11 @@ bool pkpy_exec_2(pkpy_vm* vm_handle, const char* source, const char* filename, i
     return res != nullptr;
 }
 
+void pkpy_set_main_argv(pkpy_vm* vm_handle, int argc, char** argv){
+    VM* vm = (VM*) vm_handle;
+    vm->set_main_argv(argc, argv);
+}
+
 bool pkpy_dup(pkpy_vm* vm_handle, int n){
     VM* vm = (VM*) vm_handle;
     PK_ASSERT_NO_ERROR()

+ 5 - 10
src/vm.cpp

@@ -119,16 +119,11 @@ namespace pkpy{
         PK_UNREACHABLE();
     }
 
-    Frame* VM::top_frame(){
-#if PK_DEBUG_EXTRA_CHECK
-        if(callstack.empty()) PK_FATAL_ERROR();
-#endif
-        return &callstack.top();
-    }
-
-    void VM::_pop_frame(){
-        s_data.reset(callstack.top()._sp_base);
-        callstack.pop();
+    void VM::set_main_argv(int argc, char** argv){
+        PyObject* mod = vm->_modules["sys"];
+        List argv_(argc);
+        for(int i=0; i<argc; i++) argv_[i] = VAR(std::string_view(argv[i]));
+        mod->attr().set("argv", VAR(std::move(argv_)));
     }
 
     PyObject* VM::find_name_in_mro(Type cls, StrName name){

+ 2 - 0
src2/main.cpp

@@ -99,6 +99,8 @@ int main(int argc, char** argv){
         std::string src((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
         file.close();
 
+        pkpy_set_main_argv(vm, argc, argv);
+
         bool ok = pkpy_exec_2(vm, src.c_str(), filepath.filename().string().c_str(), 0, NULL);
         if(!ok) pkpy_clear_error(vm, NULL);
         pkpy_delete_vm(vm);

+ 4 - 0
src2/pocketpy_c.c

@@ -24,6 +24,10 @@ bool pkpy_exec_2(pkpy_vm* vm, const char* source, const char* filename, int mode
     return returnValue;
 }
 
+void pkpy_set_main_argv(pkpy_vm* vm, int argc, char** argv){
+
+}
+
 bool pkpy_dup(pkpy_vm* vm, int i) {
     bool returnValue;
     return returnValue;

+ 4 - 0
tests/87_sys.py

@@ -0,0 +1,4 @@
+import sys
+
+assert len(sys.argv) == 2
+assert sys.argv[1] == 'tests/87_sys.py'