Skip to content

Commit 6391b3b

Browse files
joyeecheungnodejs-github-bot
authored andcommitted
src: use per-realm GetBindingData() wherever applicable
This reduce the number of embedder slot accesses and also removes the assumption in a few binding methods that the current realm is the principal realm of the current environment (which is not true for shadow realms). PR-URL: #49007 Refs: #48836 Reviewed-By: Chengzhong Wu <[email protected]> Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: Rafael Gonzaga <[email protected]> Reviewed-By: Stephen Belanger <[email protected]> Reviewed-By: Yagiz Nizipli <[email protected]>
1 parent 3578bee commit 6391b3b

9 files changed

+63
-64
lines changed

src/dataqueue/queue.cc

+6-6
Original file line numberDiff line numberDiff line change
@@ -876,12 +876,12 @@ class FdEntry final : public EntryImpl {
876876
}
877877
Realm* realm = entry->env()->principal_realm();
878878
return std::make_shared<ReaderImpl>(
879-
BaseObjectPtr<fs::FileHandle>(fs::FileHandle::New(
880-
realm->GetBindingData<fs::BindingData>(realm->context()),
881-
file,
882-
Local<Object>(),
883-
entry->start_,
884-
entry->end_ - entry->start_)),
879+
BaseObjectPtr<fs::FileHandle>(
880+
fs::FileHandle::New(realm->GetBindingData<fs::BindingData>(),
881+
file,
882+
Local<Object>(),
883+
entry->start_,
884+
entry->end_ - entry->start_)),
885885
entry);
886886
}
887887

src/encoding_binding.cc

+4-3
Original file line numberDiff line numberDiff line change
@@ -83,12 +83,13 @@ void BindingData::Deserialize(Local<Context> context,
8383
}
8484

