66
77namespace node {
88
9+ using v8::Isolate;
910using v8::Local;
11+ using v8::MaybeLocal;
1012using v8::NewStringType;
1113using v8::Object;
1214using v8::String;
1315
16+ template <typename T, size_t N, T P>
17+ struct ExternalStringResource ;
18+
19+ template <size_t N, const char (&P)[N]>
20+ struct ExternalStringResource<const char[N], N, P>
21+ : public String::ExternalOneByteStringResource {
22+ const char * data () const override { return P; }
23+ size_t length () const override { return N; }
24+ void Dispose () override { /* Default calls `delete this`. */ }
25+ };
26+
27+ template <size_t N, const uint16_t (&P)[N]>
28+ struct ExternalStringResource<const uint16_t[N], N, P>
29+ : public String::ExternalStringResource {
30+ const uint16_t * data () const override { return P; }
31+ size_t length () const override { return N; }
32+ void Dispose () override { /* Default calls `delete this`. */ }
33+ };
34+
1435// id##_data is defined in node_natives.h.
15- #define V (id ) \
16- static struct : public String ::ExternalOneByteStringResource { \
17- const char * data () const override { \
18- return reinterpret_cast <const char *>(id##_data); \
19- } \
20- size_t length () const override { return sizeof (id##_data); } \
21- void Dispose () override { /* Default calls `delete this`. */ } \
22- } id##_external_data;
36+ #define V (id ) \
37+ static ExternalStringResource<decltype (id##_data), \
38+ arraysize (id##_data), \
39+ id##_data> id##_external_data;
2340NODE_NATIVES_MAP (V)
2441#undef V
2542
43+ inline MaybeLocal<String>
44+ ToExternal (Isolate* isolate, String::ExternalOneByteStringResource* that) {
45+ return String::NewExternalOneByte (isolate, that);
46+ }
47+
48+ inline MaybeLocal<String>
49+ ToExternal (Isolate* isolate, String::ExternalStringResource* that) {
50+ return String::NewExternalTwoByte (isolate, that);
51+ }
52+
2653Local<String> MainSource (Environment* env) {
27- auto maybe_string =
28- String::NewExternalOneByte (
29- env->isolate (),
30- &internal_bootstrap_node_external_data);
31- return maybe_string.ToLocalChecked ();
54+ return ToExternal (env->isolate (),
55+ &internal_bootstrap_node_external_data).ToLocalChecked ();
3256}
3357
3458void DefineJavaScript (Environment* env, Local<Object> target) {
@@ -40,8 +64,7 @@ void DefineJavaScript(Environment* env, Local<Object> target) {
4064 env->isolate (), id##_name, NewStringType::kNormal , \
4165 sizeof (id##_name)).ToLocalChecked (); \
4266 auto value = \
43- String::NewExternalOneByte ( \
44- env->isolate (), &id##_external_data).ToLocalChecked (); \
67+ ToExternal (env->isolate (), &id##_external_data).ToLocalChecked (); \
4568 CHECK (target->Set (context, key, value).FromJust ()); \
4669 } while (0 );
4770 NODE_NATIVES_MAP (V)
0 commit comments