1616namespace node {
1717namespace json_parser {
1818
19+ class JsonParser ::Impl {
20+ public:
21+ simdjson::dom::parser parser;
22+ };
23+
24+ JsonParser::JsonParser () : impl_(std::make_unique<Impl>()) {}
25+
26+ JsonParser::~JsonParser () = default ;
27+
28+ void * JsonParser::GetParser () {
29+ return &impl_->parser ;
30+ }
31+
1932using std::string;
2033
2134using v8::Array;
@@ -150,15 +163,18 @@ MaybeLocal<Value> ConvertSimdjsonElement(Isolate* isolate,
150163 }
151164}
152165
153- MaybeLocal<Value> ParseInternal (Isolate* isolate ,
166+ MaybeLocal<Value> ParseInternal (Environment* env ,
154167 const char * data,
155168 size_t length) {
169+ Isolate* isolate = env->isolate ();
156170 simdjson::padded_string padded_string (data, length);
157171
158- simdjson::dom::parser parser;
172+ // Get the cached parser from the Environment
173+ simdjson::dom::parser* parser = static_cast <simdjson::dom::parser*>(
174+ env->json_parser ()->GetParser ());
159175 simdjson::dom::element doc;
160176
161- simdjson::error_code error = parser. parse (padded_string).get (doc);
177+ simdjson::error_code error = parser-> parse (padded_string).get (doc);
162178
163179 if (error) {
164180 // TODO(araujogui): create a ERR_INVALID_JSON macro
@@ -171,25 +187,27 @@ MaybeLocal<Value> ParseInternal(Isolate* isolate,
171187}
172188
173189void Parse (const FunctionCallbackInfo<Value>& args) {
190+ Environment* env = Environment::GetCurrent (args);
174191 if (args.Length () < 1 || !args[0 ]->IsString ()) {
175- THROW_ERR_INVALID_ARG_TYPE (args. GetIsolate (),
192+ THROW_ERR_INVALID_ARG_TYPE (env-> isolate (),
176193 " The \" text\" argument must be a string." );
177194 return ;
178195 }
179196
180197 Local<String> json_str = args[0 ].As <String>();
181198
182- string str = ObjectToString (args. GetIsolate (), json_str);
199+ string str = ObjectToString (env-> isolate (), json_str);
183200
184201 Local<Value> result;
185- if (!ParseInternal (args. GetIsolate () , str.data (), str.size ()).ToLocal (&result))
202+ if (!ParseInternal (env , str.data (), str.size ()).ToLocal (&result))
186203 return ;
187204
188205 args.GetReturnValue ().Set (result);
189206}
190207
191208void ParseFromBuffer (const FunctionCallbackInfo<Value>& args) {
192- Isolate* isolate = args.GetIsolate ();
209+ Environment* env = Environment::GetCurrent (args);
210+ Isolate* isolate = env->isolate ();
193211
194212 if (args.Length () < 1 ) {
195213 THROW_ERR_INVALID_ARG_TYPE (
@@ -216,7 +234,7 @@ void ParseFromBuffer(const FunctionCallbackInfo<Value>& args) {
216234 }
217235
218236 Local<Value> result;
219- if (!ParseInternal (isolate , data, length).ToLocal (&result)) return ;
237+ if (!ParseInternal (env , data, length).ToLocal (&result)) return ;
220238
221239 args.GetReturnValue ().Set (result);
222240}
0 commit comments