Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

src: use per-realm GetBindingData() wherever applicable #49007

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions src/dataqueue/queue.cc
Original file line number Diff line number Diff line change
Expand Up @@ -876,12 +876,12 @@ class FdEntry final : public EntryImpl {
}
Realm* realm = entry->env()->principal_realm();
return std::make_shared<ReaderImpl>(
BaseObjectPtr<fs::FileHandle>(fs::FileHandle::New(
realm->GetBindingData<fs::BindingData>(realm->context()),
file,
Local<Object>(),
entry->start_,
entry->end_ - entry->start_)),
BaseObjectPtr<fs::FileHandle>(
fs::FileHandle::New(realm->GetBindingData<fs::BindingData>(),
file,
Local<Object>(),
entry->start_,
entry->end_ - entry->start_)),
entry);
}

Expand Down
7 changes: 4 additions & 3 deletions src/encoding_binding.cc
Original file line number Diff line number Diff line change
Expand Up @@ -83,12 +83,13 @@ void BindingData::Deserialize(Local<Context> context,
}

void BindingData::EncodeInto(const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args);
Isolate* isolate = env->isolate();
CHECK_GE(args.Length(), 2);
CHECK(args[0]->IsString());
CHECK(args[1]->IsUint8Array());
BindingData* binding_data = Realm::GetBindingData<BindingData>(args);

Realm* realm = Realm::GetCurrent(args);
Isolate* isolate = realm->isolate();
BindingData* binding_data = realm->GetBindingData<BindingData>();

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

Expand Down
52 changes: 25 additions & 27 deletions src/node_blob.cc
Original file line number Diff line number Diff line change
Expand Up @@ -400,20 +400,22 @@ std::unique_ptr<worker::TransferData> Blob::CloneForMessaging() const {
}

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

CHECK(args[0]->IsString()); // ID key
CHECK(Blob::HasInstance(env, args[1])); // Blob
CHECK(Blob::HasInstance(realm->env(), args[1])); // Blob
CHECK(args[2]->IsUint32()); // Length
CHECK(args[3]->IsString()); // Type

Utf8Value key(env->isolate(), args[0]);
BlobBindingData* binding_data = realm->GetBindingData<BlobBindingData>();
Isolate* isolate = realm->isolate();

Utf8Value key(isolate, args[0]);
Blob* blob;
ASSIGN_OR_RETURN_UNWRAP(&blob, args[1]);

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

