From e7d75f98248a39c1b96224b33a623bd7f03d124d Mon Sep 17 00:00:00 2001 From: Siarhei Fedartsou Date: Fri, 26 Jul 2024 23:35:23 +0200 Subject: [PATCH] Experiments with Node bindings optimisation --- include/nodejs/json_v8_renderer.hpp | 58 ++++++++++++++--------------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/include/nodejs/json_v8_renderer.hpp b/include/nodejs/json_v8_renderer.hpp index fa118ed52..de3d25aed 100644 --- a/include/nodejs/json_v8_renderer.hpp +++ b/include/nodejs/json_v8_renderer.hpp @@ -11,87 +11,85 @@ namespace node_osrm struct V8Renderer { - explicit V8Renderer(const Napi::Env &env, Napi::Value &out) : env(env), out(out) {} + explicit V8Renderer(const Napi::Env &env) : env(env) {} - void operator()(const osrm::json::String &string) const + Napi::Value operator()(const osrm::json::String &string) const { - out = Napi::String::New(env, string.value); + return Napi::String::New(env, string.value); } - void operator()(const osrm::json::Number &number) const + Napi::Value operator()(const osrm::json::Number &number) const { - out = Napi::Number::New(env, number.value); + return Napi::Number::New(env, number.value); } - void operator()(const osrm::json::Object &object) const + Napi::Value operator()(const osrm::json::Object &object) const { Napi::Object obj = Napi::Object::New(env); for (const auto &keyValue : object.values) { - Napi::Value child; - - visit(V8Renderer(env, child), keyValue.second); - obj.Set(keyValue.first, child); + obj.Set(keyValue.first, visit(V8Renderer(env), keyValue.second)); } - out = obj; + return obj; } - void operator()(const osrm::json::Array &array) const + Napi::Value operator()(const osrm::json::Array &array) const { Napi::Array a = Napi::Array::New(env, array.values.size()); for (auto i = 0u; i < array.values.size(); ++i) { - Napi::Value child; - visit(V8Renderer(env, child), array.values[i]); - a.Set(i, child); + a.Set(i, visit(V8Renderer(env), array.values[i])); } - out = a; + return a; } - void operator()(const osrm::json::True &) const { out = Napi::Boolean::New(env, true); } + Napi::Value operator()(const osrm::json::True &) const { return Napi::Boolean::New(env, true); } - void operator()(const osrm::json::False &) const { out = Napi::Boolean::New(env, false); } + Napi::Value operator()(const osrm::json::False &) const + { + return Napi::Boolean::New(env, false); + } - void operator()(const osrm::json::Null &) const { out = env.Null(); } + Napi::Value operator()(const osrm::json::Null &) const { return env.Null(); } private: - void visit(const V8Renderer &renderer, const osrm::json::Value &value) const + Napi::Value visit(const V8Renderer &renderer, const osrm::json::Value &value) const { switch (value.index()) { case 0: - renderer(std::get(value)); + return renderer(std::get(value)); break; case 1: - renderer(std::get(value)); + return renderer(std::get(value)); break; case 2: - renderer(std::get(value)); + return renderer(std::get(value)); break; case 3: - renderer(std::get(value)); + return renderer(std::get(value)); break; case 4: - renderer(std::get(value)); + return renderer(std::get(value)); break; case 5: - renderer(std::get(value)); + return renderer(std::get(value)); break; case 6: - renderer(std::get(value)); + return renderer(std::get(value)); break; } + return env.Null(); } private: const Napi::Env &env; - Napi::Value &out; }; inline void renderToV8(const Napi::Env &env, Napi::Value &out, const osrm::json::Object &object) { - V8Renderer renderer(env, out); - renderer(object); + V8Renderer renderer(env); + out = renderer(object); } } // namespace node_osrm