| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- #include "pocketpy/pocketpy.h"
- #include "pocketpy/common/utils.h"
- #include "pocketpy/objects/object.h"
- #include "pocketpy/interpreter/vm.h"
- py_Ref py_getmodule(const char *name){
- pk_VM* vm = pk_current_vm;
- return pk_NameDict__try_get(&vm->modules, py_name(name));
- }
- py_Ref py_newmodule(const char *name, const char *package){
- pk_ManagedHeap* heap = &pk_current_vm->heap;
- PyObject* obj = pk_ManagedHeap__gcnew(heap, tp_module, -1, 0);
- py_Ref r0 = py_pushtmp();
- py_Ref r1 = py_pushtmp();
- *r0 = PyVar__fromobj(obj);
- py_newstr(r1, name);
- py_setdict(r0, __name__, r1);
- package = package ? package : "";
- py_newstr(r1, package);
- py_setdict(r0, __package__, r1);
- // convert to fullname
- if(package[0] != '\0'){
- // package.name
- char buf[256];
- snprintf(buf, sizeof(buf), "%s.%s", package, name);
- name = buf;
- }
- py_newstr(r1, name);
- py_setdict(r0, __path__, r1);
- // we do not allow override in order to avoid memory leak
- // it is because Module objects are not garbage collected
- bool exists = pk_NameDict__contains(&pk_current_vm->modules, py_name(name));
- if(exists) abort();
- pk_NameDict__set(&pk_current_vm->modules, py_name(name), *r0);
- py_poptmp(2);
- return py_getmodule(name);
- }
|