Skip to content

Commit c620a7c

Browse files
committed
src: snapshot node
1 parent 52d8832 commit c620a7c

21 files changed

+322
-15
lines changed

src/async_wrap.cc

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "async_wrap-inl.h"
2424
#include "env-inl.h"
2525
#include "node_errors.h"
26+
#include "node_external_reference.h"
2627
#include "tracing/traced_value.h"
2728
#include "util-inl.h"
2829

@@ -576,6 +577,21 @@ void AsyncWrap::Initialize(Local<Object> target,
576577
}
577578
}
578579

580+
void AsyncWrap::RegisterExternalReferences(
581+
ExternalReferenceRegistry* registry) {
582+
registry->Register(SetupHooks);
583+
registry->Register(PushAsyncContext);
584+
registry->Register(PopAsyncContext);
585+
registry->Register(QueueDestroyAsyncId);
586+
registry->Register(EnablePromiseHook);
587+
registry->Register(DisablePromiseHook);
588+
registry->Register(PromiseWrap::getIsChainedPromise);
589+
registry->Register(RegisterDestroyHook);
590+
registry->Register(AsyncWrapObject::New);
591+
registry->Register(AsyncWrap::GetAsyncId);
592+
registry->Register(AsyncWrap::AsyncReset);
593+
registry->Register(AsyncWrap::GetProviderType);
594+
}
579595

580596
AsyncWrap::AsyncWrap(Environment* env,
581597
Local<Object> object,

src/async_wrap.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ namespace node {
9999

100100
class Environment;
101101
class DestroyParam;
102+
class ExternalReferenceRegistry;
102103

103104
class AsyncWrap : public BaseObject {
104105
public:
@@ -128,6 +129,7 @@ class AsyncWrap : public BaseObject {
128129
static v8::Local<v8::FunctionTemplate> GetConstructorTemplate(
129130
Environment* env);
130131

132+
static void RegisterExternalReferences(ExternalReferenceRegistry* registry);
131133
static void Initialize(v8::Local<v8::Object> target,
132134
v8::Local<v8::Value> unused,
133135
v8::Local<v8::Context> context,

src/inspector_js_api.cc

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22
#include "inspector_agent.h"
33
#include "inspector_io.h"
44
#include "memory_tracker-inl.h"
5+
#include "node_external_reference.h"
56
#include "util-inl.h"
6-
#include "v8.h"
77
#include "v8-inspector.h"
8+
#include "v8.h"
89

910
#include <memory>
1011

@@ -346,6 +347,31 @@ void Initialize(Local<Object> target, Local<Value> unused,
346347
}
347348

348349
} // namespace
350+
351+
void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
352+
registry->Register(InspectorConsoleCall);
353+
registry->Register(SetConsoleExtensionInstaller);
354+
registry->Register(CallAndPauseOnStart);
355+
registry->Register(Open);
356+
registry->Register(Url);
357+
registry->Register(WaitForDebugger);
358+
359+
registry->Register(AsyncTaskScheduledWrapper);
360+
registry->Register(InvokeAsyncTaskFnWithId<&Agent::AsyncTaskCanceled>);
361+
registry->Register(InvokeAsyncTaskFnWithId<&Agent::AsyncTaskStarted>);
362+
registry->Register(InvokeAsyncTaskFnWithId<&Agent::AsyncTaskFinished>);
363+
364+
registry->Register(RegisterAsyncHookWrapper);
365+
registry->Register(IsEnabled);
366+
367+
registry->Register(JSBindingsConnection<LocalConnection>::New);
368+
registry->Register(JSBindingsConnection<LocalConnection>::Dispatch);
369+
registry->Register(JSBindingsConnection<LocalConnection>::Disconnect);
370+
registry->Register(JSBindingsConnection<MainThreadConnection>::New);
371+
registry->Register(JSBindingsConnection<MainThreadConnection>::Dispatch);
372+
registry->Register(JSBindingsConnection<MainThreadConnection>::Disconnect);
373+
}
374+
349375
} // namespace inspector
350376
} // namespace node
351377

src/node_buffer.cc

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "node_buffer.h"
2323
#include "node.h"
2424
#include "node_errors.h"
25+
#include "node_external_reference.h"
2526
#include "node_internals.h"
2627

2728
#include "env-inl.h"
@@ -1197,6 +1198,7 @@ void Initialize(Local<Object> target,
11971198
env->SetMethod(target, "ucs2Write", StringWrite<UCS2>);
11981199
env->SetMethod(target, "utf8Write", StringWrite<UTF8>);
11991200

1201+
// TODO(joyee): re-initialize upon snapshot deserialization
12001202
// It can be a nullptr when running inside an isolate where we
12011203
// do not own the ArrayBuffer allocator.
12021204
if (NodeArrayBufferAllocator* allocator =
@@ -1222,6 +1224,42 @@ void Initialize(Local<Object> target,
12221224
}
12231225

12241226
} // anonymous namespace
1227+
1228+
void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
1229+
registry->Register(SetBufferPrototype);
1230+
registry->Register(CreateFromString);
1231+
1232+
registry->Register(ByteLengthUtf8);
1233+
registry->Register(Copy);
1234+
registry->Register(Compare);
1235+
registry->Register(CompareOffset);
1236+
registry->Register(Fill);
1237+
registry->Register(IndexOfBuffer);
1238+
registry->Register(IndexOfNumber);
1239+
registry->Register(IndexOfString);
1240+
1241+
registry->Register(Swap16);
1242+
registry->Register(Swap32);
1243+
registry->Register(Swap64);
1244+
1245+
registry->Register(EncodeInto);
1246+
registry->Register(EncodeUtf8String);
1247+
1248+
registry->Register(StringSlice<ASCII>);
1249+
registry->Register(StringSlice<BASE64>);
1250+
registry->Register(StringSlice<LATIN1>);
1251+
registry->Register(StringSlice<HEX>);
1252+
registry->Register(StringSlice<UCS2>);
1253+
registry->Register(StringSlice<UTF8>);
1254+
1255+
registry->Register(StringWrite<ASCII>);
1256+
registry->Register(StringWrite<BASE64>);
1257+
registry->Register(StringWrite<LATIN1>);
1258+
registry->Register(StringWrite<HEX>);
1259+
registry->Register(StringWrite<UCS2>);
1260+
registry->Register(StringWrite<UTF8>);
1261+
}
1262+
12251263
} // namespace Buffer
12261264
} // namespace node
12271265

