mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-19 19:10:17 +00:00
add pkpy_set_main_argv
This commit is contained in:
parent
14a9120d9b
commit
5d4294b457
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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()
|
||||
|
15
src/vm.cpp
15
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){
|
||||
|
@ -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);
|
||||
|
@ -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
tests/87_sys.py
Normal file
4
tests/87_sys.py
Normal file
@ -0,0 +1,4 @@
|
||||
import sys
|
||||
|
||||
assert len(sys.argv) == 2
|
||||
assert sys.argv[1] == 'tests/87_sys.py'
|
Loading…
x
Reference in New Issue
Block a user