diff --git a/src/env-inl.h b/src/env-inl.h index cc9dd9ec3e..34d0531a1e 100644 --- a/src/env-inl.h +++ b/src/env-inl.h @@ -36,12 +36,26 @@ inline void Environment::IsolateData::Put() { } } +// Create string 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? inline Environment::IsolateData::IsolateData(v8::Isolate* isolate, uv_loop_t* loop) : event_loop_(loop), isolate_(isolate), #define V(PropertyName, StringValue) \ - PropertyName ## _(isolate, FIXED_ONE_BYTE_STRING(isolate, StringValue)), + PropertyName ## _(isolate, \ + v8::String::NewFromOneByte( \ + isolate, \ + reinterpret_cast(StringValue), \ + v8::NewStringType::kInternalized, \ + sizeof(StringValue) - 1).ToLocalChecked()), PER_ISOLATE_STRING_PROPERTIES(V) #undef V ref_count_(0) {} diff --git a/src/env.h b/src/env.h index 1107dcb174..fbbcaf2a8a 100644 --- a/src/env.h +++ b/src/env.h @@ -39,7 +39,7 @@ namespace node { #endif // Strings are per-isolate primitives but Environment proxies them -// for the sake of convenience. +// for the sake of convenience. Strings should be ASCII-only. #define PER_ISOLATE_STRING_PROPERTIES(V) \ V(address_string, "address") \ V(args_string, "args") \