src: create per-isolate strings after platform setup
Allocation of strings may cause a garbage collection that uses the platform to post tasks. PR-URL: https://github.com/nodejs/node/pull/20175 Fixes: https://github.com/nodejs/node/issues/20171 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Tiancheng "Timothy" Gu <timothygu99@gmail.com> Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Yang Guo <yangguo@chromium.org> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Daniel Bevenius <daniel.bevenius@gmail.com>
This commit is contained in:
parent
78d95b4032
commit
8c12e01bf8
66
src/env.cc
66
src/env.cc
@ -28,44 +28,46 @@ IsolateData::IsolateData(Isolate* isolate,
|
|||||||
uv_loop_t* event_loop,
|
uv_loop_t* event_loop,
|
||||||
MultiIsolatePlatform* platform,
|
MultiIsolatePlatform* platform,
|
||||||
uint32_t* zero_fill_field) :
|
uint32_t* zero_fill_field) :
|
||||||
|
|
||||||
// Create string and private symbol properties as internalized one byte strings.
|
|
||||||
//
|
|
||||||
// Internalized because it makes property lookups a little faster and because
|
|
||||||
// the string is created in the old space straight away. It's going to end up
|
|
||||||
// in the old space sooner or later anyway but now it doesn't go through
|
|
||||||
// v8::Eternal's new space handling first.
|
|
||||||
//
|
|
||||||
// One byte because our strings are ASCII and we can safely skip V8's UTF-8
|
|
||||||
// decoding step. It's a one-time cost, but why pay it when you don't have to?
|
|
||||||
#define V(PropertyName, StringValue) \
|
|
||||||
PropertyName ## _( \
|
|
||||||
isolate, \
|
|
||||||
Private::New( \
|
|
||||||
isolate, \
|
|
||||||
String::NewFromOneByte( \
|
|
||||||
isolate, \
|
|
||||||
reinterpret_cast<const uint8_t*>(StringValue), \
|
|
||||||
v8::NewStringType::kInternalized, \
|
|
||||||
sizeof(StringValue) - 1).ToLocalChecked())),
|
|
||||||
PER_ISOLATE_PRIVATE_SYMBOL_PROPERTIES(V)
|
|
||||||
#undef V
|
|
||||||
#define V(PropertyName, StringValue) \
|
|
||||||
PropertyName ## _( \
|
|
||||||
isolate, \
|
|
||||||
String::NewFromOneByte( \
|
|
||||||
isolate, \
|
|
||||||
reinterpret_cast<const uint8_t*>(StringValue), \
|
|
||||||
v8::NewStringType::kInternalized, \
|
|
||||||
sizeof(StringValue) - 1).ToLocalChecked()),
|
|
||||||
PER_ISOLATE_STRING_PROPERTIES(V)
|
|
||||||
#undef V
|
|
||||||
isolate_(isolate),
|
isolate_(isolate),
|
||||||
event_loop_(event_loop),
|
event_loop_(event_loop),
|
||||||
zero_fill_field_(zero_fill_field),
|
zero_fill_field_(zero_fill_field),
|
||||||
platform_(platform) {
|
platform_(platform) {
|
||||||
if (platform_ != nullptr)
|
if (platform_ != nullptr)
|
||||||
platform_->RegisterIsolate(this, event_loop);
|
platform_->RegisterIsolate(this, event_loop);
|
||||||
|
|
||||||
|
// Create string and private symbol properties as internalized one byte
|
||||||
|
// strings after the platform is properly initialized.
|
||||||
|
//
|
||||||
|
// Internalized because it makes property lookups a little faster and
|
||||||
|
// because the string is created in the old space straight away. It's going
|
||||||
|
// to end up in the old space sooner or later anyway but now it doesn't go
|
||||||
|
// through v8::Eternal's new space handling first.
|
||||||
|
//
|
||||||
|
// One byte because our strings are ASCII and we can safely skip V8's UTF-8
|
||||||
|
// decoding step.
|
||||||
|
|
||||||
|
#define V(PropertyName, StringValue) \
|
||||||
|
PropertyName ## _.Set( \
|
||||||
|
isolate, \
|
||||||
|
Private::New( \
|
||||||
|
isolate, \
|
||||||
|
String::NewFromOneByte( \
|
||||||
|
isolate, \
|
||||||
|
reinterpret_cast<const uint8_t*>(StringValue), \
|
||||||
|
v8::NewStringType::kInternalized, \
|
||||||
|
sizeof(StringValue) - 1).ToLocalChecked()));
|
||||||
|
PER_ISOLATE_PRIVATE_SYMBOL_PROPERTIES(V)
|
||||||
|
#undef V
|
||||||
|
#define V(PropertyName, StringValue) \
|
||||||
|
PropertyName ## _.Set( \
|
||||||
|
isolate, \
|
||||||
|
String::NewFromOneByte( \
|
||||||
|
isolate, \
|
||||||
|
reinterpret_cast<const uint8_t*>(StringValue), \
|
||||||
|
v8::NewStringType::kInternalized, \
|
||||||
|
sizeof(StringValue) - 1).ToLocalChecked());
|
||||||
|
PER_ISOLATE_STRING_PROPERTIES(V)
|
||||||
|
#undef V
|
||||||
}
|
}
|
||||||
|
|
||||||
IsolateData::~IsolateData() {
|
IsolateData::~IsolateData() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user