add pkpy_set_main_argv

This commit is contained in:
blueloveTH 2024-04-14 13:29:20 +08:00
parent 14a9120d9b
commit 5d4294b457
10 changed files with 37 additions and 14 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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
View File

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