mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 03:20:18 +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)`
|
+ `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.
|
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)
|
PyObject* _callable; // a function object or nullptr (global scope)
|
||||||
FastLocals _locals;
|
FastLocals _locals;
|
||||||
|
|
||||||
NameDict& f_globals() noexcept { return _module->attr(); }
|
NameDict& f_globals() { return _module->attr(); }
|
||||||
PyObject* f_closure_try_get(StrName name);
|
PyObject* f_closure_try_get(StrName name);
|
||||||
|
|
||||||
// function scope
|
// function scope
|
||||||
|
@ -180,7 +180,7 @@ struct Py_ final: PyObject {
|
|||||||
struct MappingProxy{
|
struct MappingProxy{
|
||||||
PyObject* obj;
|
PyObject* obj;
|
||||||
MappingProxy(PyObject* obj) : obj(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)
|
#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 void pkpy_delete_vm(pkpy_vm*);
|
||||||
PK_EXPORT bool pkpy_exec(pkpy_vm*, const char* source);
|
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 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 */
|
/* Stack Manipulation */
|
||||||
PK_EXPORT bool pkpy_dup(pkpy_vm*, int i);
|
PK_EXPORT bool pkpy_dup(pkpy_vm*, int i);
|
||||||
|
@ -153,8 +153,16 @@ public:
|
|||||||
|
|
||||||
VM(bool enable_os=true);
|
VM(bool enable_os=true);
|
||||||
|
|
||||||
Frame* top_frame();
|
void set_main_argv(int argc, char** argv);
|
||||||
void _pop_frame();
|
|
||||||
|
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_str(PyObject* obj);
|
||||||
PyObject* py_repr(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;
|
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){
|
bool pkpy_dup(pkpy_vm* vm_handle, int n){
|
||||||
VM* vm = (VM*) vm_handle;
|
VM* vm = (VM*) vm_handle;
|
||||||
PK_ASSERT_NO_ERROR()
|
PK_ASSERT_NO_ERROR()
|
||||||
|
15
src/vm.cpp
15
src/vm.cpp
@ -119,16 +119,11 @@ namespace pkpy{
|
|||||||
PK_UNREACHABLE();
|
PK_UNREACHABLE();
|
||||||
}
|
}
|
||||||
|
|
||||||
Frame* VM::top_frame(){
|
void VM::set_main_argv(int argc, char** argv){
|
||||||
#if PK_DEBUG_EXTRA_CHECK
|
PyObject* mod = vm->_modules["sys"];
|
||||||
if(callstack.empty()) PK_FATAL_ERROR();
|
List argv_(argc);
|
||||||
#endif
|
for(int i=0; i<argc; i++) argv_[i] = VAR(std::string_view(argv[i]));
|
||||||
return &callstack.top();
|
mod->attr().set("argv", VAR(std::move(argv_)));
|
||||||
}
|
|
||||||
|
|
||||||
void VM::_pop_frame(){
|
|
||||||
s_data.reset(callstack.top()._sp_base);
|
|
||||||
callstack.pop();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PyObject* VM::find_name_in_mro(Type cls, StrName name){
|
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>());
|
std::string src((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
|
||||||
file.close();
|
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);
|
bool ok = pkpy_exec_2(vm, src.c_str(), filepath.filename().string().c_str(), 0, NULL);
|
||||||
if(!ok) pkpy_clear_error(vm, NULL);
|
if(!ok) pkpy_clear_error(vm, NULL);
|
||||||
pkpy_delete_vm(vm);
|
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;
|
return returnValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void pkpy_set_main_argv(pkpy_vm* vm, int argc, char** argv){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
bool pkpy_dup(pkpy_vm* vm, int i) {
|
bool pkpy_dup(pkpy_vm* vm, int i) {
|
||||||
bool returnValue;
|
bool returnValue;
|
||||||
return 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