8585
void BindingData::EncodeInto(const FunctionCallbackInfo<Value>& args) {
86-
Environment* env = Environment::GetCurrent(args);
87-
Isolate* isolate = env->isolate();
8886
CHECK_GE(args.Length(), 2);
8987
CHECK(args[0]->IsString());
9088
CHECK(args[1]->IsUint8Array());
91-
BindingData* binding_data = Realm::GetBindingData<BindingData>(args);
89+
90+
Realm* realm = Realm::GetCurrent(args);
91+
Isolate* isolate = realm->isolate();
92+
BindingData* binding_data = realm->GetBindingData<BindingData>();
9293

9394
Local<String> source = args[0].As<String>();
9495

src/node_blob.cc

+25-27
Original file line numberDiff line numberDiff line change
@@ -400,20 +400,22 @@ std::unique_ptr<worker::TransferData> Blob::CloneForMessaging() const {
400400
}
401401

402402
void Blob::StoreDataObject(const v8::FunctionCallbackInfo<v8::Value>& args) {
403-
Environment* env = Environment::GetCurrent(args);
404-
BlobBindingData* binding_data = Realm::GetBindingData<BlobBindingData>(args);
403+
Realm* realm = Realm::GetCurrent(args);
405404

406405
CHECK(args[0]->IsString()); // ID key
407-
CHECK(Blob::HasInstance(env, args[1])); // Blob
406+
CHECK(Blob::HasInstance(realm->env(), args[1])); // Blob
408407
CHECK(args[2]->IsUint32()); // Length
409408
CHECK(args[3]->IsString()); // Type
410409

411-
Utf8Value key(env->isolate(), args[0]);
410+
BlobBindingData* binding_data = realm->GetBindingData<BlobBindingData>();
411+
Isolate* isolate = realm->isolate();
412+
413+
Utf8Value key(isolate, args[0]);
412414
Blob* blob;
413415
ASSIGN_OR_RETURN_UNWRAP(&blob, args[1]);
414416

415417
size_t length = args[2].As<Uint32>()->Value();
416-
Utf8Value type(env->isolate(), args[3]);
418+
Utf8Value type(isolate, args[3]);
417419

418420
binding_data->store_data_object(
419421
std::string(*key, key.length()),
@@ -427,9 +429,11 @@ void Blob::StoreDataObject(const v8::FunctionCallbackInfo<v8::Value>& args) {
427429
void Blob::RevokeObjectURL(const FunctionCallbackInfo<Value>& args) {
428430
CHECK_GE(args.Length(), 1);
429431
CHECK(args[0]->IsString());
430-
BlobBindingData* binding_data = Realm::GetBindingData<BlobBindingData>(args);
431-
Environment* env = Environment::GetCurrent(args);
432-
Utf8Value input(env->isolate(), args[0].As<String>());
432+
Realm* realm = Realm::GetCurrent(args);
433+
BlobBindingData* binding_data = realm->GetBindingData<BlobBindingData>();
434+
Isolate* isolate = realm->isolate();
435+
436+
Utf8Value input(isolate, args[0].As<String>());
433437
auto out = ada::parse<ada::url_aggregator>(input.ToStringView());
434438

435439
if (!out) {
@@ -449,36 +453,30 @@ void Blob::RevokeObjectURL(const FunctionCallbackInfo<Value>& args) {
449453
}
450454

451455
void Blob::GetDataObject(const v8::FunctionCallbackInfo<v8::Value>& args) {
452-
BlobBindingData* binding_data = Realm::GetBindingData<BlobBindingData>(args);
453-
454-
Environment* env = Environment::GetCurrent(args);
455456
CHECK(args[0]->IsString());
457+
Realm* realm = Realm::GetCurrent(args);
458+
BlobBindingData* binding_data = realm->GetBindingData<BlobBindingData>();
459+
Isolate* isolate = realm->isolate();
456460

457-
Utf8Value key(env->isolate(), args[0]);
461+
Utf8Value key(isolate, args[0]);
458462

459463
BlobBindingData::StoredDataObject stored =
460464
binding_data->get_data_object(std::string(*key, key.length()));
461465
if (stored.blob) {
462466
Local<Value> type;
463-
if (!String::NewFromUtf8(
464-
env->isolate(),
465-
stored.type.c_str(),
466-
v8::NewStringType::kNormal,
467-
static_cast<int>(stored.type.length())).ToLocal(&type)) {
467+
if (!String::NewFromUtf8(isolate,
468+
stored.type.c_str(),
469+
v8::NewStringType::kNormal,
470+
static_cast<int>(stored.type.length()))
471+
.ToLocal(&type)) {
468472
return;
469473
}
470474

471-
Local<Value> values[] = {
472-
stored.blob->object(),
473-
Uint32::NewFromUnsigned(env->isolate(), stored.length),
474-
type
475-
};
475+
Local<Value> values[] = {stored.blob->object(),
476+
Uint32::NewFromUnsigned(isolate, stored.length),
477+
type};
476478

477-
args.GetReturnValue().Set(
478-
Array::New(
479-
env->isolate(),
480-
values,
481-
arraysize(values)));
479+
args.GetReturnValue().Set(Array::New(isolate, values, arraysize(values)));
482480
}
483481
}
484482

src/node_file-inl.h

+4-3
Original file line numberDiff line numberDiff line change
@@ -277,9 +277,10 @@ FSReqBase* GetReqWrap(const v8::FunctionCallbackInfo<v8::Value>& args,
277277
return Unwrap<FSReqBase>(value.As<v8::Object>());
278278
}
279279

280-
BindingData* binding_data = Realm::GetBindingData<BindingData>(args);
281-
Environment* env = binding_data->env();
282-
if (value->StrictEquals(env->fs_use_promises_symbol())) {
280+
Realm* realm = Realm::GetCurrent(args);
281+
BindingData* binding_data = realm->GetBindingData<BindingData>();
282+
283+
if (value->StrictEquals(realm->isolate_data()->fs_use_promises_symbol())) {
283284
if (use_bigint) {
284285
return FSReqPromise<AliasedBigInt64Array>::New(binding_data, use_bigint);
285286
} else {

src/node_file.cc

+4-4
Original file line numberDiff line numberDiff line change
@@ -2070,14 +2070,14 @@ static void Open(const FunctionCallbackInfo<Value>& args) {
20702070
}
20712071

20722072
static void OpenFileHandle(const FunctionCallbackInfo<Value>& args) {
2073-
BindingData* binding_data = Realm::GetBindingData<BindingData>(args);
2074-
Environment* env = binding_data->env();
2075-
Isolate* isolate = env->isolate();
2073+
Realm* realm = Realm::GetCurrent(args);
2074+
BindingData* binding_data = realm->GetBindingData<BindingData>();
2075+
Environment* env = realm->env();
20762076

20772077
const int argc = args.Length();
20782078
CHECK_GE(argc, 3);
20792079

2080-
BufferValue path(isolate, args[0]);
2080+
BufferValue path(realm->isolate(), args[0]);
20812081
CHECK_NOT_NULL(*path);
20822082

20832083
CHECK(args[1]->IsInt32());

src/node_http2.cc

+5-5
Original file line numberDiff line numberDiff line change
@@ -2650,12 +2650,12 @@ void Http2Session::RefreshState(const FunctionCallbackInfo<Value>& args) {
26502650

26512651
// Constructor for new Http2Session instances.
26522652
void Http2Session::New(const FunctionCallbackInfo<Value>& args) {
2653-
Http2State* state = Realm::GetBindingData<Http2State>(args);
2654-
Environment* env = state->env();
2653+
Realm* realm = Realm::GetCurrent(args);
2654+
Http2State* state = realm->GetBindingData<Http2State>();
2655+
26552656
CHECK(args.IsConstructCall());
2656-
SessionType type =
2657-
static_cast<SessionType>(
2658-
args[0]->Int32Value(env->context()).ToChecked());
2657+
SessionType type = static_cast<SessionType>(
2658+
args[0]->Int32Value(realm->context()).ToChecked());
26592659
Http2Session* session = new Http2Session(state, args.This(), type);
26602660
Debug(session, "session created");
26612661
}

src/node_realm.h

+2
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ class Realm : public MemoryRetainer {
101101
const v8::FunctionCallbackInfo<v8::Value>& info);
102102
template <typename T>
103103
static inline T* GetBindingData(v8::Local<v8::Context> context);
104+
template <typename T>
105+
inline T* GetBindingData();
104106
inline BindingDataStore* binding_data_store();
105107

106108
// The BaseObject count is a debugging helper that makes sure that there are

src/node_url.cc

+12-15
Original file line numberDiff line numberDiff line change
@@ -229,17 +229,16 @@ void BindingData::Parse(const FunctionCallbackInfo<Value>& args) {
229229
CHECK(args[0]->IsString()); // input
230230
// args[1] // base url
231231

232-
BindingData* binding_data = Realm::GetBindingData<BindingData>(args);
233-
Environment* env = Environment::GetCurrent(args);
234-
HandleScope handle_scope(env->isolate());
235-
Context::Scope context_scope(env->context());
232+
Realm* realm = Realm::GetCurrent(args);
233+
BindingData* binding_data = realm->GetBindingData<BindingData>();
234+
Isolate* isolate = realm->isolate();
236235

237-
Utf8Value input(env->isolate(), args[0]);
236+
Utf8Value input(isolate, args[0]);
238237
ada::result<ada::url_aggregator> base;
239238
ada::url_aggregator* base_pointer = nullptr;
240239
if (args[1]->IsString()) {
241-
base = ada::parse<ada::url_aggregator>(
242-
Utf8Value(env->isolate(), args[1]).ToString());
240+
base =
241+
ada::parse<ada::url_aggregator>(Utf8Value(isolate, args[1]).ToString());
243242
if (!base) {
244243
return args.GetReturnValue().Set(false);
245244
}
@@ -255,21 +254,20 @@ void BindingData::Parse(const FunctionCallbackInfo<Value>& args) {
255254
binding_data->UpdateComponents(out->get_components(), out->type);
256255

257256
args.GetReturnValue().Set(
258-
ToV8Value(env->context(), out->get_href(), env->isolate())
259-
.ToLocalChecked());
257+
ToV8Value(realm->context(), out->get_href(), isolate).ToLocalChecked());
260258
}
261259

262260
void BindingData::Update(const FunctionCallbackInfo<Value>& args) {
263261
CHECK(args[0]->IsString()); // href
264262
CHECK(args[1]->IsNumber()); // action type
265263
CHECK(args[2]->IsString()); // new value
266264

267-
BindingData* binding_data = Realm::GetBindingData<BindingData>(args);
268-
Environment* env = Environment::GetCurrent(args);
269-
Isolate* isolate = env->isolate();
265+
Realm* realm = Realm::GetCurrent(args);
266+
BindingData* binding_data = realm->GetBindingData<BindingData>();
267+
Isolate* isolate = realm->isolate();
270268

271269
enum url_update_action action = static_cast<enum url_update_action>(
272-
args[1]->Uint32Value(env->context()).FromJust());
270+
args[1]->Uint32Value(realm->context()).FromJust());
273271
Utf8Value input(isolate, args[0].As<String>());
274272
Utf8Value new_value(isolate, args[2].As<String>());
275273

@@ -330,8 +328,7 @@ void BindingData::Update(const FunctionCallbackInfo<Value>& args) {
330328

331329
binding_data->UpdateComponents(out->get_components(), out->type);
332330
args.GetReturnValue().Set(
333-
ToV8Value(env->context(), out->get_href(), env->isolate())
334-
.ToLocalChecked());
331+
ToV8Value(realm->context(), out->get_href(), isolate).ToLocalChecked());
335332
}
336333

337334
void BindingData::UpdateComponents(const ada::url_components& components,

src/quic/bindingdata.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ using v8::Value;
2525
namespace quic {
2626

2727
BindingData& BindingData::Get(Environment* env) {
28-
return *Realm::GetBindingData<BindingData>(env->context());
28+
return *(env->principal_realm()->GetBindingData<BindingData>());
2929
}
3030

3131
BindingData::operator ngtcp2_mem() {

0 commit comments

Comments
 (0)