@@ -289,7 +289,7 @@ inline void Environment::AssignToContext(v8::Local<v8::Context> context,
289289 ContextEmbedderIndex::kContextTag , Environment::kNodeContextTagPtr );
290290 // Used to retrieve bindings
291291 context->SetAlignedPointerInEmbedderData (
292- ContextEmbedderIndex::KBindingListIndex , &(this ->bindings_ ));
292+ ContextEmbedderIndex::kBindingListIndex , &(this ->bindings_ ));
293293
294294#if HAVE_INSPECTOR
295295 inspector_agent ()->ContextCreated (context, info);
@@ -322,74 +322,69 @@ inline Environment* Environment::GetCurrent(v8::Local<v8::Context> context) {
322322
323323inline Environment* Environment::GetCurrent (
324324 const v8::FunctionCallbackInfo<v8::Value>& info) {
325- return BindingDataBase::Unwrap<BindingDataBase> (info)->env ( );
325+ return GetCurrent (info. GetIsolate ( )->GetCurrentContext () );
326326}
327327
328328template <typename T>
329329inline Environment* Environment::GetCurrent (
330330 const v8::PropertyCallbackInfo<T>& info) {
331- return BindingDataBase::Unwrap<BindingDataBase> (info)->env ( );
331+ return GetCurrent (info. GetIsolate ( )->GetCurrentContext () );
332332}
333333
334- inline BindingDataBase::BindingDataBase (Environment* env,
335- v8::Local<v8::Object> target)
336- : BaseObject(env, target) {}
337-
338334template <typename T, typename U>
339- inline T* BindingDataBase::Unwrap (const v8::PropertyCallbackInfo<U>& info) {
340- return Unwrap <T>(info.GetIsolate ()->GetCurrentContext (), info.Data ());
335+ inline T* Environment::GetBindingData (const v8::PropertyCallbackInfo<U>& info) {
336+ return GetBindingData <T>(info.GetIsolate ()->GetCurrentContext (), info.Data ());
341337}
342338
343339template <typename T>
344- inline T* BindingDataBase::Unwrap (
340+ inline T* Environment::GetBindingData (
345341 const v8::FunctionCallbackInfo<v8::Value>& info) {
346- return Unwrap <T>(info.GetIsolate ()->GetCurrentContext (), info.Data ());
342+ return GetBindingData <T>(info.GetIsolate ()->GetCurrentContext (), info.Data ());
347343}
348344
349345template <typename T>
350- inline T* BindingDataBase::Unwrap (v8::Local<v8::Context> context,
351- v8::Local<v8::Value> val) {
352- CHECK (val->IsUint32 ());
346+ inline T* Environment::GetBindingData (v8::Local<v8::Context> context,
347+ v8::Local<v8::Value> val) {
348+ DCHECK (val->IsUint32 ());
353349 uint32_t index = val.As <v8::Uint32>()->Value ();
354- std::vector<BindingDataBase*>* list =
355- static_cast <std::vector<BindingDataBase*>*>(
356- context->GetAlignedPointerFromEmbedderData (
357- ContextEmbedderIndex::KBindingListIndex));
358- CHECK_GT (list->size (), index);
359- T* result = static_cast <T*>(list->at (index));
350+ BindingDataList* list = static_cast <BindingDataList*>(
351+ context->GetAlignedPointerFromEmbedderData (
352+ ContextEmbedderIndex::kBindingListIndex ));
353+ DCHECK_NOT_NULL (list);
354+ DCHECK_GT (list->size (), index);
355+ T* result = static_cast <T*>(list->at (index).get ());
356+ DCHECK_NOT_NULL (result);
357+ DCHECK_EQ (result->env (), GetCurrent (context));
360358 return result;
361359}
362360
363361template <typename T>
364- inline v8::Local<v8::Uint32> BindingDataBase::New (
365- Environment* env,
362+ inline std::pair<T*, uint32_t > Environment::NewBindingData (
366363 v8::Local<v8::Context> context,
367364 v8::Local<v8::Object> target) {
368- T* data = new T (env, target );
369- // This won't compile if T is not a BindingDataBase subclass.
370- BindingDataBase* item = static_cast <BindingDataBase*>(data );
371- std::vector<BindingDataBase*>* list =
372- static_cast <std::vector<BindingDataBase*>*> (
373- context-> GetAlignedPointerFromEmbedderData (
374- ContextEmbedderIndex::KBindingListIndex) );
365+ DCHECK_EQ ( GetCurrent (context), this );
366+ // This won't compile if T is not a BaseObject subclass.
367+ BaseObjectPtr<T> item = MakeDetachedBaseObject<T>( this , target );
368+ BindingDataList* list = static_cast <BindingDataList*>(
369+ context-> GetAlignedPointerFromEmbedderData (
370+ ContextEmbedderIndex:: kBindingListIndex ));
371+ DCHECK_NOT_NULL (list );
375372 size_t index = list->size ();
376- list->push_back (item);
377- return v8::Integer::NewFromUnsigned (env-> isolate (), index). As <v8::Uint32>( );
373+ list->emplace_back (item);
374+ return std::make_pair (item. get (), index);
378375}
379376
380377template <typename T>
381- Environment::BindingScope<T>::BindingScope(Environment* env,
382- v8::Local<v8::Context> context,
378+ Environment::BindingScope<T>::BindingScope(v8::Local<v8::Context> context,
383379 v8::Local<v8::Object> target)
384- : env(env) {
385- v8::Local<v8::Uint32> index = BindingDataBase::New<T>(env, context, target);
386- data = BindingDataBase::Unwrap<T>(context, index);
387- env->set_current_callback_data (index);
380+ : env(Environment::GetCurrent(context)) {
381+ std::tie (data, env->current_callback_data_ ) =
382+ env->NewBindingData <T>(context, target);
388383}
389384
390385template <typename T>
391386Environment::BindingScope<T>::~BindingScope () {
392- env->set_current_callback_data ( env->default_callback_data ()) ;
387+ env->current_callback_data_ = env->default_callback_data_ ;
393388}
394389
395390inline Environment* Environment::GetThreadLocalEnv () {
@@ -1299,12 +1294,20 @@ void Environment::set_process_exit_handler(
12991294 }
13001295 ENVIRONMENT_STRONG_PERSISTENT_TEMPLATES (V)
13011296 ENVIRONMENT_STRONG_PERSISTENT_VALUES (V)
1302- ENVIRONMENT_CALLBACK_DATA (V)
13031297#undef V
13041298
1305- inline v8::Local<v8::Context> Environment::context () const {
1306- return PersistentToLocal::Strong (context_);
1307- }
1299+ v8::Local<v8::Context> Environment::context () const {
1300+ return PersistentToLocal::Strong (context_);
1301+ }
1302+
1303+ v8::Local<v8::Value> Environment::as_callback_data () const {
1304+ return v8::Integer::NewFromUnsigned (isolate (), default_callback_data_);
1305+ }
1306+
1307+ v8::Local<v8::Value> Environment::current_callback_data () const {
1308+ return v8::Integer::NewFromUnsigned (isolate (), current_callback_data_);
1309+ }
1310+
13081311} // namespace node
13091312
13101313// These two files depend on each other. Including base_object-inl.h after this
0 commit comments