binding_data->store_data_object(
std::string(*key, key.length()),
Expand All @@ -427,9 +429,11 @@ void Blob::StoreDataObject(const v8::FunctionCallbackInfo<v8::Value>& args) {
void Blob::RevokeObjectURL(const FunctionCallbackInfo<Value>& args) {
CHECK_GE(args.Length(), 1);
CHECK(args[0]->IsString());
BlobBindingData* binding_data = Realm::GetBindingData<BlobBindingData>(args);
Environment* env = Environment::GetCurrent(args);
Utf8Value input(env->isolate(), args[0].As<String>());
Realm* realm = Realm::GetCurrent(args);
BlobBindingData* binding_data = realm->GetBindingData<BlobBindingData>();
Isolate* isolate = realm->isolate();

Utf8Value input(isolate, args[0].As<String>());
auto out = ada::parse<ada::url_aggregator>(input.ToStringView());

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

void Blob::GetDataObject(const v8::FunctionCallbackInfo<v8::Value>& args) {
BlobBindingData* binding_data = Realm::GetBindingData<BlobBindingData>(args);

Environment* env = Environment::GetCurrent(args);
CHECK(args[0]->IsString());
Realm* realm = Realm::GetCurrent(args);
BlobBindingData* binding_data = realm->GetBindingData<BlobBindingData>();
Isolate* isolate = realm->isolate();

Utf8Value key(env->isolate(), args[0]);
Utf8Value key(isolate, args[0]);

BlobBindingData::StoredDataObject stored =
binding_data->get_data_object(std::string(*key, key.length()));
if (stored.blob) {
Local<Value> type;
if (!String::NewFromUtf8(
env->isolate(),
stored.type.c_str(),
v8::NewStringType::kNormal,
static_cast<int>(stored.type.length())).ToLocal(&type)) {
if (!String::NewFromUtf8(isolate,
stored.type.c_str(),
v8::NewStringType::kNormal,
static_cast<int>(stored.type.length()))
.ToLocal(&type)) {
return;
}

Local<Value> values[] = {
stored.blob->object(),
Uint32::NewFromUnsigned(env->isolate(), stored.length),
type
};
Local<Value> values[] = {stored.blob->object(),
Uint32::NewFromUnsigned(isolate, stored.length),
type};

args.GetReturnValue().Set(
Array::New(
env->isolate(),
values,
arraysize(values)));
args.GetReturnValue().Set(Array::New(isolate, values, arraysize(values)));
}
}

Expand Down
7 changes: 4 additions & 3 deletions src/node_file-inl.h
Original file line number Diff line number Diff line change
Expand Up @@ -277,9 +277,10 @@ FSReqBase* GetReqWrap(const v8::FunctionCallbackInfo<v8::Value>& args,
return Unwrap<FSReqBase>(value.As<v8::Object>());
}

BindingData* binding_data = Realm::GetBindingData<BindingData>(args);
Environment* env = binding_data->env();
if (value->StrictEquals(env->fs_use_promises_symbol())) {
Realm* realm = Realm::GetCurrent(args);
BindingData* binding_data = realm->GetBindingData<BindingData>();

if (value->StrictEquals(realm->isolate_data()->fs_use_promises_symbol())) {
if (use_bigint) {
return FSReqPromise<AliasedBigInt64Array>::New(binding_data, use_bigint);
} else {
Expand Down
42 changes: 23 additions & 19 deletions src/node_file.cc
Original file line number Diff line number Diff line change
Expand Up @@ -264,17 +264,17 @@ FileHandle* FileHandle::New(BindingData* binding_data,
}

void FileHandle::New(const FunctionCallbackInfo<Value>& args) {
BindingData* binding_data = Realm::GetBindingData<BindingData>(args);
Environment* env = binding_data->env();
CHECK(args.IsConstructCall());
CHECK(args[0]->IsInt32());
Realm* realm = Realm::GetCurrent(args);
BindingData* binding_data = realm->GetBindingData<BindingData>();

std::optional<int64_t> maybeOffset = std::nullopt;
std::optional<int64_t> maybeLength = std::nullopt;
if (args[1]->IsNumber())
maybeOffset = args[1]->IntegerValue(env->context()).FromJust();
maybeOffset = args[1]->IntegerValue(realm->context()).FromJust();
if (args[2]->IsNumber())
maybeLength = args[2]->IntegerValue(env->context()).FromJust();
maybeLength = args[2]->IntegerValue(realm->context()).FromJust();

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

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

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

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

static void LStat(const FunctionCallbackInfo<Value>& args) {
BindingData* binding_data = Realm::GetBindingData<BindingData>(args);
Environment* env = binding_data->env();
Realm* realm = Realm::GetCurrent(args);
BindingData* binding_data = realm->GetBindingData<BindingData>();
Environment* env = realm->env();

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

BufferValue path(env->isolate(), args[0]);
BufferValue path(realm->isolate(), args[0]);
CHECK_NOT_NULL(*path);

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

static void FStat(const FunctionCallbackInfo<Value>& args) {
BindingData* binding_data = Realm::GetBindingData<BindingData>(args);
Environment* env = binding_data->env();
Realm* realm = Realm::GetCurrent(args);
BindingData* binding_data = realm->GetBindingData<BindingData>();
Environment* env = realm->env();

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

static void StatFs(const FunctionCallbackInfo<Value>& args) {
BindingData* binding_data = Realm::GetBindingData<BindingData>(args);
Environment* env = binding_data->env();
Realm* realm = Realm::GetCurrent(args);
BindingData* binding_data = realm->GetBindingData<BindingData>();
Environment* env = realm->env();

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

BufferValue path(env->isolate(), args[0]);
BufferValue path(realm->isolate(), args[0]);
CHECK_NOT_NULL(*path);

bool use_bigint = args[1]->IsTrue();
Expand Down Expand Up @@ -2064,14 +2068,14 @@ static void Open(const FunctionCallbackInfo<Value>& args) {
}

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

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

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

CHECK(args[1]->IsInt32());
Expand Down
10 changes: 5 additions & 5 deletions src/node_http2.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2650,12 +2650,12 @@ void Http2Session::RefreshState(const FunctionCallbackInfo<Value>& args) {

// Constructor for new Http2Session instances.
void Http2Session::New(const FunctionCallbackInfo<Value>& args) {
Http2State* state = Realm::GetBindingData<Http2State>(args);
Environment* env = state->env();
Realm* realm = Realm::GetCurrent(args);
Http2State* state = realm->GetBindingData<Http2State>();

CHECK(args.IsConstructCall());
SessionType type =
static_cast<SessionType>(
args[0]->Int32Value(env->context()).ToChecked());
SessionType type = static_cast<SessionType>(
args[0]->Int32Value(realm->context()).ToChecked());
Http2Session* session = new Http2Session(state, args.This(), type);
Debug(session, "session created");
}
Expand Down
11 changes: 6 additions & 5 deletions src/node_realm-inl.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,16 +67,17 @@ inline T* Realm::GetBindingData(
template <typename T>
inline T* Realm::GetBindingData(v8::Local<v8::Context> context) {
Realm* realm = GetCurrent(context);
DCHECK_NOT_NULL(realm);
BindingDataStore* map = realm->binding_data_store();
DCHECK_NOT_NULL(map);
return realm->GetBindingData<T>();
}

template <typename T>
inline T* Realm::GetBindingData() {
constexpr size_t binding_index = static_cast<size_t>(T::binding_type_int);
static_assert(binding_index < std::tuple_size_v<BindingDataStore>);
auto ptr = (*map)[binding_index];
auto ptr = binding_data_store_[binding_index];
if (UNLIKELY(!ptr)) return nullptr;
T* result = static_cast<T*>(ptr.get());
DCHECK_NOT_NULL(result);
DCHECK_EQ(result->realm(), GetCurrent(context));
return result;
}

Expand Down
2 changes: 2 additions & 0 deletions src/node_realm.h
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,8 @@ class Realm : public MemoryRetainer {
const v8::FunctionCallbackInfo<v8::Value>& info);
template <typename T>
static inline T* GetBindingData(v8::Local<v8::Context> context);
template <typename T>
inline T* GetBindingData();
inline BindingDataStore* binding_data_store();

// The BaseObject count is a debugging helper that makes sure that there are
Expand Down
27 changes: 12 additions & 15 deletions src/node_url.cc
Original file line number Diff line number Diff line change
Expand Up @@ -231,17 +231,16 @@ void BindingData::Parse(const FunctionCallbackInfo<Value>& args) {
CHECK(args[0]->IsString()); // input
// args[1] // base url

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

Utf8Value input(env->isolate(), args[0]);
Utf8Value input(isolate, args[0]);
ada::result<ada::url_aggregator> base;
ada::url_aggregator* base_pointer = nullptr;
if (args[1]->IsString()) {
base = ada::parse<ada::url_aggregator>(
Utf8Value(env->isolate(), args[1]).ToString());
base =
ada::parse<ada::url_aggregator>(Utf8Value(isolate, args[1]).ToString());
if (!base) {
return args.GetReturnValue().Set(false);
}
Expand All @@ -257,21 +256,20 @@ void BindingData::Parse(const FunctionCallbackInfo<Value>& args) {
binding_data->UpdateComponents(out->get_components(), out->type);

args.GetReturnValue().Set(
ToV8Value(env->context(), out->get_href(), env->isolate())
.ToLocalChecked());
ToV8Value(realm->context(), out->get_href(), isolate).ToLocalChecked());
}

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

BindingData* binding_data = Realm::GetBindingData<BindingData>(args);
Environment* env = Environment::GetCurrent(args);
Isolate* isolate = env->isolate();
Realm* realm = Realm::GetCurrent(args);
BindingData* binding_data = realm->GetBindingData<BindingData>();
Isolate* isolate = realm->isolate();

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

Expand Down Expand Up @@ -332,8 +330,7 @@ void BindingData::Update(const FunctionCallbackInfo<Value>& args) {

binding_data->UpdateComponents(out->get_components(), out->type);
args.GetReturnValue().Set(
ToV8Value(env->context(), out->get_href(), env->isolate())
.ToLocalChecked());
ToV8Value(realm->context(), out->get_href(), isolate).ToLocalChecked());
}

void BindingData::UpdateComponents(const ada::url_components& components,
Expand Down
2 changes: 1 addition & 1 deletion src/quic/bindingdata.cc
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ using v8::Value;
namespace quic {

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

BindingData::operator ngtcp2_mem() {
Expand Down