Skip to content

Commit a7f3bc0

Browse files
legendecasdanielleadams
authored andcommitted
src: introduce node::Realm
To distinguish per-context values from the node::Environment, split those values to a new node::Realm structure and consolidate bootstrapping methods with it. PR-URL: #44179 Refs: #42528 Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
1 parent b11616b commit a7f3bc0

21 files changed

+1142
-830
lines changed

node.gyp

+4
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,7 @@
525525
'src/node_process_events.cc',
526526
'src/node_process_methods.cc',
527527
'src/node_process_object.cc',
528+
'src/node_realm.cc',
528529
'src/node_report.cc',
529530
'src/node_report_module.cc',
530531
'src/node_report_utils.cc',
@@ -585,6 +586,7 @@
585586
'src/connection_wrap.h',
586587
'src/debug_utils.h',
587588
'src/debug_utils-inl.h',
589+
'src/env_properties.h',
588590
'src/env.h',
589591
'src/env-inl.h',
590592
'src/handle_wrap.h',
@@ -632,6 +634,8 @@
632634
'src/node_platform.h',
633635
'src/node_process.h',
634636
'src/node_process-inl.h',
637+
'src/node_realm.h',
638+
'src/node_realm-inl.h',
635639
'src/node_report.h',
636640
'src/node_revert.h',
637641
'src/node_root_certs.h',

src/api/environment.cc

+7-4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "node_internals.h"
66
#include "node_options-inl.h"
77
#include "node_platform.h"
8+
#include "node_realm-inl.h"
89
#include "node_shadow_realm.h"
910
#include "node_v8_platform-inl.h"
1011
#include "node_wasm_web_api.h"
@@ -378,7 +379,7 @@ Environment* CreateEnvironment(
378379
}
379380
#endif
380381

381-
if (env->RunBootstrapping().IsEmpty()) {
382+
if (env->principal_realm()->RunBootstrapping().IsEmpty()) {
382383
FreeEnvironment(env);
383384
return nullptr;
384385
}
@@ -453,11 +454,13 @@ MaybeLocal<Value> LoadEnvironment(
453454
builtins::BuiltinLoader::Add(
454455
name.c_str(), UnionBytes(**main_utf16, main_utf16->length()));
455456
env->set_main_utf16(std::move(main_utf16));
457+
Realm* realm = env->principal_realm();
458+
456459
// Arguments must match the parameters specified in
457460
// BuiltinLoader::LookupAndCompile().
458-
std::vector<Local<Value>> args = {env->process_object(),
459-
env->builtin_module_require()};
460-
return ExecuteBootstrapper(env, name.c_str(), &args);
461+
std::vector<Local<Value>> args = {realm->process_object(),
462+
realm->builtin_module_require()};
463+
return realm->ExecuteBootstrapper(name.c_str(), &args);
461464
});
462465
}
463466

src/base_object-inl.h

+6
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@
3232

3333
namespace node {
3434

35+
// static
36+
v8::Local<v8::FunctionTemplate> BaseObject::GetConstructorTemplate(
37+
Environment* env) {
38+
return BaseObject::GetConstructorTemplate(env->isolate_data());
39+
}
40+
3541
void BaseObject::Detach() {
3642
CHECK_GT(pointer_data()->strong_ptr_count, 0);
3743
pointer_data()->is_detached = true;

src/base_object.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
namespace node {
3232

3333
class Environment;
34+
class IsolateData;
3435
template <typename T, bool kIsWeak>
3536
class BaseObjectPtrImpl;
3637

@@ -113,8 +114,10 @@ class BaseObject : public MemoryRetainer {
113114
// a BaseObjectPtr to this object.
114115
inline void Detach();
115116

116-
static v8::Local<v8::FunctionTemplate> GetConstructorTemplate(
117+
static inline v8::Local<v8::FunctionTemplate> GetConstructorTemplate(
117118
Environment* env);
119+
static v8::Local<v8::FunctionTemplate> GetConstructorTemplate(
120+
IsolateData* isolate_data);
118121

119122
// Interface for transferring BaseObject instances using the .postMessage()
120123
// method of MessagePorts (and, by extension, Workers).

src/env-inl.h

+20-17
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include "node_context_data.h"
3232
#include "node_internals.h"
3333
#include "node_perf_common.h"
34+
#include "node_realm-inl.h"
3435
#include "util-inl.h"
3536
#include "uv.h"
3637
#include "v8.h"
@@ -614,15 +615,7 @@ inline void Environment::set_can_call_into_js(bool can_call_into_js) {
614615
}
615616

616617
inline bool Environment::has_run_bootstrapping_code() const {
617-
return has_run_bootstrapping_code_;
618-
}
619-
620-
inline void Environment::DoneBootstrapping() {
621-
has_run_bootstrapping_code_ = true;
622-
// This adjusts the return value of base_object_created_after_bootstrap() so
623-
// that tests that check the count do not have to account for internally
624-
// created BaseObjects.
625-
base_object_created_by_bootstrap_ = base_object_count_;
618+
return principal_realm_->has_run_bootstrapping_code();
626619
}
627620

628621
inline bool Environment::has_serialized_options() const {
@@ -805,14 +798,18 @@ void Environment::modify_base_object_count(int64_t delta) {
805798
base_object_count_ += delta;
806799
}
807800

808-
int64_t Environment::base_object_created_after_bootstrap() const {
809-
return base_object_count_ - base_object_created_by_bootstrap_;
810-
}
811-
812801
int64_t Environment::base_object_count() const {
813802
return base_object_count_;
814803
}
815804

805+
inline void Environment::set_base_object_created_by_bootstrap(int64_t count) {
806+
base_object_created_by_bootstrap_ = base_object_count_;
807+
}
808+
809+
int64_t Environment::base_object_created_after_bootstrap() const {
810+
return base_object_count_ - base_object_created_by_bootstrap_;
811+
}
812+
816813
void Environment::set_main_utf16(std::unique_ptr<v8::String::Value> str) {
817814
CHECK(!main_utf16_);
818815
main_utf16_ = std::move(str);
@@ -877,16 +874,22 @@ void Environment::set_process_exit_handler(
877874

878875
#define V(PropertyName, TypeName) \
879876
inline v8::Local<TypeName> Environment::PropertyName() const { \
880-
return PersistentToLocal::Strong(PropertyName##_); \
877+
DCHECK_NOT_NULL(principal_realm_); \
878+
return principal_realm_->PropertyName(); \
881879
} \
882880
inline void Environment::set_##PropertyName(v8::Local<TypeName> value) { \
883-
PropertyName##_.Reset(isolate(), value); \
881+
DCHECK_NOT_NULL(principal_realm_); \
882+
principal_realm_->set_##PropertyName(value); \
884883
}
885-
ENVIRONMENT_STRONG_PERSISTENT_VALUES(V)
884+
PER_REALM_STRONG_PERSISTENT_VALUES(V)
886885
#undef V
887886

888887
v8::Local<v8::Context> Environment::context() const {
889-
return PersistentToLocal::Strong(context_);
888+
return principal_realm()->context();
889+
}
890+
891+
Realm* Environment::principal_realm() const {
892+
return principal_realm_.get();
890893
}
891894

892895
inline void Environment::set_heap_snapshot_near_heap_limit(uint32_t limit) {

0 commit comments

Comments
 (0)