exec.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #include "pocketpy/objects/codeobject.h"
  2. #include "pocketpy/objects/sourcedata.h"
  3. #include "pocketpy/pocketpy.h"
  4. #include "pocketpy/common/utils.h"
  5. #include "pocketpy/common/sstream.h"
  6. #include "pocketpy/objects/object.h"
  7. #include "pocketpy/interpreter/vm.h"
  8. #include "pocketpy/compiler/compiler.h"
  9. static bool _py_exec(const char* source,
  10. const char* filename,
  11. enum py_CompileMode mode,
  12. py_Ref module,
  13. bool is_dynamic) {
  14. VM* vm = pk_current_vm;
  15. CodeObject co;
  16. SourceData_ src = SourceData__rcnew(source, filename, mode, is_dynamic);
  17. Error* err = pk_compile(src, &co);
  18. if(err) {
  19. py_exception(tp_SyntaxError, err->msg);
  20. py_BaseException__stpush(&vm->curr_exception, err->src, err->lineno, NULL);
  21. PK_DECREF(src);
  22. PK_DECREF(err->src);
  23. free(err);
  24. return false;
  25. }
  26. if(!module) module = &vm->main;
  27. py_StackRef sp = vm->stack.sp;
  28. if(is_dynamic) {
  29. // [globals, locals]
  30. sp -= 2;
  31. }
  32. Frame* frame = Frame__new(&co, module, sp, sp, false, is_dynamic);
  33. VM__push_frame(vm, frame);
  34. FrameResult res = VM__run_top_frame(vm);
  35. CodeObject__dtor(&co);
  36. PK_DECREF(src);
  37. if(res == RES_ERROR) return false;
  38. if(res == RES_RETURN) return true;
  39. c11__unreachedable();
  40. }
  41. bool py_exec(const char* source, const char* filename, enum py_CompileMode mode, py_Ref module) {
  42. return _py_exec(source, filename, mode, module, false);
  43. }
  44. bool py_execdyn(const char* source, const char* filename, enum py_CompileMode mode, py_Ref module) {
  45. return _py_exec(source, filename, mode, module, true);
  46. }