Skip to content

Commit 0b6c017

Browse files
committed
src: initialize privateSymbols for per_context
1 parent c3b6f94 commit 0b6c017

File tree

5 files changed

+57
-11
lines changed

5 files changed

+57
-11
lines changed

src/api/environment.cc

Lines changed: 47 additions & 7 deletions
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"
@@ -599,7 +600,8 @@ std::unique_ptr<MultiIsolatePlatform> MultiIsolatePlatform::Create(
599600
page_allocator);
600601
}
601602

602-
MaybeLocal<Object> GetPerContextExports(Local<Context> context) {
603+
MaybeLocal<Object> GetPerContextExports(Local<Context> context,
604+
IsolateData* isolate_data) {
603605
Isolate* isolate = context->GetIsolate();
604606
EscapableHandleScope handle_scope(isolate);
605607

@@ -615,8 +617,9 @@ MaybeLocal<Object> GetPerContextExports(Local<Context> context) {
615617

616618
Local<Object> exports = Object::New(isolate);
617619
if (context->Global()->SetPrivate(context, key, exports).IsNothing() ||
618-
InitializePrimordials(context).IsNothing())
620+
InitializePrimordials(context, isolate_data).IsNothing()) {
619621
return MaybeLocal<Object>();
622+
}
620623
return handle_scope.Escape(exports);
621624
}
622625

@@ -745,7 +748,8 @@ Maybe<void> InitializeBaseContextForSnapshot(Local<Context> context) {
745748
return JustVoid();
746749
}
747750

748-
Maybe<void> InitializeMainContextForSnapshot(Local<Context> context) {
751+
Maybe<void> InitializeMainContextForSnapshot(Local<Context> context,
752+
IsolateData* isolate_data) {
749753
Isolate* isolate = context->GetIsolate();
750754
HandleScope handle_scope(isolate);
751755

@@ -761,7 +765,34 @@ Maybe<void> InitializeMainContextForSnapshot(Local<Context> context) {
761765
return JustVoid();
762766
}
763767

764-
Maybe<void> InitializePrimordials(Local<Context> context) {
768+
Local<Object> InitializePrivateSymbols(Local<Context> context,
769+
IsolateData* isolate_data) {
770+
if (isolate_data == nullptr) {
771+
return Local<Object>();
772+
}
773+
Isolate* isolate = context->GetIsolate();
774+
EscapableHandleScope scope(isolate);
775+
Context::Scope context_scope(context);
776+
777+
Local<ObjectTemplate> private_symbols = ObjectTemplate::New(isolate);
778+
Local<Object> private_symbols_object;
779+
#define V(PropertyName, _) \
780+
private_symbols->Set(isolate, #PropertyName, isolate_data->PropertyName());
781+
782+
PER_ISOLATE_PRIVATE_SYMBOL_PROPERTIES(V)
783+
#undef V
784+
785+
if (!private_symbols->NewInstance(context).ToLocal(&private_symbols_object) ||
786+
private_symbols_object->SetPrototypeV2(context, Null(isolate))
787+
.IsNothing()) {
788+
return Local<Object>();
789+
}
790+
791+
return scope.Escape(private_symbols_object);
792+
}
793+
794+
Maybe<void> InitializePrimordials(Local<Context> context,
795+
IsolateData* isolate_data) {
765796
// Run per-context JS files.
766797
Isolate* isolate = context->GetIsolate();
767798
Context::Scope context_scope(context);
@@ -783,6 +814,9 @@ Maybe<void> InitializePrimordials(Local<Context> context) {
783814
return Nothing<void>();
784815
}
785816

817+
Local<Object> private_symbols =
818+
InitializePrivateSymbols(context, isolate_data);
819+
786820
static const char* context_files[] = {"internal/per_context/primordials",
787821
"internal/per_context/domexception",
788822
"internal/per_context/messageport",
@@ -798,7 +832,12 @@ Maybe<void> InitializePrimordials(Local<Context> context) {
798832
builtin_loader.SetEagerCompile();
799833

800834
for (const char** module = context_files; *module != nullptr; module++) {
801-
Local<Value> arguments[] = {exports, primordials};
835+
Local<Value> arguments[3];
836+
arguments[0] = exports;
837+
arguments[1] = primordials;
838+
arguments[2] = private_symbols.IsEmpty() ? Local<Value>(Undefined(isolate))
839+
: Local<Value>(private_symbols);
840+
802841
if (builtin_loader
803842
.CompileAndCall(
804843
context, *module, arraysize(arguments), arguments, nullptr)
@@ -812,8 +851,9 @@ Maybe<void> InitializePrimordials(Local<Context> context) {
812851
}
813852

814853
// This initializes the main context (i.e. vm contexts are not included).
815-
Maybe<bool> InitializeContext(Local<Context> context) {
816-
if (InitializeMainContextForSnapshot(context).IsNothing()) {
854+
Maybe<bool> InitializeContext(Local<Context> context,
855+
IsolateData* isolate_data) {
856+
if (InitializeMainContextForSnapshot(context, isolate_data).IsNothing()) {
817857
return Nothing<bool>();
818858
}
819859

src/node.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -595,7 +595,8 @@ NODE_EXTERN v8::Local<v8::Context> NewContext(
595595

596596
// Runs Node.js-specific tweaks on an already constructed context
597597
// Return value indicates success of operation
598-
NODE_EXTERN v8::Maybe<bool> InitializeContext(v8::Local<v8::Context> context);
598+
NODE_EXTERN v8::Maybe<bool> InitializeContext(
599+
v8::Local<v8::Context> context, IsolateData* isolate_data = nullptr);
599600

600601
// If `platform` is passed, it will be used to register new Worker instances.
601602
// It can be `nullptr`, in which case creating new Workers inside of

src/node_builtins.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,7 @@ MaybeLocal<Function> BuiltinLoader::LookupAndCompile(Local<Context> context,
405405
parameters = {
406406
FIXED_ONE_BYTE_STRING(isolate, "exports"),
407407
FIXED_ONE_BYTE_STRING(isolate, "primordials"),
408+
FIXED_ONE_BYTE_STRING(isolate, "privateSymbols"),
408409
};
409410
} else if (strncmp(id, "internal/main/", strlen("internal/main/")) == 0 ||
410411
strncmp(id,

src/node_internals.h

Lines changed: 6 additions & 2 deletions
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::Local<v8::Object> InitializePrivateSymbols(v8::Local<v8::Context> context,
119+
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_realm.cc

Lines changed: 1 addition & 1 deletion
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)