8000
We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
There was an error while loading. Please reload this page.
1 parent 7f126c2 commit 6ba38e8Copy full SHA for 6ba38e8
src/node_api.cc
@@ -36,14 +36,32 @@ struct napi_env__ {
36
~napi_env__() {
37
last_exception.Reset();
38
has_instance.Reset();
39
+ wrap_template.Reset();
40
+ function_data_template.Reset();
41
+ accessor_data_template.Reset();
42
}
43
v8::Isolate* isolate;
44
v8::Persistent<v8::Value> last_exception;
45
v8::Persistent<v8::Value> has_instance;
46
+ v8::Persistent<v8::ObjectTemplate> wrap_template;
47
+ v8::Persistent<v8::ObjectTemplate> function_data_template;
48
+ v8::Persistent<v8::ObjectTemplate> accessor_data_template;
49
bool has_instance_available;
50
napi_extended_error_info last_error;
51
};
52
53
+#define ENV_OBJECT_TEMPLATE(env, prefix, destination, field_count) \
54
+ do { \
55
+ if ((env)->prefix ## _template.IsEmpty()) { \
56
+ (destination) = v8::ObjectTemplate::New(isolate); \
57
+ (destination)->SetInternalFieldCount((field_count)); \
58
+ (env)->prefix ## _template.Reset(isolate, (destination)); \
59
+ } else { \
60
+ (destination) = env->prefix ## _template.Get(isolate); \
61
+ } \
62
+ } while (0)
63
+
64
65
#define RETURN_STATUS_IF_FALSE(env, condition, status) \
66
do { \
67
if (!(condition)) { \
@@ -608,8 +626,8 @@ v8::Local<v8::Object> CreateFunctionCallbackData(napi_env env,
608
626
v8::Isolate* isolate = env->isolate;
609
627
v8::Local<v8::Context> context = isolate->GetCurrentContext();
610
628
611
- v8::Local<v8::ObjectTemplate> otpl = v8::ObjectTemplate::New(isolate);
612
- otpl->SetInternalFieldCount(v8impl::kFunctionFieldCount);
629
+ v8::Local<v8::ObjectTemplate> otpl;
630
+ ENV_OBJECT_TEMPLATE(env, function_data, otpl, v8impl::kFunctionFieldCount);
613
631
v8::Local<v8::Object> cbdata = otpl->NewInstance(context).ToLocalChecked();
614
632
615
633
cbdata->SetInternalField(
@@ -634,8 +652,8 @@ v8::Local<v8::Object> CreateAccessorCallbackData(napi_env env,
634
652
635
653
636
654
637
638
- otpl->SetInternalFieldCount(v8impl::kAccessorFieldCount);
655
656
+ ENV_OBJECT_TEMPLATE(env, accessor_data, otpl, v8impl::kAccessorFieldCount);
639
657
640
658
641
659
@@ -2011,11 +2029,10 @@ napi_status napi_wrap(napi_env env,
2011
2029
v8::Local<v8::Object> obj = value.As<v8::Object>();
2012
2030
2013
2031
// Create a wrapper object with an internal field to hold the wrapped pointer.
2014
- v8::Local<v8::ObjectTemplate> wrapperTemplate =
2015
- v8::ObjectTemplate::New(isolate);
2016
- wrapperTemplate->SetInternalFieldCount(1);
2032
+ v8::Local<v8::ObjectTemplate> wrapper_template;
2033
+ ENV_OBJECT_TEMPLATE(env, wrap, wrapper_template, 1);
2017
2034
v8::Local<v8::Object> wrapper =
2018
- wrapperTemplate->NewInstance(context).ToLocalChecked();
2035
+ wrapper_template->NewInstance(context).ToLocalChecked();
2019
2036
wrapper->SetInternalField(0, v8::External::New(isolate, native_object));
2020
2037
2021
2038
// Insert the wrapper into the object's prototype chain.