pocketpy.c 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #include "pocketpy/pocketpy.h"
  2. #include "pocketpy/objects/object.h"
  3. #include "pocketpy/interpreter/vm.h"
  4. #include <assert.h>
  5. #include <stdlib.h>
  6. pk_VM* pk_current_vm;
  7. static pk_VM pk_default_vm;
  8. void py_initialize(){
  9. Pools_initialize();
  10. pk_StrName__initialize();
  11. pk_current_vm = &pk_default_vm;
  12. pk_VM__ctor(&pk_default_vm);
  13. }
  14. int py_exec_simple(const char* source){
  15. CodeObject* co = NULL;
  16. pk_VM* vm = pk_current_vm;
  17. Frame* frame = Frame__new(
  18. co,
  19. &vm->main,
  20. NULL,
  21. vm->stack.sp,
  22. vm->stack.sp,
  23. co
  24. );
  25. pk_VM__push_frame(vm, frame);
  26. pk_FrameResult res = pk_VM__run_top_frame(vm);
  27. if(res == RES_ERROR) return vm->last_error->type;
  28. if(res == RES_RETURN) return 0; // vm->last_retval;
  29. assert(0); // unreachable
  30. }
  31. py_Error* py_getlasterror(){
  32. return pk_current_vm->last_error;
  33. }
  34. void py_Error__print(py_Error* self){
  35. abort();
  36. }
  37. void py_finalize(){
  38. pk_VM__dtor(&pk_default_vm);
  39. pk_current_vm = NULL;
  40. pk_StrName__finalize();
  41. Pools_finalize();
  42. }
  43. void py_setdict(py_Ref self, py_Name name, const py_Ref val){
  44. pk_NameDict__set(
  45. PyObject__dict(self->_obj),
  46. name,
  47. *val
  48. );
  49. }
  50. void py_newint(py_Ref self, int64_t val){
  51. self->type = tp_int;
  52. self->is_ptr = false;
  53. self->_i64 = val;
  54. }