modules.c 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #include "pocketpy/pocketpy.h"
  2. #include "pocketpy/common/utils.h"
  3. #include "pocketpy/objects/object.h"
  4. #include "pocketpy/interpreter/vm.h"
  5. py_Ref py_getmodule(const char *name){
  6. pk_VM* vm = pk_current_vm;
  7. return pk_NameDict__try_get(&vm->modules, py_name(name));
  8. }
  9. py_Ref py_newmodule(const char *name, const char *package){
  10. pk_ManagedHeap* heap = &pk_current_vm->heap;
  11. PyObject* obj = pk_ManagedHeap__gcnew(heap, tp_module, -1, 0);
  12. py_Ref r0 = py_pushtmp();
  13. py_Ref r1 = py_pushtmp();
  14. *r0 = PyVar__fromobj(obj);
  15. py_newstr(r1, name);
  16. py_setdict(r0, __name__, r1);
  17. package = package ? package : "";
  18. py_newstr(r1, package);
  19. py_setdict(r0, __package__, r1);
  20. // convert to fullname
  21. if(package[0] != '\0'){
  22. // package.name
  23. char buf[256];
  24. snprintf(buf, sizeof(buf), "%s.%s", package, name);
  25. name = buf;
  26. }
  27. py_newstr(r1, name);
  28. py_setdict(r0, __path__, r1);
  29. // we do not allow override in order to avoid memory leak
  30. // it is because Module objects are not garbage collected
  31. bool exists = pk_NameDict__contains(&pk_current_vm->modules, py_name(name));
  32. if(exists) abort();
  33. pk_NameDict__set(&pk_current_vm->modules, py_name(name), *r0);
  34. py_poptmp(2);
  35. return py_getmodule(name);
  36. }