src/node_credentials.cc

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "env-inl.h"
2+
#include "node_external_reference.h"
23
#include "node_internals.h"
34
#include "util-inl.h"
45

@@ -373,6 +374,25 @@ static void InitGroups(const FunctionCallbackInfo<Value>& args) {
373374

374375
#endif // NODE_IMPLEMENTS_POSIX_CREDENTIALS
375376

377+
void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
378+
registry->Register(SafeGetenv);
379+
380+
#ifdef NODE_IMPLEMENTS_POSIX_CREDENTIALS
381+
registry->Register(GetUid);
382+
registry->Register(GetEUid);
383+
registry->Register(GetGid);
384+
registry->Register(GetEGid);
385+
registry->Register(GetGroups);
386+
387+
registry->Register(InitGroups);
388+
registry->Register(SetEGid);
389+
registry->Register(SetEUid);
390+
registry->Register(SetGid);
391+
registry->Register(SetUid);
392+
registry->Register(SetGroups);
393+
#endif // NODE_IMPLEMENTS_POSIX_CREDENTIALS
394+
}
395+
376396
static void Initialize(Local<Object> target,
377397
Local<Value> unused,
378398
Local<Context> context,

src/node_env_var.cc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "debug_utils-inl.h"
22
#include "env-inl.h"
33
#include "node_errors.h"
4+
#include "node_external_reference.h"
45
#include "node_process.h"
56

67
#include <time.h> // tzset(), _tzset()
@@ -387,4 +388,13 @@ MaybeLocal<Object> CreateEnvVarProxy(Local<Context> context,
387388
PropertyHandlerFlags::kHasNoSideEffect));
388389
return scope.EscapeMaybe(env_proxy_template->NewInstance(context));
389390
}
391+
392+
void RegisterEnvVarExternalReferences(ExternalReferenceRegistry* registry) {
393+
registry->Register(EnvGetter);
394+
registry->Register(EnvSetter);
395+
registry->Register(EnvQuery);
396+
registry->Register(EnvDeleter);
397+
registry->Register(EnvEnumerator);
398+
}
399+
390400
} // namespace node

src/node_errors.cc

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33

44
#include "debug_utils-inl.h"
55
#include "node_errors.h"
6+
#include "node_external_reference.h"
67
#include "node_internals.h"
7-
#include "node_report.h"
88
#include "node_process.h"
9+
#include "node_report.h"
910
#include "node_v8_platform-inl.h"
1011
#include "util-inl.h"
1112

@@ -833,6 +834,13 @@ static void TriggerUncaughtException(const FunctionCallbackInfo<Value>& args) {
833834
errors::TriggerUncaughtException(isolate, exception, message, from_promise);
834835
}
835836

837+
void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
838+
registry->Register(SetPrepareStackTraceCallback);
839+
registry->Register(SetEnhanceStackForFatalException);
840+
registry->Register(NoSideEffectsToString);
841+
registry->Register(TriggerUncaughtException);
842+
}
843+
836844
void Initialize(Local<Object> target,
837845
Local<Value> unused,
838846
Local<Context> context,

src/node_errors.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,11 @@ inline v8::Local<v8::Value> ERR_STRING_TOO_LONG(v8::Isolate* isolate) {
161161
prefix " must be a string"); \
162162
} while (0)
163163

