@@ -287,6 +287,10 @@ inline void Environment::AssignToContext(v8::Local<v8::Context> context,
287
287
// Used by Environment::GetCurrent to know that we are on a node context.
288
288
context->SetAlignedPointerInEmbedderData (
289
289
ContextEmbedderIndex::kContextTag , Environment::kNodeContextTagPtr );
290
+ // Used to retrieve bindings
291
+ context->SetAlignedPointerInEmbedderData (
292
+ ContextEmbedderIndex::kBindingListIndex , &(this ->bindings_ ));
293
+
290
294
#if HAVE_INSPECTOR
291
295
inspector_agent ()->ContextCreated (context, info);
292
296
#endif // HAVE_INSPECTOR
@@ -318,55 +322,55 @@ inline Environment* Environment::GetCurrent(v8::Local<v8::Context> context) {
318
322
319
323
inline Environment* Environment::GetCurrent (
320
324
const v8::FunctionCallbackInfo<v8::Value>& info) {
321
- return GetFromCallbackData (info.Data ());
325
+ return GetCurrent (info.GetIsolate ()-> GetCurrentContext ());
322
326
}
323
327
324
328
template <typename T>
325
329
inline Environment* Environment::GetCurrent (
326
330
const v8::PropertyCallbackInfo<T>& info) {
327
- return GetFromCallbackData (info.Data ());
331
+ return GetCurrent (info.GetIsolate ()-> GetCurrentContext ());
328
332
}
329
333
330
- Environment* Environment::GetFromCallbackData (v8::Local<v8::Value> val) {
331
- DCHECK (val->IsObject ());
332
- v8::Local<v8::Object> obj = val.As <v8::Object>();
333
- DCHECK_GE (obj->InternalFieldCount (),
334
- BaseObject::kInternalFieldCount );
335
- Environment* env = Unwrap<BaseObject>(obj)->env ();
336
- DCHECK (env->as_callback_data_template ()->HasInstance (obj));
337
- return env;
334
+ template <typename T, typename U>
335
+ inline T* Environment::GetBindingData (const v8::PropertyCallbackInfo<U>& info) {
336
+ return GetBindingData<T>(info.GetIsolate ()->GetCurrentContext ());
338
337
}
339
338
340
339
template <typename T>
341
- Environment::BindingScope<T>::BindingScope(Environment* env) : env(env) {
342
- v8::Local<v8::Object> callback_data;
343
- if (!env->MakeBindingCallbackData <T>().ToLocal (&callback_data))
344
- return ;
345
- data = Unwrap<T>(callback_data);
346
-
347
- // No nesting allowed currently.
348
- CHECK_EQ (env->current_callback_data (), env->as_callback_data ());
349
- env->set_current_callback_data (callback_data);
340
+ inline T* Environment::GetBindingData (
341
+ const v8::FunctionCallbackInfo<v8::Value>& info) {
342
+ return GetBindingData<T>(info.GetIsolate ()->GetCurrentContext ());
350
343
}
351
344
352
345
template <typename T>
353
- Environment::BindingScope<T>::~BindingScope () {
354
- env->set_current_callback_data (env->as_callback_data ());
346
+ inline T* Environment::GetBindingData (v8::Local<v8::Context> context) {
347
+ BindingDataStore* map = static_cast <BindingDataStore*>(
348
+ context->GetAlignedPointerFromEmbedderData (
349
+ ContextEmbedderIndex::kBindingListIndex ));
350
+ DCHECK_NOT_NULL (map);
351
+ auto it = map->find (T::binding_data_name);
352
+ if (UNLIKELY (it == map->end ())) return nullptr ;
353
+ T* result = static_cast <T*>(it->second .get ());
354
+ DCHECK_NOT_NULL (result);
355
+ DCHECK_EQ (result->env (), GetCurrent (context));
356
+ return result;
355
357
}
356
358
357
359
template <typename T>
358
- v8::MaybeLocal<v8::Object> Environment::MakeBindingCallbackData () {
359
- v8::Local<v8::Function> ctor;
360
- v8::Local<v8::Object> obj;
361
- if (!as_callback_data_template ()->GetFunction (context ()).ToLocal (&ctor) ||
362
- !ctor->NewInstance (context ()).ToLocal (&obj)) {
363
- return v8::MaybeLocal<v8::Object>();
364
- }
365
- T* data = new T (this , obj);
360
+ inline T* Environment::AddBindingData (
361
+ v8::Local<v8::Context> context,
362
+ v8::Local<v8::Object> target) {
363
+ DCHECK_EQ (GetCurrent (context), this );
366
364
// This won't compile if T is not a BaseObject subclass.
367
- CHECK_EQ (data, static_cast <BaseObject*>(data));
368
- data->MakeWeak ();
369
- return obj;
365
+ BaseObjectPtr<T> item = MakeDetachedBaseObject<T>(this , target);
366
+ BindingDataStore* map = static_cast <BindingDataStore*>(
367
+ context->GetAlignedPointerFromEmbedderData (
368
+ ContextEmbedderIndex::kBindingListIndex ));
369
+ DCHECK_NOT_NULL (map);
370
+ auto result = map->emplace (T::binding_data_name, item);
371
+ CHECK (result.second );
372
+ DCHECK_EQ (GetBindingData<T>(context), item.get ());
373
+ return item.get ();
370
374
}
371
375
372
376
inline Environment* Environment::GetThreadLocalEnv () {
@@ -1077,8 +1081,7 @@ inline v8::Local<v8::FunctionTemplate>
1077
1081
v8::Local<v8::Signature> signature,
1078
1082
v8::ConstructorBehavior behavior,
1079
1083
v8::SideEffectType side_effect_type) {
1080
- v8::Local<v8::Object> external = current_callback_data ();
1081
- return v8::FunctionTemplate::New (isolate (), callback, external,
1084
+ return v8::FunctionTemplate::New (isolate (), callback, v8::Local<v8::Value>(),
1082
1085
signature, 0 , behavior, side_effect_type);
1083
1086
}
1084
1087
@@ -1270,9 +1273,10 @@ void Environment::set_process_exit_handler(
1270
1273
ENVIRONMENT_STRONG_PERSISTENT_VALUES (V)
1271
1274
#undef V
1272
1275
1273
- inline v8::Local<v8::Context> Environment::context () const {
1274
- return PersistentToLocal::Strong (context_);
1275
- }
1276
+ v8::Local<v8::Context> Environment::context () const {
1277
+ return PersistentToLocal::Strong (context_);
1278
+ }
1279
+
1276
1280
} // namespace node
1277
1281
1278
1282
// These two files depend on each other. Including base_object-inl.h after this
0 commit comments