From 43edd6bba4a059524e390b6b0c38188218439e49 Mon Sep 17 00:00:00 2001 From: Luiz Peres Date: Fri, 17 Apr 2020 00:51:12 -0700 Subject: [PATCH] Trying different approaches, such as exposing tapes (#34) --- simdjson/bindings.cpp | 32 ++++++++++++++++++++++++++++++-- simdjson/bindings.h | 2 ++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/simdjson/bindings.cpp b/simdjson/bindings.cpp index 5795739..9039cfc 100644 --- a/simdjson/bindings.cpp +++ b/simdjson/bindings.cpp @@ -112,10 +112,8 @@ Napi::Value simdjsonnode::ParseWrapped(const Napi::CallbackInfo& info) { Napi::Env env = info.Env(); std::string json = info[0].As(); try { - dom::parser parser; return makeJSONObject(env, parser.parse(json)); - } catch (simdjson_error &error) { Napi::Error::New(env, error_message(error.error())).ThrowAsJavaScriptException(); return env.Null(); @@ -141,9 +139,39 @@ Napi::Object simdjsonnode::LazyParseWrapped(const Napi::CallbackInfo& info) { return result; } +Napi::Object simdjsonnode::BuffersWithParseWrapped(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + std::string json = info[0].As(); + dom::parser parser; + error_code error = parser.parse(json).error(); + if (error) { + Napi::Error::New(env, error_message(error)).ThrowAsJavaScriptException(); + return Napi::Object::New(env); + } + uint64_t *tapebuf = std::move(parser.doc.tape).release(); + uint8_t *stringbuf = std::move(parser.doc.string_buf).release(); + size_t tapebufsize = parser.current_loc; + size_t stringbufsize = parser.current_string_buf_loc - stringbuf; + Napi::ArrayBuffer tapebufobj = Napi::ArrayBuffer::New(env, static_cast(tapebuf), tapebufsize, + [](Napi::Env /*env*/, void * obj) { + uint64_t *o = static_cast(obj); + delete o; + }); + Napi::ArrayBuffer stringbufobj = Napi::ArrayBuffer::New(env, static_cast(stringbuf), stringbufsize, + [](Napi::Env /*env*/, void * obj) { + uint8_t *o = static_cast(obj); + delete o; + }); + Napi::Object result = Napi::Object::New(env); + result.Set("tapeBuffer", tapebufobj); + result.Set("stringBuffer", stringbufobj); + return result; +} + Napi::Object simdjsonnode::Init(Napi::Env env, Napi::Object exports) { exports.Set("isValid", Napi::Function::New(env, simdjsonnode::IsValidWrapped)); exports.Set("parse", Napi::Function::New(env, simdjsonnode::ParseWrapped)); exports.Set("lazyParse", Napi::Function::New(env, simdjsonnode::LazyParseWrapped)); + exports.Set("buffersWith", Napi::Function::New(env, simdjsonnode::BuffersWithParseWrapped)); return exports; } diff --git a/simdjson/bindings.h b/simdjson/bindings.h index 368c59d..f8ec1a7 100644 --- a/simdjson/bindings.h +++ b/simdjson/bindings.h @@ -15,5 +15,7 @@ namespace simdjsonnode { Napi::Value ValueForKeyPathWrapped(const Napi::CallbackInfo& info); Napi::Value findKeyPath(Napi::Env env, std::vector subpaths, dom::element pjh); + Napi::Object BuffersWithParseWrapped(const Napi::CallbackInfo& info); + Napi::Object Init(Napi::Env env, Napi::Object exports); }