@@ -34,14 +34,32 @@ struct napi_env__ {
3434 ~napi_env__ () {
3535 last_exception.Reset ();
3636 has_instance.Reset ();
37+ wrap_template.Reset ();
38+ function_data_template.Reset ();
39+ accessor_data_template.Reset ();
3740 }
3841 v8::Isolate* isolate;
3942 v8::Persistent<v8::Value> last_exception;
4043 v8::Persistent<v8::Value> has_instance;
44+ v8::Persistent<v8::ObjectTemplate> wrap_template;
45+ v8::Persistent<v8::ObjectTemplate> function_data_template;
46+ v8::Persistent<v8::ObjectTemplate> accessor_data_template;
4147 bool has_instance_available;
4248 napi_extended_error_info last_error;
4349};
4450
51+ #define ENV_OBJECT_TEMPLATE (env, prefix, destination, field_count ) \
52+ do { \
53+ if ((env)->prefix ## _template.IsEmpty ()) { \
54+ (destination) = v8::ObjectTemplate::New (isolate); \
55+ (destination)->SetInternalFieldCount ((field_count)); \
56+ (env)->prefix ## _template.Reset (isolate, (destination)); \
57+ } else { \
58+ (destination) = env->prefix ## _template.Get (isolate); \
59+ } \
60+ } while (0 )
61+
62+
4563#define RETURN_STATUS_IF_FALSE (env, condition, status ) \
4664 do { \
4765 if (!(condition)) { \
@@ -603,8 +621,8 @@ v8::Local<v8::Object> CreateFunctionCallbackData(napi_env env,
603621 v8::Isolate* isolate = env->isolate ;
604622 v8::Local<v8::Context> context = isolate->GetCurrentContext ();
605623
606- v8::Local<v8::ObjectTemplate> otpl = v8::ObjectTemplate::New (isolate) ;
607- otpl-> SetInternalFieldCount ( v8impl::kFunctionFieldCount );
624+ v8::Local<v8::ObjectTemplate> otpl;
625+ ENV_OBJECT_TEMPLATE (env, function_data, otpl, v8impl::kFunctionFieldCount );
608626 v8::Local<v8::Object> cbdata = otpl->NewInstance (context).ToLocalChecked ();
609627
610628 cbdata->SetInternalField (
@@ -629,8 +647,8 @@ v8::Local<v8::Object> CreateAccessorCallbackData(napi_env env,
629647 v8::Isolate* isolate = env->isolate ;
630648 v8::Local<v8::Context> context = isolate->GetCurrentContext ();
631649
632- v8::Local<v8::ObjectTemplate> otpl = v8::ObjectTemplate::New (isolate) ;
633- otpl-> SetInternalFieldCount ( v8impl::kAccessorFieldCount );
650+ v8::Local<v8::ObjectTemplate> otpl;
651+ ENV_OBJECT_TEMPLATE (env, accessor_data, otpl, v8impl::kAccessorFieldCount );
634652 v8::Local<v8::Object> cbdata = otpl->NewInstance (context).ToLocalChecked ();
635653
636654 cbdata->SetInternalField (
@@ -1966,11 +1984,10 @@ napi_status napi_wrap(napi_env env,
19661984 v8::Local<v8::Object> obj = value.As <v8::Object>();
19671985
19681986 // Create a wrapper object with an internal field to hold the wrapped pointer.
1969- v8::Local<v8::ObjectTemplate> wrapperTemplate =
1970- v8::ObjectTemplate::New (isolate);
1971- wrapperTemplate->SetInternalFieldCount (1 );
1987+ v8::Local<v8::ObjectTemplate> wrapper_template;
1988+ ENV_OBJECT_TEMPLATE (env, wrap, wrapper_template, 1 );
19721989 v8::Local<v8::Object> wrapper =
1973- wrapperTemplate ->NewInstance (context).ToLocalChecked ();
1990+ wrapper_template ->NewInstance (context).ToLocalChecked ();
19741991 wrapper->SetInternalField (0 , v8::External::New (isolate, native_object));
19751992
19761993 // Insert the wrapper into the object's prototype chain.
0 commit comments