mp_flipper_compiler.c 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #include <string.h>
  2. #include "py/compile.h"
  3. #include "py/runtime.h"
  4. #include "py/persistentcode.h"
  5. #include "py/gc.h"
  6. #include "py/stackctrl.h"
  7. #include "shared/runtime/gchelper.h"
  8. #include "mp_flipper_runtime.h"
  9. #include "mp_flipper_compiler.h"
  10. #include "mp_flipper_halport.h"
  11. void mp_flipper_exec_str(const char* code) {
  12. nlr_buf_t nlr;
  13. if(nlr_push(&nlr) == 0) {
  14. // Compile, parse and execute the given string
  15. mp_lexer_t* lex = mp_lexer_new_from_str_len(MP_QSTR__lt_stdin_gt_, code, strlen(code), 0);
  16. mp_store_global(MP_QSTR___file__, MP_OBJ_NEW_QSTR(lex->source_name));
  17. mp_parse_tree_t parse_tree = mp_parse(lex, MP_PARSE_FILE_INPUT);
  18. mp_obj_t module_fun = mp_compile(&parse_tree, lex->source_name, true);
  19. mp_call_function_0(module_fun);
  20. nlr_pop();
  21. } else {
  22. // Uncaught exception: print it out.
  23. mp_obj_print_exception(&mp_plat_print, (mp_obj_t)nlr.ret_val);
  24. }
  25. }
  26. void mp_flipper_exec_py_file(const char* file_path) {
  27. nlr_buf_t nlr;
  28. if(nlr_push(&nlr) == 0) {
  29. do {
  30. // check if file exists
  31. if(mp_flipper_import_stat(file_path) == MP_FLIPPER_IMPORT_STAT_NO_EXIST) {
  32. mp_raise_OSError_with_filename(MP_ENOENT, file_path);
  33. break;
  34. }
  35. // Compile, parse and execute the given file
  36. mp_lexer_t* lex = mp_lexer_new_from_file(qstr_from_str(file_path));
  37. mp_store_global(MP_QSTR___file__, MP_OBJ_NEW_QSTR(lex->source_name));
  38. mp_parse_tree_t parse_tree = mp_parse(lex, MP_PARSE_FILE_INPUT);
  39. mp_obj_t module_fun = mp_compile(&parse_tree, lex->source_name, false);
  40. mp_call_function_0(module_fun);
  41. } while(false);
  42. nlr_pop();
  43. } else {
  44. // Uncaught exception: print it out.
  45. mp_obj_print_exception(&mp_plat_print, (mp_obj_t)nlr.ret_val);
  46. }
  47. }