6
6
7
7
namespace node {
8
8
9
+ using v8::Isolate;
9
10
using v8::Local;
11
+ using v8::MaybeLocal;
10
12
using v8::NewStringType;
11
13
using v8::Object;
12
14
using v8::String;
13
15
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
+
14
35
// 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;
23
40
NODE_NATIVES_MAP (V)
24
41
#undef V
25
42
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
+
26
53
Local<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 ();
32
56
}
33
57
34
58
void DefineJavaScript (Environment* env, Local<Object> target) {
@@ -40,8 +64,7 @@ void DefineJavaScript(Environment* env, Local<Object> target) {
40
64
env->isolate (), id##_name, NewStringType::kNormal , \
41
65
sizeof (id##_name)).ToLocalChecked (); \
42
66
auto value = \
43
- String::NewExternalOneByte ( \
44
- env->isolate (), &id##_external_data).ToLocalChecked (); \
67
+ ToExternal (env->isolate (), &id##_external_data).ToLocalChecked (); \
45
68
CHECK (target->Set (context, key, value).FromJust ()); \
46
69
} while (0 );
47
70
NODE_NATIVES_MAP (V)
0 commit comments