main.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #include <fstream>
  2. #include <functional>
  3. #include "pocketpy.h"
  4. #define PK_DEBUG_TIME
  5. //#define PK_DEBUG_THREADED
  6. struct Timer{
  7. const char* title;
  8. Timer(const char* title) : title(title) {}
  9. void run(std::function<void()> f){
  10. #ifdef PK_DEBUG_TIME
  11. auto start = std::chrono::high_resolution_clock::now();
  12. f();
  13. auto end = std::chrono::high_resolution_clock::now();
  14. double elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() / 1000000.0;
  15. std::cout << title << ": " << elapsed << " s" << std::endl;
  16. #else
  17. f();
  18. #endif
  19. }
  20. };
  21. #if defined(__EMSCRIPTEN__) || defined(__wasm__) || defined(__wasm32__) || defined(__wasm64__)
  22. // these code is for demo use, feel free to modify it
  23. REPL* _repl;
  24. extern "C" {
  25. __EXPORT
  26. void repl_start(){
  27. _repl = pkpy_new_repl(pkpy_new_vm(true));
  28. }
  29. __EXPORT
  30. bool repl_input(const char* line){
  31. return pkpy_repl_input(_repl, line) == NEED_MORE_LINES;
  32. }
  33. }
  34. #else
  35. void _tvm_dispatch(ThreadedVM* vm){
  36. while(pkpy_tvm_get_state(vm) != THREAD_FINISHED){
  37. if(pkpy_tvm_get_state(vm) == THREAD_SUSPENDED){
  38. char* obj = pkpy_tvm_read_jsonrpc_request(vm);
  39. bool is_input_call = std::string_view(obj).find("\"input\"") != std::string::npos;
  40. if(is_input_call){
  41. std::string line;
  42. std::getline(std::cin, line);
  43. _StrStream ss;
  44. ss << '{';
  45. ss << "\"result\": " << _Str(line).__escape(false);
  46. ss << '}';
  47. pkpy_tvm_write_jsonrpc_response(vm, ss.str().c_str());
  48. }else{
  49. std::cout << "unknown jsonrpc call" << std::endl;
  50. std::cout << obj << std::endl;
  51. exit(3);
  52. }
  53. pkpy_delete(obj);
  54. }
  55. }
  56. }
  57. int main(int argc, char** argv){
  58. if(argc == 1){
  59. #ifndef PK_DEBUG_THREADED
  60. VM* vm = pkpy_new_vm(true);
  61. #else
  62. ThreadedVM* vm = pkpy_new_tvm(true);
  63. #endif
  64. REPL repl(vm);
  65. while(true){
  66. (*vm->_stdout) << (repl.is_need_more_lines() ? "... " : ">>> ");
  67. std::string line;
  68. std::getline(std::cin, line);
  69. int result = pkpy_repl_input(&repl, line.c_str());
  70. #ifdef PK_DEBUG_THREADED
  71. if(result == (int)EXEC_DONE){
  72. _tvm_dispatch(vm);
  73. pkpy_tvm_reset_state(vm);
  74. }
  75. #endif
  76. }
  77. return 0;
  78. }
  79. if(argc == 2){
  80. std::string filename = argv[1];
  81. if(filename == "-h" || filename == "--help") goto __HELP;
  82. std::ifstream file(filename);
  83. if(!file.is_open()){
  84. std::cerr << "File not found: " << filename << std::endl;
  85. return 1;
  86. }
  87. std::string src((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
  88. ThreadedVM* vm = pkpy_new_tvm(true);
  89. _Code code = nullptr;
  90. Timer("Compile time").run([&]{
  91. code = compile(vm, src.c_str(), filename);
  92. });
  93. if(code == nullptr) return 1;
  94. //std::cout << code->toString() << std::endl;
  95. // for(auto& kv : _strIntern)
  96. // std::cout << kv.first << ", ";
  97. #ifdef PK_DEBUG_THREADED
  98. Timer("Running time").run([=]{
  99. vm->execAsync(code);
  100. _tvm_dispatch(vm);
  101. });
  102. #else
  103. Timer("Running time").run([=]{
  104. vm->exec(code);
  105. });
  106. #endif
  107. pkpy_delete(vm);
  108. return 0;
  109. }
  110. __HELP:
  111. std::cout << "Usage: pocketpy [filename]" << std::endl;
  112. return 0;
  113. }
  114. #endif