1
0

repl.cpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #include "pocketpy/tools/repl.hpp"
  2. #include "pocketpy/common/version.h"
  3. #include "pocketpy/common/export.h"
  4. namespace pkpy {
  5. REPL::REPL(VM* vm) : vm(vm){
  6. vm->stdout_write("pocketpy " PK_VERSION " (" __DATE__ ", " __TIME__ ") ");
  7. vm->stdout_write(_S("[", sizeof(void*)*8, " bit] on ", kPlatformStrings[PK_SYS_PLATFORM], "\n"));
  8. vm->stdout_write("https://github.com/pocketpy/pocketpy" "\n");
  9. vm->stdout_write("Type \"exit()\" to exit." "\n");
  10. }
  11. bool REPL::input(std::string line){
  12. CompileMode mode = REPL_MODE;
  13. if(need_more_lines){
  14. buffer += line;
  15. buffer += '\n';
  16. int n = buffer.size();
  17. if(n>=need_more_lines){
  18. for(int i=buffer.size()-need_more_lines; i<buffer.size(); i++){
  19. // no enough lines
  20. if(buffer[i] != '\n') return true;
  21. }
  22. need_more_lines = 0;
  23. line = buffer;
  24. buffer.clear();
  25. mode = CELL_MODE;
  26. }else{
  27. return true;
  28. }
  29. }
  30. try{
  31. vm->exec(line, "<stdin>", mode);
  32. }catch(NeedMoreLines ne){
  33. buffer += line;
  34. buffer += '\n';
  35. need_more_lines = ne.is_compiling_class ? 3 : 2;
  36. if (need_more_lines) return true;
  37. }
  38. return false;
  39. }
  40. }