Skip to content

Commit cdf85d6

Browse files
committed
src: initialize privateSymbols for per_context
PR-URL: #57479 Reviewed-By: Chengzhong Wu <[email protected]>
1 parent 5ea3b08 commit cdf85d6

File tree

5 files changed

+59
-13
lines changed

5 files changed

+59
-13
lines changed

src/api/environment.cc

+42-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include <cstdlib>
2+
#include "env_properties.h"
23
#include "node.h"
34
#include "node_builtins.h"
45
#include "node_context_data.h"
@@ -602,7 +603,8 @@ std::unique_ptr<MultiIsolatePlatform> MultiIsolatePlatform::Create(
602603
page_allocator);
603604
}
604605

605-
MaybeLocal<Object> GetPerContextExports(Local<Context> context) {
606+
MaybeLocal<Object> GetPerContextExports(Local<Context> context,
607+
IsolateData* isolate_data) {
606608
Isolate* isolate = context->GetIsolate();
607609
EscapableHandleScope handle_scope(isolate);
608610

@@ -616,10 +618,14 @@ MaybeLocal<Object> GetPerContextExports(Local<Context> context) {
616618
if (existing_value->IsObject())
617619
return handle_scope.Escape(existing_value.As<Object>());
618620

621+
// To initialize the per-context binding exports, a non-nullptr isolate_data
622+
// is needed
623+
CHECK(isolate_data);
619624
Local<Object> exports = Object::New(isolate);
620625
if (context->Global()->SetPrivate(context, key, exports).IsNothing() ||
621-
InitializePrimordials(context).IsNothing())
626+
InitializePrimordials(context, isolate_data).IsNothing()) {
622627
return MaybeLocal<Object>();
628+
}
623629
return handle_scope.Escape(exports);
624630
}
625631

@@ -764,7 +770,32 @@ Maybe<void> InitializeMainContextForSnapshot(Local<Context> context) {
764770
return JustVoid();
765771
}
766772

767-
Maybe<void> InitializePrimordials(Local<Context> context) {
773+
MaybeLocal<Object> InitializePrivateSymbols(Local<Context> context,
774+
IsolateData* isolate_data) {
775+
CHECK(isolate_data);
776+
Isolate* isolate = context->GetIsolate();
777+
EscapableHandleScope scope(isolate);
778+
Context::Scope context_scope(context);
779+
780+
Local<ObjectTemplate> private_symbols = ObjectTemplate::New(isolate);
781+
Local<Object> private_symbols_object;
782+
#define V(PropertyName, _) \
783+
private_symbols->Set(isolate, #PropertyName, isolate_data->PropertyName());
784+
785+
PER_ISOLATE_PRIVATE_SYMBOL_PROPERTIES(V)
786+
#undef V
787+
788+
if (!private_symbols->NewInstance(context).ToLocal(&private_symbols_object) ||
789+
private_symbols_object->SetPrototype(context, Null(isolate))
790+
.IsNothing()) {
791+
return MaybeLocal<Object>();
792+
}
793+
794+
return scope.Escape(private_symbols_object);
795+
}
796+
797+
Maybe<void> InitializePrimordials(Local<Context> context,
798+
IsolateData* isolate_data) {
768799
// Run per-context JS files.
769800
Isolate* isolate = context->GetIsolate();
770801
Context::Scope context_scope(context);
@@ -785,6 +816,12 @@ Maybe<void> InitializePrimordials(Local<Context> context) {
785816
return Nothing<void>();
786817
}
787818

819+
Local<Object> private_symbols;
820+
if (!InitializePrivateSymbols(context, isolate_data)
821+
.ToLocal(&private_symbols)) {
822+
return Nothing<void>();
823+
}
824+
788825
static const char* context_files[] = {"internal/per_context/primordials",
789826
"internal/per_context/domexception",
790827
"internal/per_context/messageport",
@@ -800,7 +837,8 @@ Maybe<void> InitializePrimordials(Local<Context> context) {
800837
builtin_loader.SetEagerCompile();
801838

802839
for (const char** module = context_files; *module != nullptr; module++) {
803-
Local<Value> arguments[] = {exports, primordials};
840+
Local<Value> arguments[] = {exports, primordials, private_symbols};
841+
804842
if (builtin_loader
805843
.CompileAndCall(
806844
context, *module, arraysize(arguments), arguments, nullptr)

src/node_builtins.cc

+1
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,7 @@ MaybeLocal<Function> BuiltinLoader::LookupAndCompile(Local<Context> context,
412412
parameters = {
413413
FIXED_ONE_BYTE_STRING(isolate, "exports"),
414414
FIXED_ONE_BYTE_STRING(isolate, "primordials"),
415+
FIXED_ONE_BYTE_STRING(isolate, "privateSymbols"),
415416
};
416417
} else if (strncmp(id, "internal/main/", strlen("internal/main/")) == 0 ||
417418
strncmp(id,

src/node_internals.h

+6-2
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,10 @@ std::string GetHumanReadableProcessName();
113113
v8::Maybe<void> InitializeBaseContextForSnapshot(
114114
v8::Local<v8::Context> context);
115115
v8::Maybe<void> InitializeContextRuntime(v8::Local<v8::Context> context);
116-
v8::Maybe<void> InitializePrimordials(v8::Local<v8::Context> context);
116+
v8::Maybe<void> InitializePrimordials(v8::Local<v8::Context> context,
117+
IsolateData* isolate_data);
118+
v8::MaybeLocal<v8::Object> InitializePrivateSymbols(
119+
v8::Local<v8::Context> context, IsolateData* isolate_data);
117120

118121
class NodeArrayBufferAllocator : public ArrayBufferAllocator {
119122
public:
@@ -340,7 +343,8 @@ v8::Isolate* NewIsolate(v8::Isolate::CreateParams* params,
340343
// was provided by the embedder.
341344
v8::MaybeLocal<v8::Value> StartExecution(Environment* env,
342345
StartExecutionCallback cb = nullptr);
343-
v8::MaybeLocal<v8::Object> GetPerContextExports(v8::Local<v8::Context> context);
346+
v8::MaybeLocal<v8::Object> GetPerContextExports(
347+
v8::Local<v8::Context> context, IsolateData* isolate_data = nullptr);
344348
void MarkBootstrapComplete(const v8::FunctionCallbackInfo<v8::Value>& args);
345349

346350
class InitializationResultImpl final : public InitializationResult {

src/node_messaging.cc

+9-6
Original file line numberDiff line numberDiff line change
@@ -252,14 +252,16 @@ void Message::AdoptSharedValueConveyor(SharedValueConveyor&& conveyor) {
252252

253253
namespace {
254254

255-
MaybeLocal<Function> GetEmitMessageFunction(Local<Context> context) {
255+
MaybeLocal<Function> GetEmitMessageFunction(Local<Context> context,
256+
IsolateData* isolate_data) {
256257
Isolate* isolate = context->GetIsolate();
257258
Local<Object> per_context_bindings;
258259
Local<Value> emit_message_val;
259-
if (!GetPerContextExports(context).ToLocal(&per_context_bindings) ||
260-
!per_context_bindings->Get(context,
261-
FIXED_ONE_BYTE_STRING(isolate, "emitMessage"))
262-
.ToLocal(&emit_message_val)) {
260+
if (!GetPerContextExports(context, isolate_data)
261+
.ToLocal(&per_context_bindings) ||
262+
!per_context_bindings
263+
->Get(context, FIXED_ONE_BYTE_STRING(isolate, "emitMessage"))
264+
.ToLocal(&emit_message_val)) {
263265
return MaybeLocal<Function>();
264266
}
265267
CHECK(emit_message_val->IsFunction());
@@ -688,7 +690,8 @@ MessagePort::MessagePort(Environment* env,
688690
}
689691

690692
Local<Function> emit_message_fn;
691-
if (!GetEmitMessageFunction(context).ToLocal(&emit_message_fn))
693+
if (!GetEmitMessageFunction(context, env->isolate_data())
694+
.ToLocal(&emit_message_fn))
692695
return;
693696
emit_message_fn_.Reset(env->isolate(), emit_message_fn);
694697

src/node_realm.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ void Realm::CreateProperties() {
4545

4646
// Store primordials setup by the per-context script in the environment.
4747
Local<Object> per_context_bindings =
48-
GetPerContextExports(ctx).ToLocalChecked();
48+
GetPerContextExports(ctx, env_->isolate_data()).ToLocalChecked();
4949
Local<Value> primordials =
5050
per_context_bindings->Get(ctx, env_->primordials_string())
5151
.ToLocalChecked();

0 commit comments

Comments
 (0)