164+
class ExternalReferenceRegistry;
164165
namespace errors {
165166

167+
void RegisterExternalReferences(ExternalReferenceRegistry* registry);
168+
166169
class TryCatchScope : public v8::TryCatch {
167170
public:
168171
enum class CatchMode { kNormal, kFatal };

src/node_external_reference.h

Lines changed: 56 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
#include <cinttypes>
77
#include <vector>
8+
#include "v8.h"
89

910
namespace node {
1011

@@ -14,21 +15,71 @@ class ExternalReferenceRegistry {
1415
public:
1516
ExternalReferenceRegistry() {}
1617

17-
template <typename T>
18-
void Register(T* address) {
19-
external_references_.push_back(reinterpret_cast<intptr_t>(address));
20-
}
18+
#define ALLOWED_EXTERNAL_REFERENCE_TYPES(V) \
19+
V(v8::FunctionCallback) \
20+
V(v8::AccessorGetterCallback) \
21+
V(v8::AccessorSetterCallback) \
22+
V(v8::AccessorNameGetterCallback) \
23+
V(v8::AccessorNameSetterCallback) \
24+
V(v8::GenericNamedPropertyDefinerCallback) \
25+
V(v8::GenericNamedPropertyDeleterCallback) \
26+
V(v8::GenericNamedPropertyEnumeratorCallback) \
27+
V(v8::GenericNamedPropertyQueryCallback) \
28+
V(v8::GenericNamedPropertySetterCallback)
29+
30+
#define V(ExternalReferenceType) \
31+
void Register(ExternalReferenceType addr) { RegisterT(addr); }
32+
ALLOWED_EXTERNAL_REFERENCE_TYPES(V)
33+
#undef V
2134

2235
// This can be called only once.
2336
const std::vector<intptr_t>& external_references();
2437

2538
bool is_empty() { return external_references_.empty(); }
2639

2740
private:
41+
template <typename T>
42+
void RegisterT(T* address) {
43+
external_references_.push_back(reinterpret_cast<intptr_t>(address));
44+
}
2845
bool is_finalized_ = false;
2946
std::vector<intptr_t> external_references_;
3047
};
31-
48+
namespace errors {
49+
void RegisterExternalReferences(ExternalReferenceRegistry* registry);
50+
}
51+
#if HAVE_INSPECTOR
52+
namespace inspector {
53+
void RegisterExternalReferences(ExternalReferenceRegistry* registry);
54+
}
55+
#endif // HAVE_INSPECTOR
56+
namespace Buffer {
57+
void RegisterExternalReferences(ExternalReferenceRegistry* registry);
58+
}
59+
namespace credentials {
60+
void RegisterExternalReferences(ExternalReferenceRegistry* registry);
61+
}
62+
namespace i18n {
63+
void RegisterExternalReferences(ExternalReferenceRegistry* registry);
64+
}
65+
namespace task_queue {
66+
void RegisterExternalReferences(ExternalReferenceRegistry* registry);
67+
}
68+
namespace url {
69+
void RegisterExternalReferences(ExternalReferenceRegistry* registry);
70+
}
71+
namespace util {
72+
void RegisterExternalReferences(ExternalReferenceRegistry* registry);
73+
}
74+
void RegisterNodeCategorySetExternalReferences(
75+
ExternalReferenceRegistry* registry);
76+
void RegisterProcessMethodsExternalReferences(
77+
ExternalReferenceRegistry* registry);
78+
void RegisterTypesExternalReferences(ExternalReferenceRegistry* registry);
79+
void RegisterStringDecoderExternalReferences(
80+
ExternalReferenceRegistry* registry);
81+
void RegisterTimerExternalReferences(ExternalReferenceRegistry* registry);
82+
void RegisterEnvVarExternalReferences(ExternalReferenceRegistry* registry);
3283
} // namespace node
3384

3485
#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS

src/node_i18n.cc

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141

4242

4343
#include "node_i18n.h"
44+
#include "node_external_reference.h"
4445

4546
#if defined(NODE_HAVE_I18N_SUPPORT)
4647

@@ -824,6 +825,17 @@ void Initialize(Local<Object> target,
824825
env->SetMethod(target, "hasConverter", ConverterObject::Has);
825826
}
826827

828+
void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
829+
registry->Register(ToUnicode);
830+
registry->Register(ToASCII);
831+
registry->Register(GetStringWidth);
832+
registry->Register(ICUErrorName);
833+
registry->Register(Transcode);
834+
registry->Register(ConverterObject::Create);
835+
registry->Register(ConverterObject::Decode);
836+
registry->Register(ConverterObject::Has);
837+
}
838+
827839
} // namespace i18n
828840
} // namespace node
829841

src/node_i18n.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,9 @@
3636
#include <string>
3737

3838
namespace node {
39-
39+
class ExternalReferenceRegistry;
4040
namespace i18n {
41+
void RegisterExternalReferences(ExternalReferenceRegistry* registry);
4142

4243
bool InitializeICUDirectory(const std::string& path);
4344

0 commit comments

Comments
 (0)