@@ -829,20 +829,46 @@ static void InternalModuleReadJSON(const FunctionCallbackInfo<Value>& args) {
829
829
}
830
830
831
831
const size_t size = offset - start;
832
- if (size == 0 || (
833
- size == SearchString (&chars[start], size, " \" name\" " ) &&
834
- size == SearchString (&chars[start], size, " \" main\" " ) &&
835
- size == SearchString (&chars[start], size, " \" exports\" " ) &&
836
- size == SearchString (&chars[start], size, " \" type\" " ))) {
837
- args.GetReturnValue ().Set (env->empty_object_string ());
838
- } else {
839
- Local<String> chars_string =
832
+ char * p = &chars[start];
833
+ char * pe = &chars[size];
834
+ char * pos[2 ];
835
+ char ** ppos = &pos[0 ];
836
+
837
+ while (p < pe) {
838
+ char c = *p++;
839
+ if (c == ' "' ) goto quote; // Keeps code flat and inner loop small.
840
+ if (c == ' \\ ' && p < pe && *p == ' "' ) p++;
841
+ continue ;
842
+ quote:
843
+ *ppos++ = p;
844
+ if (ppos < &pos[2 ]) continue ;
845
+ ppos = &pos[0 ];
846
+
847
+ char * s = &pos[0 ][0 ];
848
+ char * se = &pos[1 ][-1 ]; // Exclude quote.
849
+ size_t n = se - s;
850
+
851
+ if (n == 4 ) {
852
+ if (0 == memcmp (s, " main" , 4 )) break ;
853
+ if (0 == memcmp (s, " name" , 4 )) break ;
854
+ if (0 == memcmp (s, " type" , 4 )) break ;
855
+ } else if (n == 7 ) {
856
+ if (0 == memcmp (s, " exports" , 7 )) break ;
857
+ }
858
+ }
859
+
860
+ Local<String> return_value;
861
+ if (p < pe) {
862
+ return_value =
840
863
String::NewFromUtf8 (isolate,
841
864
&chars[start],
842
865
v8::NewStringType::kNormal ,
843
866
size).ToLocalChecked ();
844
- args.GetReturnValue ().Set (chars_string);
867
+ } else {
868
+ return_value = env->empty_object_string ();
845
869
}
870
+
871
+ args.GetReturnValue ().Set (return_value);
846
872
}
847
873
848
874
// Used to speed up module loading. Returns 0 if the path refers to
0 commit comments