OR-1 dataflow CPU sketch
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