[compile hints] Collect compile hints data in v8
This adds the APIs for the embedder to 1) request compile hints collection for a script 2) retrieve the compile hint data Bug: chromium:1406506 Change-Id: Ic23430d3cff9fe71faa71f4c7be6635467e14268 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/4154427 Commit-Queue: Marja Hölttä <marja@chromium.org> Reviewed-by: Camillo Bruni <cbruni@chromium.org> Cr-Commit-Position: refs/heads/main@{#85461}
This commit is contained in:
parent
9637266ea5
commit
0ea9064e39
@ -347,6 +347,12 @@ class V8_EXPORT Script {
|
||||
* ScriptOrigin. This can be either a v8::String or v8::Undefined.
|
||||
*/
|
||||
Local<Value> GetResourceName();
|
||||
|
||||
/**
|
||||
* If the script was compiled, returns the positions of lazy functions which
|
||||
* were eventually compiled and executed.
|
||||
*/
|
||||
std::vector<int> GetProducedCompileHints() const;
|
||||
};
|
||||
|
||||
enum class ScriptType { kClassic, kModule };
|
||||
@ -562,7 +568,8 @@ class V8_EXPORT ScriptCompiler {
|
||||
enum CompileOptions {
|
||||
kNoCompileOptions = 0,
|
||||
kConsumeCodeCache,
|
||||
kEagerCompile
|
||||
kEagerCompile,
|
||||
kProduceCompileHints
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -2317,6 +2317,31 @@ Local<Value> Script::GetResourceName() {
|
||||
i::handle(i::Script::cast(sfi.script()).name(), i_isolate));
|
||||
}
|
||||
|
||||
std::vector<int> Script::GetProducedCompileHints() const {
|
||||
i::DisallowGarbageCollection no_gc;
|
||||
i::Handle<i::JSFunction> func = Utils::OpenHandle(this);
|
||||
i::Isolate* i_isolate = func->GetIsolate();
|
||||
i::SharedFunctionInfo sfi = (*func).shared();
|
||||
CHECK(sfi.script().IsScript());
|
||||
i::Script script = i::Script::cast(sfi.script());
|
||||
i::Object maybe_array_list = script.compiled_lazy_function_positions();
|
||||
std::vector<int> result;
|
||||
if (!maybe_array_list.IsUndefined(i_isolate)) {
|
||||
i::ArrayList array_list = i::ArrayList::cast(maybe_array_list);
|
||||
result.reserve(array_list.Length());
|
||||
for (int i = 0; i < array_list.Length(); ++i) {
|
||||
i::Object item = array_list.Get(i);
|
||||
CHECK(item.IsSmi());
|
||||
result.push_back(i::Smi::ToInt(item));
|
||||
}
|
||||
// Clear the data; the embedder can still request more data later, but it'll
|
||||
// have to keep track of the original data itself.
|
||||
script.set_compiled_lazy_function_positions(
|
||||
i::ReadOnlyRoots(i_isolate).undefined_value());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// static
|
||||
Local<PrimitiveArray> PrimitiveArray::New(Isolate* v8_isolate, int length) {
|
||||
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(v8_isolate);
|
||||
@ -2723,9 +2748,10 @@ MaybeLocal<Script> ScriptCompiler::Compile(Local<Context> context,
|
||||
MaybeLocal<Module> ScriptCompiler::CompileModule(
|
||||
Isolate* v8_isolate, Source* source, CompileOptions options,
|
||||
NoCacheReason no_cache_reason) {
|
||||
Utils::ApiCheck(options == kNoCompileOptions || options == kConsumeCodeCache,
|
||||
"v8::ScriptCompiler::CompileModule",
|
||||
"Invalid CompileOptions");
|
||||
Utils::ApiCheck(
|
||||
options == kNoCompileOptions || options == kConsumeCodeCache ||
|
||||
options == kProduceCompileHints,
|
||||
"v8::ScriptCompiler::CompileModule", "Invalid CompileOptions");
|
||||
Utils::ApiCheck(source->GetResourceOptions().IsModule(),
|
||||
"v8::ScriptCompiler::CompileModule",
|
||||
"Invalid ScriptOrigin: is_module must be true");
|
||||
@ -2860,7 +2886,8 @@ void ScriptCompiler::ScriptStreamingTask::Run() { data_->task->Run(); }
|
||||
ScriptCompiler::ScriptStreamingTask* ScriptCompiler::StartStreaming(
|
||||
Isolate* v8_isolate, StreamedSource* source, v8::ScriptType type,
|
||||
CompileOptions options) {
|
||||
Utils::ApiCheck(options == kNoCompileOptions || options == kEagerCompile,
|
||||
Utils::ApiCheck(options == kNoCompileOptions || options == kEagerCompile ||
|
||||
options == kProduceCompileHints,
|
||||
"v8::ScriptCompiler::StartStreaming",
|
||||
"Invalid CompileOptions");
|
||||
if (!i::v8_flags.script_streaming) return nullptr;
|
||||
|
@ -1596,6 +1596,9 @@ BackgroundCompileTask::BackgroundCompileTask(
|
||||
start_position_(0),
|
||||
end_position_(0),
|
||||
function_literal_id_(kFunctionLiteralIdTopLevel) {
|
||||
if (options == ScriptCompiler::CompileOptions::kProduceCompileHints) {
|
||||
flags_.set_produce_compile_hints(true);
|
||||
}
|
||||
DCHECK(is_streaming_compilation());
|
||||
}
|
||||
|
||||
@ -2536,6 +2539,21 @@ bool Compiler::Compile(Isolate* isolate, Handle<SharedFunctionInfo> shared_info,
|
||||
CompileAllWithBaseline(isolate, finalize_unoptimized_compilation_data_list);
|
||||
}
|
||||
|
||||
if (script->produce_compile_hints()) {
|
||||
// Log lazy funtion compilation.
|
||||
Handle<ArrayList> list;
|
||||
if (script->compiled_lazy_function_positions().IsUndefined()) {
|
||||
constexpr int kInitialLazyFunctionPositionListSize = 100;
|
||||
list = ArrayList::New(isolate, kInitialLazyFunctionPositionListSize);
|
||||
} else {
|
||||
list = handle(ArrayList::cast(script->compiled_lazy_function_positions()),
|
||||
isolate);
|
||||
}
|
||||
list = ArrayList::Add(isolate, list,
|
||||
Smi::FromInt(shared_info->StartPosition()));
|
||||
script->set_compiled_lazy_function_positions(*list);
|
||||
}
|
||||
|
||||
DCHECK(!isolate->has_pending_exception());
|
||||
DCHECK(is_compiled_scope->is_compiled());
|
||||
return true;
|
||||
@ -3336,7 +3354,8 @@ bool CanBackgroundCompile(const ScriptDetails& script_details,
|
||||
// modules is supported.
|
||||
return !script_details.origin_options.IsModule() && !extension &&
|
||||
script_details.repl_mode == REPLMode::kNo &&
|
||||
compile_options == ScriptCompiler::kNoCompileOptions &&
|
||||
(compile_options == ScriptCompiler::kNoCompileOptions ||
|
||||
compile_options == ScriptCompiler::kProduceCompileHints) &&
|
||||
natives == NOT_NATIVES_CODE;
|
||||
}
|
||||
|
||||
@ -3422,16 +3441,14 @@ MaybeHandle<SharedFunctionInfo> GetSharedFunctionInfoForScriptImpl(
|
||||
ScriptCompiler::NoCacheReason no_cache_reason, NativesFlag natives) {
|
||||
ScriptCompileTimerScope compile_timer(isolate, no_cache_reason);
|
||||
|
||||
if (compile_options == ScriptCompiler::kNoCompileOptions ||
|
||||
compile_options == ScriptCompiler::kEagerCompile) {
|
||||
DCHECK_NULL(cached_data);
|
||||
DCHECK_NULL(deserialize_task);
|
||||
} else {
|
||||
DCHECK_EQ(compile_options, ScriptCompiler::kConsumeCodeCache);
|
||||
if (compile_options == ScriptCompiler::kConsumeCodeCache) {
|
||||
// Have to have exactly one of cached_data or deserialize_task.
|
||||
DCHECK(cached_data || deserialize_task);
|
||||
DCHECK(!(cached_data && deserialize_task));
|
||||
DCHECK_NULL(extension);
|
||||
} else {
|
||||
DCHECK_NULL(cached_data);
|
||||
DCHECK_NULL(deserialize_task);
|
||||
}
|
||||
|
||||
if (V8_UNLIKELY(
|
||||
@ -3573,6 +3590,11 @@ MaybeHandle<SharedFunctionInfo> GetSharedFunctionInfoForScriptImpl(
|
||||
isolate->ReportPendingMessages();
|
||||
}
|
||||
}
|
||||
Handle<SharedFunctionInfo> result;
|
||||
if (compile_options == ScriptCompiler::CompileOptions::kProduceCompileHints &&
|
||||
maybe_result.ToHandle(&result)) {
|
||||
Script::cast(result->script()).set_produce_compile_hints(true);
|
||||
}
|
||||
|
||||
return maybe_result;
|
||||
}
|
||||
@ -3632,12 +3654,10 @@ MaybeHandle<JSFunction> Compiler::GetWrappedFunction(
|
||||
Isolate* isolate = context->GetIsolate();
|
||||
ScriptCompileTimerScope compile_timer(isolate, no_cache_reason);
|
||||
|
||||
if (compile_options == ScriptCompiler::kNoCompileOptions ||
|
||||
compile_options == ScriptCompiler::kEagerCompile) {
|
||||
DCHECK_NULL(cached_data);
|
||||
} else {
|
||||
DCHECK(compile_options == ScriptCompiler::kConsumeCodeCache);
|
||||
if (compile_options == ScriptCompiler::kConsumeCodeCache) {
|
||||
DCHECK(cached_data);
|
||||
} else {
|
||||
DCHECK_NULL(cached_data);
|
||||
}
|
||||
|
||||
LanguageMode language_mode = construct_language_mode(v8_flags.use_strict);
|
||||
@ -3763,6 +3783,10 @@ Compiler::GetSharedFunctionInfoForStreamedScript(
|
||||
|
||||
Handle<SharedFunctionInfo> result;
|
||||
if (maybe_result.ToHandle(&result)) {
|
||||
if (task->flags().produce_compile_hints()) {
|
||||
Script::cast(result->script()).set_produce_compile_hints(true);
|
||||
}
|
||||
|
||||
// Add compiled code to the isolate cache.
|
||||
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.compile"),
|
||||
"V8.StreamingFinalization.AddToCache");
|
||||
|
@ -2356,6 +2356,8 @@ void Script::ScriptPrint(std::ostream& os) {
|
||||
os << "\n - source_mapping_url: " << Brief(source_mapping_url());
|
||||
os << "\n - host_defined_options: " << Brief(host_defined_options());
|
||||
os << "\n - compilation type: " << compilation_type();
|
||||
os << "\n - compiled lazy function positions: "
|
||||
<< compiled_lazy_function_positions();
|
||||
bool is_wasm = false;
|
||||
#if V8_ENABLE_WEBASSEMBLY
|
||||
if ((is_wasm = (type() == TYPE_WASM))) {
|
||||
|
@ -288,6 +288,8 @@ Handle<Script> FactoryBase<Impl>::NewScriptWithId(
|
||||
raw.set_flags(0);
|
||||
raw.set_host_defined_options(roots.empty_fixed_array(), SKIP_WRITE_BARRIER);
|
||||
raw.set_source_hash(roots.undefined_value(), SKIP_WRITE_BARRIER);
|
||||
raw.set_compiled_lazy_function_positions(roots.undefined_value(),
|
||||
SKIP_WRITE_BARRIER);
|
||||
#ifdef V8_SCRIPTORMODULE_LEGACY_LIFETIME
|
||||
raw.set_script_or_modules(roots.empty_array_list());
|
||||
#endif
|
||||
|
@ -1520,6 +1520,8 @@ Handle<Script> Factory::CloneScript(Handle<Script> script) {
|
||||
new_script.set_flags(old_script.flags());
|
||||
new_script.set_host_defined_options(old_script.host_defined_options());
|
||||
new_script.set_source_hash(*undefined_value(), SKIP_WRITE_BARRIER);
|
||||
new_script.set_compiled_lazy_function_positions(*undefined_value(),
|
||||
SKIP_WRITE_BARRIER);
|
||||
#ifdef V8_SCRIPTORMODULE_LEGACY_LIFETIME
|
||||
new_script.set_script_or_modules(*list);
|
||||
#endif
|
||||
|
@ -465,6 +465,9 @@ class ArrayList : public TorqueGeneratedArrayList<ArrayList, FixedArray> {
|
||||
Handle<ArrayList> array,
|
||||
Handle<Object> obj1,
|
||||
Handle<Object> obj2);
|
||||
V8_EXPORT_PRIVATE static Handle<ArrayList> Add(Isolate* isolate,
|
||||
Handle<ArrayList> array,
|
||||
Smi obj1);
|
||||
V8_EXPORT_PRIVATE static Handle<ArrayList> Add(Isolate* isolate,
|
||||
Handle<ArrayList> array,
|
||||
Handle<Object> obj1, Smi obj2,
|
||||
|
@ -4033,6 +4033,21 @@ Handle<ArrayList> ArrayList::Add(Isolate* isolate, Handle<ArrayList> array,
|
||||
return array;
|
||||
}
|
||||
|
||||
Handle<ArrayList> ArrayList::Add(Isolate* isolate, Handle<ArrayList> array,
|
||||
Smi obj1) {
|
||||
int length = array->Length();
|
||||
array = EnsureSpace(isolate, array, length + 1);
|
||||
// Check that GC didn't remove elements from the array.
|
||||
DCHECK_EQ(array->Length(), length);
|
||||
{
|
||||
DisallowGarbageCollection no_gc;
|
||||
ArrayList raw_array = *array;
|
||||
raw_array.Set(length, obj1);
|
||||
raw_array.SetLength(length + 1);
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
// static
|
||||
Handle<ArrayList> ArrayList::Add(Isolate* isolate, Handle<ArrayList> array,
|
||||
Handle<Object> obj1, Handle<Object> obj2) {
|
||||
|
@ -44,6 +44,9 @@ SMI_ACCESSORS_CHECKED(Script, eval_from_position, kEvalFromPositionOffset,
|
||||
CHECK_SCRIPT_NOT_WASM)
|
||||
#undef CHECK_SCRIPT_NOT_WASM
|
||||
|
||||
ACCESSORS(Script, compiled_lazy_function_positions, Object,
|
||||
kCompiledLazyFunctionPositionsOffset)
|
||||
|
||||
bool Script::is_wrapped() const {
|
||||
return eval_from_shared_or_wrapped_arguments_or_sfi_table().IsFixedArray() &&
|
||||
type() != TYPE_WEB_SNAPSHOT;
|
||||
@ -148,6 +151,14 @@ void Script::set_compilation_state(CompilationState state) {
|
||||
set_flags(CompilationStateBit::update(flags(), state));
|
||||
}
|
||||
|
||||
bool Script::produce_compile_hints() const {
|
||||
return ProduceCompileHintsBit::decode(flags());
|
||||
}
|
||||
|
||||
void Script::set_produce_compile_hints(bool produce_compile_hints) {
|
||||
set_flags(ProduceCompileHintsBit::update(flags(), produce_compile_hints));
|
||||
}
|
||||
|
||||
bool Script::is_repl_mode() const { return IsReplModeBit::decode(flags()); }
|
||||
|
||||
void Script::set_is_repl_mode(bool value) {
|
||||
|
@ -128,6 +128,9 @@ class Script : public TorqueGeneratedScript<Script, Struct> {
|
||||
inline CompilationType compilation_type();
|
||||
inline void set_compilation_type(CompilationType type);
|
||||
|
||||
inline bool produce_compile_hints() const;
|
||||
inline void set_produce_compile_hints(bool produce_compile_hints);
|
||||
|
||||
// [compilation_state]: determines whether the script has already been
|
||||
// compiled. Encoded in the 'flags' field.
|
||||
inline CompilationState compilation_state();
|
||||
@ -144,6 +147,8 @@ class Script : public TorqueGeneratedScript<Script, Struct> {
|
||||
inline v8::ScriptOriginOptions origin_options();
|
||||
inline void set_origin_options(ScriptOriginOptions origin_options);
|
||||
|
||||
DECL_ACCESSORS(compiled_lazy_function_positions, Object)
|
||||
|
||||
// If script source is an external string, check that the underlying
|
||||
// resource is accessible. Otherwise, always return true.
|
||||
inline bool HasValidSource();
|
||||
|
@ -12,6 +12,7 @@ bitfield struct ScriptFlags extends uint31 {
|
||||
origin_options: int32: 4 bit;
|
||||
// Whether an instrumentation breakpoint is set for this script (wasm only).
|
||||
break_on_entry: bool: 1 bit;
|
||||
produce_compile_hints: bool: 1 bit;
|
||||
}
|
||||
|
||||
extern class Script extends Struct {
|
||||
@ -48,6 +49,10 @@ extern class Script extends Struct {
|
||||
eval_from_position: Smi|Foreign; // Smi or Managed<wasm::NativeModule>
|
||||
shared_function_infos: WeakFixedArray|WeakArrayList;
|
||||
|
||||
// [compiled_lazy_function_positions]: ArrayList containing SMIs marking
|
||||
// the start positions of lazy functions which got compiled.
|
||||
compiled_lazy_function_positions: ArrayList|Undefined;
|
||||
|
||||
// [flags]: Holds an exciting bitfield.
|
||||
flags: SmiTagged<ScriptFlags>;
|
||||
|
||||
|
@ -61,7 +61,8 @@ class Zone;
|
||||
V(post_parallel_compile_tasks_for_eager_toplevel, bool, 1, _) \
|
||||
V(post_parallel_compile_tasks_for_lazy, bool, 1, _) \
|
||||
V(collect_source_positions, bool, 1, _) \
|
||||
V(is_repl_mode, bool, 1, _)
|
||||
V(is_repl_mode, bool, 1, _) \
|
||||
V(produce_compile_hints, bool, 1, _)
|
||||
|
||||
class V8_EXPORT_PRIVATE UnoptimizedCompileFlags {
|
||||
public:
|
||||
|
@ -742,9 +742,11 @@ void Serializer::ObjectSerializer::Serialize() {
|
||||
return;
|
||||
}
|
||||
if (InstanceTypeChecker::IsScript(instance_type)) {
|
||||
// Clear cached line ends.
|
||||
// Clear cached line ends & compiled lazy function positions.
|
||||
Oddball undefined = ReadOnlyRoots(isolate()).undefined_value();
|
||||
Handle<Script>::cast(object_)->set_line_ends(undefined);
|
||||
Handle<Script>::cast(object_)->set_compiled_lazy_function_positions(
|
||||
undefined);
|
||||
}
|
||||
|
||||
// We don't expect fillers.
|
||||
|
@ -157,5 +157,76 @@ TEST_F(ScriptTest, GetEmptyStalledTopLevelAwaitMessage) {
|
||||
{});
|
||||
}
|
||||
|
||||
TEST_F(ScriptTest, ProduceCompileHints) {
|
||||
const char* url = "http://www.foo.com/foo.js";
|
||||
v8::ScriptOrigin origin(isolate(), NewString(url), 13, 0);
|
||||
|
||||
const char* code = "function lazy1() {} function lazy2() {} lazy1();";
|
||||
v8::ScriptCompiler::Source script_source(NewString(code), origin);
|
||||
|
||||
// Test producing compile hints.
|
||||
{
|
||||
Local<Script> script =
|
||||
v8::ScriptCompiler::Compile(
|
||||
v8_context(), &script_source,
|
||||
v8::ScriptCompiler::CompileOptions::kProduceCompileHints)
|
||||
.ToLocalChecked();
|
||||
{
|
||||
auto compile_hints = script->GetProducedCompileHints();
|
||||
EXPECT_EQ(0u, compile_hints.size());
|
||||
}
|
||||
|
||||
v8::Local<v8::Context> context = v8::Context::New(isolate());
|
||||
v8::MaybeLocal<v8::Value> result = script->Run(context);
|
||||
EXPECT_FALSE(result.IsEmpty());
|
||||
{
|
||||
auto compile_hints = script->GetProducedCompileHints();
|
||||
EXPECT_EQ(1u, compile_hints.size());
|
||||
EXPECT_EQ(14, compile_hints[0]);
|
||||
}
|
||||
|
||||
// The previous data is cleared if we retrieve compile hints again.
|
||||
{
|
||||
auto compile_hints = script->GetProducedCompileHints();
|
||||
EXPECT_EQ(0u, compile_hints.size());
|
||||
}
|
||||
|
||||
// Call the other lazy function and retrieve compile hints again.
|
||||
const char* code2 = "lazy2();";
|
||||
v8::ScriptCompiler::Source script_source2(NewString(code2), origin);
|
||||
|
||||
Local<Script> script2 =
|
||||
v8::ScriptCompiler::Compile(v8_context(), &script_source2)
|
||||
.ToLocalChecked();
|
||||
v8::MaybeLocal<v8::Value> result2 = script2->Run(context);
|
||||
EXPECT_FALSE(result2.IsEmpty());
|
||||
{
|
||||
auto compile_hints = script->GetProducedCompileHints();
|
||||
EXPECT_EQ(1u, compile_hints.size());
|
||||
EXPECT_EQ(34, compile_hints[0]);
|
||||
}
|
||||
}
|
||||
|
||||
// Test that compile hints are not produced unless the relevant compile option
|
||||
// is set.
|
||||
{
|
||||
Local<Script> script =
|
||||
v8::ScriptCompiler::Compile(v8_context(), &script_source)
|
||||
.ToLocalChecked();
|
||||
{
|
||||
auto compile_hints = script->GetProducedCompileHints();
|
||||
EXPECT_EQ(0u, compile_hints.size());
|
||||
}
|
||||
|
||||
v8::Local<v8::Context> context = v8::Context::New(isolate());
|
||||
v8::MaybeLocal<v8::Value> result = script->Run(context);
|
||||
EXPECT_FALSE(result.IsEmpty());
|
||||
{
|
||||
auto compile_hints = script->GetProducedCompileHints();
|
||||
EXPECT_EQ(0u, compile_hints.size());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace v8
|
||||
|
@ -555,52 +555,52 @@ KNOWN_OBJECTS = {
|
||||
("old_space", 0x043bd): "ExternalMap",
|
||||
("old_space", 0x043e5): "JSMessageObjectMap",
|
||||
("old_space", 0x0440d): "EmptyScript",
|
||||
("old_space", 0x04451): "ManyClosuresCell",
|
||||
("old_space", 0x0445d): "ArrayConstructorProtector",
|
||||
("old_space", 0x04471): "NoElementsProtector",
|
||||
("old_space", 0x04485): "MegaDOMProtector",
|
||||
("old_space", 0x04499): "IsConcatSpreadableProtector",
|
||||
("old_space", 0x044ad): "ArraySpeciesProtector",
|
||||
("old_space", 0x044c1): "TypedArraySpeciesProtector",
|
||||
("old_space", 0x044d5): "PromiseSpeciesProtector",
|
||||
("old_space", 0x044e9): "RegExpSpeciesProtector",
|
||||
("old_space", 0x044fd): "StringLengthProtector",
|
||||
("old_space", 0x04511): "ArrayIteratorProtector",
|
||||
("old_space", 0x04525): "ArrayBufferDetachingProtector",
|
||||
("old_space", 0x04539): "PromiseHookProtector",
|
||||
("old_space", 0x0454d): "PromiseResolveProtector",
|
||||
("old_space", 0x04561): "MapIteratorProtector",
|
||||
("old_space", 0x04575): "PromiseThenProtector",
|
||||
("old_space", 0x04589): "SetIteratorProtector",
|
||||
("old_space", 0x0459d): "StringIteratorProtector",
|
||||
("old_space", 0x045b1): "NumberStringPrototypeNoReplaceProtector",
|
||||
("old_space", 0x045c5): "StringSplitCache",
|
||||
("old_space", 0x049cd): "RegExpMultipleCache",
|
||||
("old_space", 0x04dd5): "BuiltinsConstantsTable",
|
||||
("old_space", 0x053a5): "AsyncFunctionAwaitRejectSharedFun",
|
||||
("old_space", 0x053c9): "AsyncFunctionAwaitResolveSharedFun",
|
||||
("old_space", 0x053ed): "AsyncGeneratorAwaitRejectSharedFun",
|
||||
("old_space", 0x05411): "AsyncGeneratorAwaitResolveSharedFun",
|
||||
("old_space", 0x05435): "AsyncGeneratorYieldWithAwaitResolveSharedFun",
|
||||
("old_space", 0x05459): "AsyncGeneratorReturnResolveSharedFun",
|
||||
("old_space", 0x0547d): "AsyncGeneratorReturnClosedRejectSharedFun",
|
||||
("old_space", 0x054a1): "AsyncGeneratorReturnClosedResolveSharedFun",
|
||||
("old_space", 0x054c5): "AsyncIteratorValueUnwrapSharedFun",
|
||||
("old_space", 0x054e9): "PromiseAllResolveElementSharedFun",
|
||||
("old_space", 0x0550d): "PromiseAllSettledResolveElementSharedFun",
|
||||
("old_space", 0x05531): "PromiseAllSettledRejectElementSharedFun",
|
||||
("old_space", 0x05555): "PromiseAnyRejectElementSharedFun",
|
||||
("old_space", 0x05579): "PromiseCapabilityDefaultRejectSharedFun",
|
||||
("old_space", 0x0559d): "PromiseCapabilityDefaultResolveSharedFun",
|
||||
("old_space", 0x055c1): "PromiseCatchFinallySharedFun",
|
||||
("old_space", 0x055e5): "PromiseGetCapabilitiesExecutorSharedFun",
|
||||
("old_space", 0x05609): "PromiseThenFinallySharedFun",
|
||||
("old_space", 0x0562d): "PromiseThrowerFinallySharedFun",
|
||||
("old_space", 0x05651): "PromiseValueThunkFinallySharedFun",
|
||||
("old_space", 0x05675): "ProxyRevokeSharedFun",
|
||||
("old_space", 0x05699): "ShadowRealmImportValueFulfilledSFI",
|
||||
("old_space", 0x056bd): "SourceTextModuleExecuteAsyncModuleFulfilledSFI",
|
||||
("old_space", 0x056e1): "SourceTextModuleExecuteAsyncModuleRejectedSFI",
|
||||
("old_space", 0x04455): "ManyClosuresCell",
|
||||
("old_space", 0x04461): "ArrayConstructorProtector",
|
||||
("old_space", 0x04475): "NoElementsProtector",
|
||||
("old_space", 0x04489): "MegaDOMProtector",
|
||||
("old_space", 0x0449d): "IsConcatSpreadableProtector",
|
||||
("old_space", 0x044b1): "ArraySpeciesProtector",
|
||||
("old_space", 0x044c5): "TypedArraySpeciesProtector",
|
||||
("old_space", 0x044d9): "PromiseSpeciesProtector",
|
||||
("old_space", 0x044ed): "RegExpSpeciesProtector",
|
||||
("old_space", 0x04501): "StringLengthProtector",
|
||||
("old_space", 0x04515): "ArrayIteratorProtector",
|
||||
("old_space", 0x04529): "ArrayBufferDetachingProtector",
|
||||
("old_space", 0x0453d): "PromiseHookProtector",
|
||||
("old_space", 0x04551): "PromiseResolveProtector",
|
||||
("old_space", 0x04565): "MapIteratorProtector",
|
||||
("old_space", 0x04579): "PromiseThenProtector",
|
||||
("old_space", 0x0458d): "SetIteratorProtector",
|
||||
("old_space", 0x045a1): "StringIteratorProtector",
|
||||
("old_space", 0x045b5): "NumberStringPrototypeNoReplaceProtector",
|
||||
("old_space", 0x045c9): "StringSplitCache",
|
||||
("old_space", 0x049d1): "RegExpMultipleCache",
|
||||
("old_space", 0x04dd9): "BuiltinsConstantsTable",
|
||||
("old_space", 0x053a9): "AsyncFunctionAwaitRejectSharedFun",
|
||||
("old_space", 0x053cd): "AsyncFunctionAwaitResolveSharedFun",
|
||||
("old_space", 0x053f1): "AsyncGeneratorAwaitRejectSharedFun",
|
||||
("old_space", 0x05415): "AsyncGeneratorAwaitResolveSharedFun",
|
||||
("old_space", 0x05439): "AsyncGeneratorYieldWithAwaitResolveSharedFun",
|
||||
("old_space", 0x0545d): "AsyncGeneratorReturnResolveSharedFun",
|
||||
("old_space", 0x05481): "AsyncGeneratorReturnClosedRejectSharedFun",
|
||||
("old_space", 0x054a5): "AsyncGeneratorReturnClosedResolveSharedFun",
|
||||
("old_space", 0x054c9): "AsyncIteratorValueUnwrapSharedFun",
|
||||
("old_space", 0x054ed): "PromiseAllResolveElementSharedFun",
|
||||
("old_space", 0x05511): "PromiseAllSettledResolveElementSharedFun",
|
||||
("old_space", 0x05535): "PromiseAllSettledRejectElementSharedFun",
|
||||
("old_space", 0x05559): "PromiseAnyRejectElementSharedFun",
|
||||
("old_space", 0x0557d): "PromiseCapabilityDefaultRejectSharedFun",
|
||||
("old_space", 0x055a1): "PromiseCapabilityDefaultResolveSharedFun",
|
||||
("old_space", 0x055c5): "PromiseCatchFinallySharedFun",
|
||||
("old_space", 0x055e9): "PromiseGetCapabilitiesExecutorSharedFun",
|
||||
("old_space", 0x0560d): "PromiseThenFinallySharedFun",
|
||||
("old_space", 0x05631): "PromiseThrowerFinallySharedFun",
|
||||
("old_space", 0x05655): "PromiseValueThunkFinallySharedFun",
|
||||
("old_space", 0x05679): "ProxyRevokeSharedFun",
|
||||
("old_space", 0x0569d): "ShadowRealmImportValueFulfilledSFI",
|
||||
("old_space", 0x056c1): "SourceTextModuleExecuteAsyncModuleFulfilledSFI",
|
||||
("old_space", 0x056e5): "SourceTextModuleExecuteAsyncModuleRejectedSFI",
|
||||
}
|
||||
|
||||
# Lower 32 bits of first page addresses for various heap spaces.
|
||||
|
Loading…
Reference in New Issue
Block a user