mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-26 06:20:16 +00:00
49 lines
1.3 KiB
C
49 lines
1.3 KiB
C
#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);
|
|
}
|