@@ -333,58 +333,43 @@ inline Environment* Environment::GetCurrent(
333
333
334
334
template <typename T, typename U>
335
335
inline T* Environment::GetBindingData(const v8::PropertyCallbackInfo<U>& info) {
336
- return GetBindingData<T>(info.GetIsolate()->GetCurrentContext(), info.Data() );
336
+ return GetBindingData<T>(info.GetIsolate()->GetCurrentContext());
337
337
}
338
338
339
339
template <typename T>
340
340
inline T* Environment::GetBindingData(
341
341
const v8::FunctionCallbackInfo<v8::Value>& info) {
342
- return GetBindingData<T>(info.GetIsolate()->GetCurrentContext(), info.Data() );
342
+ return GetBindingData<T>(info.GetIsolate()->GetCurrentContext());
343
343
}
344
344
345
345
template <typename T>
346
- inline T* Environment::GetBindingData(v8::Local<v8::Context> context,
347
- v8::Local<v8::Value> val) {
348
- DCHECK(val->IsUint32());
349
- uint32_t index = val.As<v8::Uint32>()->Value();
350
- BindingDataList* list = static_cast<BindingDataList*>(
346
+ inline T* Environment::GetBindingData(v8::Local<v8::Context> context) {
347
+ BindingDataStore* list = static_cast<BindingDataStore*>(
351
348
context->GetAlignedPointerFromEmbedderData(
352
349
ContextEmbedderIndex::kBindingListIndex));
353
350
DCHECK_NOT_NULL(list);
354
- DCHECK_GT(list->size(), index);
355
- T* result = static_cast<T*>(list->at(index).get());
351
+ auto it = list->find(T::binding_data_name);
352
+ DCHECK_NE(it, list->end());
353
+ T* result = static_cast<T*>(it->second.get());
356
354
DCHECK_NOT_NULL(result);
357
355
DCHECK_EQ(result->env(), GetCurrent(context));
358
356
return result;
359
357
}
360
358
361
359
template <typename T>
362
- inline std::pair<T*, uint32_t> Environment::NewBindingData (
360
+ inline T* Environment::AddBindingData (
363
361
v8::Local<v8::Context> context,
364
362
v8::Local<v8::Object> target) {
365
363
DCHECK_EQ(GetCurrent(context), this);
366
364
// This won't compile if T is not a BaseObject subclass.
367
365
BaseObjectPtr<T> item = MakeDetachedBaseObject<T>(this, target);
368
- BindingDataList * list = static_cast<BindingDataList *>(
366
+ BindingDataStore * list = static_cast<BindingDataStore *>(
369
367
context->GetAlignedPointerFromEmbedderData(
370
368
ContextEmbedderIndex::kBindingListIndex));
371
369
DCHECK_NOT_NULL(list);
372
- size_t index = list->size();
373
- list->emplace_back(item);
374
- return std::make_pair(item.get(), index);
375
- }
376
-
377
- template <typename T>
378
- Environment::BindingScope<T>::BindingScope(v8::Local<v8::Context> context,
379
- v8::Local<v8::Object> target)
380
- : env(Environment::GetCurrent(context)) {
381
- std::tie(data, env->current_callback_data_) =
382
- env->NewBindingData<T>(context, target);
383
- }
384
-
385
- template <typename T>
386
- Environment::BindingScope<T>::~BindingScope() {
387
- env->current_callback_data_ = env->default_callback_data_;
370
+ auto result = list->emplace(T::binding_data_name, item);
371
+ CHECK(result.second);
372
+ return item.get();
388
373
}
389
374
390
375
inline Environment* Environment::GetThreadLocalEnv() {
@@ -1103,8 +1088,7 @@ inline v8::Local<v8::FunctionTemplate>
1103
1088
v8::Local<v8::Signature> signature,
1104
1089
v8::ConstructorBehavior behavior,
1105
1090
v8::SideEffectType side_effect_type) {
1106
- v8::Local<v8::Value> external = current_callback_data();
1107
- return v8::FunctionTemplate::New(isolate(), callback, external,
1091
+ return v8::FunctionTemplate::New(isolate(), callback, v8::Local<v8::Value>(),
1108
1092
signature, 0, behavior, side_effect_type);
1109
1093
}
1110
1094
@@ -1300,14 +1284,6 @@ v8::Local<v8::Context> Environment::context() const {
1300
1284
return PersistentToLocal::Strong(context_);
1301
1285
}
1302
1286
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
-
1311
1287
} // namespace node
1312
1288
1313
1289
// These two files depend on each other. Including base_object-inl.h after this
0 commit comments