OR-1 dataflow CPU sketch
at main 70 lines 1.8 kB view raw
1#include "./logger.h" 2#include "tree_sitter/api.h" 3 4#include <napi.h> 5#include <string> 6 7using namespace Napi; 8using std::string; 9 10namespace node_tree_sitter { 11 12void Logger::Log(void *payload, TSLogType type, const char *message_str) { 13 auto *debugger = static_cast<Logger *>(payload); 14 Env env = debugger->func.Env(); 15 16 string message(message_str); 17 string param_sep = " "; 18 size_t param_sep_pos = message.find(param_sep, 0); 19 20 String type_name = String::New(env, (type == TSLogTypeParse) ? "parse" : "lex");; 21 String name = String::New(env, message.substr(0, param_sep_pos)); 22 Object params = Object::New(env); 23 24 while (param_sep_pos != string::npos) { 25 size_t key_pos = param_sep_pos + param_sep.size(); 26 size_t value_sep_pos = message.find(':', key_pos); 27 28 if (value_sep_pos == string::npos) { 29 break; 30 } 31 32 size_t val_pos = value_sep_pos + 1; 33 param_sep = ", "; 34 param_sep_pos = message.find(param_sep, value_sep_pos); 35 36 string key = message.substr(key_pos, (value_sep_pos - key_pos)); 37 string value = message.substr(val_pos, (param_sep_pos - val_pos)); 38 params[key] = String::New(env, value); 39 } 40 41 try { 42 debugger->func({ name, params, type_name }); 43 } catch (const Error &error) { 44 Value console = env.Global()["console"]; 45 if (!console.IsObject()) { 46 return; 47 } 48 49 Value error_fn = console.As<Object>()["error"]; 50 if (!error_fn.IsFunction()) { 51 return; 52 } 53 54 error_fn.As<Function>()({ 55 String::New(env, "Error in debug callback:"), 56 error.Value() 57 }); 58 } 59} 60 61TSLogger Logger::Make(const Napi::Function &func) { 62 TSLogger result; 63 auto *logger = new Logger(); 64 logger->func = Napi::Persistent(func); 65 result.payload = static_cast<void *>(logger); 66 result.log = Log; 67 return result; 68} 69 70} // namespace node_tree_sitter