Skip to content

Commit 3578bee

Browse files
joyeecheungnodejs-github-bot
authored andcommitted
src: add per-realm GetBindingData() method
This version avoids the additional access to the embedder slot when we already have a reference to the realm. 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 6f9d6f2 commit 3578bee

File tree

2 files changed

+25
-20
lines changed

2 files changed

+25
-20
lines changed

src/node_file.cc

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -264,17 +264,17 @@ FileHandle* FileHandle::New(BindingData* binding_data,
264264
}
265265

266266
void FileHandle::New(const FunctionCallbackInfo<Value>& args) {
267-
BindingData* binding_data = Realm::GetBindingData<BindingData>(args);
268-
Environment* env = binding_data->env();
269267
CHECK(args.IsConstructCall());
270268
CHECK(args[0]->IsInt32());
269+
Realm* realm = Realm::GetCurrent(args);
270+
BindingData* binding_data = realm->GetBindingData<BindingData>();
271271

272272
std::optional<int64_t> maybeOffset = std::nullopt;
273273
std::optional<int64_t> maybeLength = std::nullopt;
274274
if (args[1]->IsNumber())
275-
maybeOffset = args[1]->IntegerValue(env->context()).FromJust();
275+
maybeOffset = args[1]->IntegerValue(realm->context()).FromJust();
276276
if (args[2]->IsNumber())
277-
maybeLength = args[2]->IntegerValue(env->context()).FromJust();
277+
maybeLength = args[2]->IntegerValue(realm->context()).FromJust();
278278

279279
FileHandle::New(binding_data,
280280
args[0].As<Int32>()->Value(),
@@ -1108,13 +1108,14 @@ static void InternalModuleStat(const FunctionCallbackInfo<Value>& args) {
11081108
}
11091109

11101110
static void Stat(const FunctionCallbackInfo<Value>& args) {
1111-
BindingData* binding_data = Realm::GetBindingData<BindingData>(args);
1112-
Environment* env = binding_data->env();
1111+
Realm* realm = Realm::GetCurrent(args);
1112+
BindingData* binding_data = realm->GetBindingData<BindingData>();
1113+
Environment* env = realm->env();
11131114

11141115
const int argc = args.Length();
11151116
CHECK_GE(argc, 2);
11161117

1117-
BufferValue path(env->isolate(), args[0]);
1118+
BufferValue path(realm->isolate(), args[0]);
11181119
CHECK_NOT_NULL(*path);
11191120
THROW_IF_INSUFFICIENT_PERMISSIONS(
11201121
env, permission::PermissionScope::kFileSystemRead, path.ToStringView());
@@ -1143,13 +1144,14 @@ static void Stat(const FunctionCallbackInfo<Value>& args) {
11431144
}
11441145

11451146
static void LStat(const FunctionCallbackInfo<Value>& args) {
1146-
BindingData* binding_data = Realm::GetBindingData<BindingData>(args);
1147-
Environment* env = binding_data->env();
1147+
Realm* realm = Realm::GetCurrent(args);
1148+
BindingData* binding_data = realm->GetBindingData<BindingData>();
1149+
Environment* env = realm->env();
11481150

11491151
const int argc = args.Length();
11501152
CHECK_GE(argc, 3);
11511153

1152-
BufferValue path(env->isolate(), args[0]);
1154+
BufferValue path(realm->isolate(), args[0]);
11531155
CHECK_NOT_NULL(*path);
11541156

11551157
bool use_bigint = args[1]->IsTrue();
@@ -1177,8 +1179,9 @@ static void LStat(const FunctionCallbackInfo<Value>& args) {
11771179
}
11781180

11791181
static void FStat(const FunctionCallbackInfo<Value>& args) {
1180-
BindingData* binding_data = Realm::GetBindingData<BindingData>(args);
1181-
Environment* env = binding_data->env();
1182+
Realm* realm = Realm::GetCurrent(args);
1183+
BindingData* binding_data = realm->GetBindingData<BindingData>();
1184+
Environment* env = realm->env();
11821185

11831186
const int argc = args.Length();
11841187
CHECK_GE(argc, 2);
@@ -1209,13 +1212,14 @@ static void FStat(const FunctionCallbackInfo<Value>& args) {
12091212
}
12101213

12111214
static void StatFs(const FunctionCallbackInfo<Value>& args) {
1212-
BindingData* binding_data = Realm::GetBindingData<BindingData>(args);
1213-
Environment* env = binding_data->env();
1215+
Realm* realm = Realm::GetCurrent(args);
1216+
BindingData* binding_data = realm->GetBindingData<BindingData>();
1217+
Environment* env = realm->env();
12141218

12151219
const int argc = args.Length();
12161220
CHECK_GE(argc, 2);
12171221

1218-
BufferValue path(env->isolate(), args[0]);
1222+
BufferValue path(realm->isolate(), args[0]);
12191223
CHECK_NOT_NULL(*path);
12201224
THROW_IF_INSUFFICIENT_PERMISSIONS(
12211225
env, permission::PermissionScope::kFileSystemRead, path.ToStringView());

src/node_realm-inl.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,16 +67,17 @@ inline T* Realm::GetBindingData(
6767
template <typename T>
6868
inline T* Realm::GetBindingData(v8::Local<v8::Context> context) {
6969
Realm* realm = GetCurrent(context);
70-
DCHECK_NOT_NULL(realm);
71-
BindingDataStore* map = realm->binding_data_store();
72-
DCHECK_NOT_NULL(map);
70+
return realm->GetBindingData<T>();
71+
}
72+
73+
template <typename T>
74+
inline T* Realm::GetBindingData() {
7375
constexpr size_t binding_index = static_cast<size_t>(T::binding_type_int);
7476
static_assert(binding_index < std::tuple_size_v<BindingDataStore>);
75-
auto ptr = (*map)[binding_index];
77+
auto ptr = binding_data_store_[binding_index];
7678
if (UNLIKELY(!ptr)) return nullptr;
7779
T* result = static_cast<T*>(ptr.get());
7880
DCHECK_NOT_NULL(result);
79-
DCHECK_EQ(result->realm(), GetCurrent(context));
8081
return result;
8182
}
8283

0 commit comments

Comments
 (0)