Commit 7f20cf56 authored by Benedikt Meurer's avatar Benedikt Meurer Committed by V8 LUCI CQ

[debug] Report optimized out and certain TDZ values as unavailable.

This adds a new --experimental-value-unavailable flag, which is disabled
for now. When enabled the debugger reports values that are optimized out
by TurboFan and values of certain variables in Temporal Dead Zones (TDZ)
as unavailable. Internally we use a special `value_unavailable` accessor
info to represent these values, and on the debugger boundary we report
these properties with `value`, `get`, or `set`.

Doc: https://goo.gle/devtools-value-unavailable
Bug: chromium:1328681
Demo: devtools-dbg-stories.netlify.app/crbug-1328681-value-unavailable
Change-Id: Idb09a4a148335a950deae60f7c07caecc48826ba
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3627510
Commit-Queue: Benedikt Meurer <bmeurer@chromium.org>
Reviewed-by: 's avatarYang Guo <yangguo@chromium.org>
Cr-Commit-Position: refs/heads/main@{#81509}
parent a72b10aa
......@@ -808,6 +808,24 @@ Handle<AccessorInfo> Accessors::MakeWrappedFunctionLengthInfo(
&WrappedFunctionLengthGetter, &ReconfigureToDataProperty);
}
//
// Accessors::ValueUnavailable
//
void Accessors::ValueUnavailableGetter(
v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate());
HandleScope scope(isolate);
isolate->Throw(*isolate->factory()->NewReferenceError(
MessageTemplate::kAccessedUnavailableVariable, Utils::OpenHandle(*name)));
isolate->OptionalRescheduleException(false);
}
Handle<AccessorInfo> Accessors::MakeValueUnavailableInfo(Isolate* isolate) {
return MakeAccessor(isolate, isolate->factory()->empty_string(),
&ValueUnavailableGetter, &ReconfigureToDataProperty);
}
//
// Accessors::WrappedFunctionName
//
......
......@@ -48,6 +48,8 @@ class JavaScriptFrame;
kHasSideEffectToReceiver) \
V(_, string_length, StringLength, kHasNoSideEffect, \
kHasSideEffectToReceiver) \
V(_, value_unavailable, ValueUnavailable, kHasNoSideEffect, \
kHasSideEffectToReceiver) \
V(_, wrapped_function_length, WrappedFunctionLength, kHasNoSideEffect, \
kHasSideEffectToReceiver) \
V(_, wrapped_function_name, WrappedFunctionName, kHasNoSideEffect, \
......
......@@ -340,6 +340,7 @@ namespace internal {
T(SuperAlreadyCalled, "Super constructor may only be called once") \
T(AccessedUninitializedVariable, "Cannot access '%' before initialization") \
T(UnsupportedSuper, "Unsupported reference to 'super'") \
T(AccessedUnavailableVariable, "Cannot access '%' from debugger") \
/* RangeError */ \
T(BigIntDivZero, "Division by zero") \
T(BigIntNegativeExponent, "Exponent must be positive") \
......
......@@ -565,7 +565,8 @@ void SetReturnValue(v8::Isolate* isolate, v8::Local<v8::Value> value);
enum class NativeAccessorType {
None = 0,
HasGetter = 1 << 0,
HasSetter = 1 << 1
HasSetter = 1 << 1,
IsValueUnavailable = 1 << 2
};
int64_t GetNextRandomInt64(v8::Isolate* isolate);
......
......@@ -223,6 +223,9 @@ base::Flags<debug::NativeAccessorType, int> GetNativeAccessorDescriptorInternal(
Handle<Object> structure = it.GetAccessors();
if (!structure->IsAccessorInfo()) return debug::NativeAccessorType::None;
base::Flags<debug::NativeAccessorType, int> result;
if (*structure == *isolate->factory()->value_unavailable_accessor()) {
return debug::NativeAccessorType::IsValueUnavailable;
}
#define IS_BUILTIN_ACCESSOR(_, name, ...) \
if (*structure == *isolate->factory()->name##_accessor()) \
return debug::NativeAccessorType::None;
......
......@@ -563,14 +563,31 @@ Handle<JSObject> ScopeIterator::ScopeObject(Mode mode) {
Handle<JSObject> scope = isolate_->factory()->NewSlowJSObjectWithNullProto();
auto visitor = [=](Handle<String> name, Handle<Object> value,
ScopeType scope_type) {
if (value->IsTheHole(isolate_)) {
// Reflect variables under TDZ as undefined in scope object.
if (value->IsOptimizedOut(isolate_)) {
if (FLAG_experimental_value_unavailable) {
JSObject::SetAccessor(scope, name,
isolate_->factory()->value_unavailable_accessor(),
NONE)
.Check();
return false;
}
// Reflect optimized out variables as undefined in scope object.
value = isolate_->factory()->undefined_value();
} else if (value->IsTheHole(isolate_)) {
if (scope_type == ScopeTypeScript &&
JSReceiver::HasOwnProperty(isolate_, scope, name).FromMaybe(true)) {
// We also use the hole to represent overridden let-declarations via
// REPL mode in a script context. Catch this case.
return false;
}
if (FLAG_experimental_value_unavailable) {
JSObject::SetAccessor(scope, name,
isolate_->factory()->value_unavailable_accessor(),
NONE)
.Check();
return false;
}
// Reflect variables under TDZ as undefined in scope object.
value = isolate_->factory()->undefined_value();
}
// Overwrite properties. Sometimes names in the same scope can collide, e.g.
......@@ -804,12 +821,8 @@ bool ScopeIterator::VisitLocals(const Visitor& visitor, Mode mode,
Handle<Object> receiver =
this_var->location() == VariableLocation::CONTEXT
? handle(context_->get(this_var->index()), isolate_)
: frame_inspector_ == nullptr
? handle(generator_->receiver(), isolate_)
: frame_inspector_->GetReceiver();
if (receiver->IsOptimizedOut(isolate_)) {
receiver = isolate_->factory()->undefined_value();
}
: frame_inspector_ == nullptr ? handle(generator_->receiver(), isolate_)
: frame_inspector_->GetReceiver();
if (visitor(isolate_->factory()->this_string(), receiver, scope_type))
return true;
}
......@@ -850,10 +863,6 @@ bool ScopeIterator::VisitLocals(const Visitor& visitor, Mode mode,
value = handle(parameters_and_registers.get(index), isolate_);
} else {
value = frame_inspector_->GetParameter(index);
if (value->IsOptimizedOut(isolate_)) {
value = isolate_->factory()->undefined_value();
}
}
break;
}
......@@ -877,7 +886,6 @@ bool ScopeIterator::VisitLocals(const Visitor& visitor, Mode mode,
current_scope_->AsDeclarationScope()->arguments() == var) {
continue;
}
value = isolate_->factory()->undefined_value();
}
}
break;
......
......@@ -1652,6 +1652,8 @@ DEFINE_BOOL(hard_abort, true, "abort by crashing")
DEFINE_BOOL(experimental_async_stack_tagging_api, false,
"enable experimental async stacks tagging API")
DEFINE_BOOL(experimental_value_unavailable, false,
"enable experimental <value unavailable> in scopes")
DEFINE_BOOL(
live_edit_top_frame, true,
......
Test scopes with unavailable values
Running test: testTemporalDeadZone
variable y correctly reported as <value_unavailable>
Running test: testOptimizedOut
variable y correctly reported as <value_unavailable>
// Copyright 2022 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Flags: --allow-natives-syntax --experimental-value-unavailable
let {session, contextGroup, Protocol} =
InspectorTest.start('Test scopes with unavailable values');
contextGroup.addScript(`
function tdz() {
debugger;
const x = 2 ?? y + x;
let y = x + 1;
return y;
}
function opt() {
function optimizedOut(x, stop) {
let y = x + 1;
let z = y + 1;
if (stop) {
debugger;
}
return z;
}
%PrepareFunctionForOptimization(optimizedOut);
optimizedOut(1, false);
optimizedOut(2, false);
%OptimizeFunctionOnNextCall(optimizedOut);
optimizedOut(3, false);
return optimizedOut(1, true);
}
`);
Protocol.Debugger.onPaused(async ({params: {callFrames: [{scopeChain}]}}) => {
for (const scope of scopeChain) {
if (scope.type !== 'local') continue;
const {result: {result: variables}} =
await Protocol.Runtime.getProperties({objectId: scope.object.objectId});
for (const variable of variables) {
if (variable.name !== 'y') continue;
if ('value' in variable || 'get' in variable || 'set' in variable) {
InspectorTest.log(
'FAIL: variable y was expected to be reported as <value_unavailable>');
} else {
InspectorTest.log(
'variable y correctly reported as <value_unavailable>');
}
}
}
await Protocol.Debugger.resume();
});
InspectorTest.runAsyncTestSuite([
async function testTemporalDeadZone() {
await Promise.all([
Protocol.Runtime.enable(),
Protocol.Debugger.enable(),
]);
await Protocol.Runtime.evaluate({expression: 'tdz()'});
await Promise.all([
Protocol.Runtime.disable(),
Protocol.Debugger.disable(),
]);
},
async function testOptimizedOut() {
await Promise.all([
Protocol.Runtime.enable(),
Protocol.Debugger.enable(),
]);
await Protocol.Runtime.evaluate({expression: 'opt()'});
await Promise.all([
Protocol.Runtime.disable(),
Protocol.Debugger.disable(),
]);
},
]);
......@@ -542,6 +542,7 @@
['lite_mode or variant in (nooptimization, jitless, assert_types)', {
# Test relies on TurboFan being enabled.
'debugger/restart-frame/restart-inlined-frame': [SKIP],
'debugger/value-unavailable-scopes': [SKIP],
}], # lite_mode or variant in (nooptimization, jitless, assert_types)
]
......@@ -83,7 +83,7 @@ bytecodes: [
/* 48 E> */ B(DefineKeyedOwnProperty), R(this), R(0), U8(0),
/* 53 S> */ B(LdaImmutableCurrentContextSlot), U8(3),
/* 58 E> */ B(GetKeyedProperty), R(this), U8(2),
B(Wide), B(LdaSmi), I16(302),
B(Wide), B(LdaSmi), I16(303),
B(Star2),
B(LdaConstant), U8(0),
B(Star3),
......@@ -115,7 +115,7 @@ bytecodes: [
/* 41 E> */ B(DefineKeyedOwnProperty), R(this), R(0), U8(0),
/* 46 S> */ B(LdaImmutableCurrentContextSlot), U8(3),
/* 51 E> */ B(GetKeyedProperty), R(this), U8(2),
B(Wide), B(LdaSmi), I16(301),
B(Wide), B(LdaSmi), I16(302),
B(Star2),
B(LdaConstant), U8(0),
B(Star3),
......@@ -149,7 +149,7 @@ bytecodes: [
B(Star2),
B(LdaImmutableCurrentContextSlot), U8(3),
/* 58 E> */ B(GetKeyedProperty), R(this), U8(2),
B(Wide), B(LdaSmi), I16(302),
B(Wide), B(LdaSmi), I16(303),
B(Star3),
B(LdaConstant), U8(0),
B(Star4),
......@@ -181,7 +181,7 @@ bytecodes: [
/* 41 E> */ B(DefineKeyedOwnProperty), R(this), R(0), U8(0),
/* 46 S> */ B(LdaImmutableCurrentContextSlot), U8(3),
/* 51 E> */ B(GetKeyedProperty), R(this), U8(2),
B(Wide), B(LdaSmi), I16(301),
B(Wide), B(LdaSmi), I16(302),
B(Star2),
B(LdaConstant), U8(0),
B(Star3),
......
......@@ -58,7 +58,7 @@ bytecodes: [
B(Star2),
B(LdaImmutableCurrentContextSlot), U8(3),
/* 54 E> */ B(GetKeyedProperty), R(this), U8(2),
B(Wide), B(LdaSmi), I16(300),
B(Wide), B(LdaSmi), I16(301),
B(Star3),
B(LdaConstant), U8(0),
B(Star4),
......@@ -91,7 +91,7 @@ bytecodes: [
/* 44 E> */ B(DefineKeyedOwnProperty), R(this), R(0), U8(0),
/* 49 S> */ B(LdaImmutableCurrentContextSlot), U8(3),
/* 54 E> */ B(GetKeyedProperty), R(this), U8(2),
B(Wide), B(LdaSmi), I16(300),
B(Wide), B(LdaSmi), I16(301),
B(Star2),
B(LdaConstant), U8(0),
B(Star3),
......
......@@ -24,7 +24,7 @@ bytecodes: [
B(TestReferenceEqual), R(this),
B(Mov), R(this), R(1),
B(JumpIfTrue), U8(16),
B(Wide), B(LdaSmi), I16(294),
B(Wide), B(LdaSmi), I16(295),
B(Star2),
B(LdaConstant), U8(0),
B(Star3),
......@@ -61,13 +61,13 @@ bytecodes: [
B(TestReferenceEqual), R(this),
B(Mov), R(this), R(0),
B(JumpIfTrue), U8(16),
B(Wide), B(LdaSmi), I16(294),
B(Wide), B(LdaSmi), I16(295),
B(Star2),
B(LdaConstant), U8(0),
B(Star3),
/* 61 E> */ B(CallRuntime), U16(Runtime::kNewTypeError), R(2), U8(2),
B(Throw),
B(Wide), B(LdaSmi), I16(300),
B(Wide), B(LdaSmi), I16(301),
B(Star2),
B(LdaConstant), U8(1),
B(Star3),
......@@ -99,13 +99,13 @@ bytecodes: [
B(TestReferenceEqual), R(this),
B(Mov), R(this), R(0),
B(JumpIfTrue), U8(16),
B(Wide), B(LdaSmi), I16(294),
B(Wide), B(LdaSmi), I16(295),
B(Star1),
B(LdaConstant), U8(0),
B(Star2),
/* 61 E> */ B(CallRuntime), U16(Runtime::kNewTypeError), R(1), U8(2),
B(Throw),
B(Wide), B(LdaSmi), I16(300),
B(Wide), B(LdaSmi), I16(301),
B(Star1),
B(LdaConstant), U8(1),
B(Star2),
......@@ -145,7 +145,7 @@ bytecodes: [
B(TestReferenceEqual), R(this),
B(Mov), R(this), R(0),
B(JumpIfTrue), U8(16),
B(Wide), B(LdaSmi), I16(294),
B(Wide), B(LdaSmi), I16(295),
B(Star2),
B(LdaConstant), U8(0),
B(Star3),
......@@ -167,7 +167,7 @@ bytecodes: [
B(TestReferenceEqual), R(this),
B(Mov), R(this), R(0),
B(JumpIfTrue), U8(16),
B(Wide), B(LdaSmi), I16(294),
B(Wide), B(LdaSmi), I16(295),
B(Star3),
B(LdaConstant), U8(0),
B(Star4),
......@@ -182,7 +182,7 @@ bytecodes: [
B(TestReferenceEqual), R(this),
B(Mov), R(this), R(0),
B(JumpIfTrue), U8(16),
B(Wide), B(LdaSmi), I16(294),
B(Wide), B(LdaSmi), I16(295),
B(Star2),
B(LdaConstant), U8(0),
B(Star3),
......@@ -216,13 +216,13 @@ bytecodes: [
B(TestReferenceEqual), R(this),
B(Mov), R(this), R(0),
B(JumpIfTrue), U8(16),
B(Wide), B(LdaSmi), I16(294),
B(Wide), B(LdaSmi), I16(295),
B(Star1),
B(LdaConstant), U8(0),
B(Star2),
/* 65 E> */ B(CallRuntime), U16(Runtime::kNewTypeError), R(1), U8(2),
B(Throw),
B(Wide), B(LdaSmi), I16(302),
B(Wide), B(LdaSmi), I16(303),
B(Star1),
B(LdaConstant), U8(1),
B(Star2),
......@@ -253,13 +253,13 @@ bytecodes: [
B(TestReferenceEqual), R(this),
B(Mov), R(this), R(0),
B(JumpIfTrue), U8(16),
B(Wide), B(LdaSmi), I16(294),
B(Wide), B(LdaSmi), I16(295),
B(Star1),
B(LdaConstant), U8(0),
B(Star2),
/* 58 E> */ B(CallRuntime), U16(Runtime::kNewTypeError), R(1), U8(2),
B(Throw),
B(Wide), B(LdaSmi), I16(301),
B(Wide), B(LdaSmi), I16(302),
B(Star1),
B(LdaConstant), U8(1),
B(Star2),
......@@ -292,13 +292,13 @@ bytecodes: [
B(TestReferenceEqual), R(this),
B(Mov), R(this), R(0),
B(JumpIfTrue), U8(16),
B(Wide), B(LdaSmi), I16(294),
B(Wide), B(LdaSmi), I16(295),
B(Star2),
B(LdaConstant), U8(0),
B(Star3),
/* 65 E> */ B(CallRuntime), U16(Runtime::kNewTypeError), R(2), U8(2),
B(Throw),
B(Wide), B(LdaSmi), I16(302),
B(Wide), B(LdaSmi), I16(303),
B(Star2),
B(LdaConstant), U8(1),
B(Star3),
......@@ -327,7 +327,7 @@ bytecode array length: 19
bytecodes: [
/* 46 S> */ B(LdaImmutableCurrentContextSlot), U8(3),
/* 51 E> */ B(GetKeyedProperty), R(this), U8(0),
B(Wide), B(LdaSmi), I16(301),
B(Wide), B(LdaSmi), I16(302),
B(Star1),
B(LdaConstant), U8(0),
B(Star2),
......
......@@ -514,56 +514,57 @@ KNOWN_OBJECTS = {
("old_space", 0x04399): "FunctionPrototypeAccessor",
("old_space", 0x043c1): "SharedArrayLengthAccessor",
("old_space", 0x043e9): "StringLengthAccessor",
("old_space", 0x04411): "WrappedFunctionLengthAccessor",
("old_space", 0x04439): "WrappedFunctionNameAccessor",
("old_space", 0x04461): "InvalidPrototypeValidityCell",
("old_space", 0x04469): "EmptyScript",
("old_space", 0x044ad): "ManyClosuresCell",
("old_space", 0x044b9): "ArrayConstructorProtector",
("old_space", 0x044cd): "NoElementsProtector",
("old_space", 0x044e1): "MegaDOMProtector",
("old_space", 0x044f5): "IsConcatSpreadableProtector",
("old_space", 0x04509): "ArraySpeciesProtector",
("old_space", 0x0451d): "TypedArraySpeciesProtector",
("old_space", 0x04531): "PromiseSpeciesProtector",
("old_space", 0x04545): "RegExpSpeciesProtector",
("old_space", 0x04559): "StringLengthProtector",
("old_space", 0x0456d): "ArrayIteratorProtector",
("old_space", 0x04581): "ArrayBufferDetachingProtector",
("old_space", 0x04595): "PromiseHookProtector",
("old_space", 0x045a9): "PromiseResolveProtector",
("old_space", 0x045bd): "MapIteratorProtector",
("old_space", 0x045d1): "PromiseThenProtector",
("old_space", 0x045e5): "SetIteratorProtector",
("old_space", 0x045f9): "StringIteratorProtector",
("old_space", 0x0460d): "SingleCharacterStringCache",
("old_space", 0x04a15): "StringSplitCache",
("old_space", 0x04e1d): "RegExpMultipleCache",
("old_space", 0x05225): "BuiltinsConstantsTable",
("old_space", 0x05669): "AsyncFunctionAwaitRejectSharedFun",
("old_space", 0x0568d): "AsyncFunctionAwaitResolveSharedFun",
("old_space", 0x056b1): "AsyncGeneratorAwaitRejectSharedFun",
("old_space", 0x056d5): "AsyncGeneratorAwaitResolveSharedFun",
("old_space", 0x056f9): "AsyncGeneratorYieldResolveSharedFun",
("old_space", 0x0571d): "AsyncGeneratorReturnResolveSharedFun",
("old_space", 0x05741): "AsyncGeneratorReturnClosedRejectSharedFun",
("old_space", 0x05765): "AsyncGeneratorReturnClosedResolveSharedFun",
("old_space", 0x05789): "AsyncIteratorValueUnwrapSharedFun",
("old_space", 0x057ad): "PromiseAllResolveElementSharedFun",
("old_space", 0x057d1): "PromiseAllSettledResolveElementSharedFun",
("old_space", 0x057f5): "PromiseAllSettledRejectElementSharedFun",
("old_space", 0x05819): "PromiseAnyRejectElementSharedFun",
("old_space", 0x0583d): "PromiseCapabilityDefaultRejectSharedFun",
("old_space", 0x05861): "PromiseCapabilityDefaultResolveSharedFun",
("old_space", 0x05885): "PromiseCatchFinallySharedFun",
("old_space", 0x058a9): "PromiseGetCapabilitiesExecutorSharedFun",
("old_space", 0x058cd): "PromiseThenFinallySharedFun",
("old_space", 0x058f1): "PromiseThrowerFinallySharedFun",
("old_space", 0x05915): "PromiseValueThunkFinallySharedFun",
("old_space", 0x05939): "ProxyRevokeSharedFun",
("old_space", 0x0595d): "ShadowRealmImportValueFulfilledSFI",
("old_space", 0x05981): "SourceTextModuleExecuteAsyncModuleFulfilledSFI",
("old_space", 0x059a5): "SourceTextModuleExecuteAsyncModuleRejectedSFI",
("old_space", 0x04411): "ValueUnavailableAccessor",
("old_space", 0x04439): "WrappedFunctionLengthAccessor",
("old_space", 0x04461): "WrappedFunctionNameAccessor",
("old_space", 0x04489): "InvalidPrototypeValidityCell",
("old_space", 0x04491): "EmptyScript",
("old_space", 0x044d5): "ManyClosuresCell",
("old_space", 0x044e1): "ArrayConstructorProtector",
("old_space", 0x044f5): "NoElementsProtector",
("old_space", 0x04509): "MegaDOMProtector",
("old_space", 0x0451d): "IsConcatSpreadableProtector",
("old_space", 0x04531): "ArraySpeciesProtector",
("old_space", 0x04545): "TypedArraySpeciesProtector",
("old_space", 0x04559): "PromiseSpeciesProtector",
("old_space", 0x0456d): "RegExpSpeciesProtector",
("old_space", 0x04581): "StringLengthProtector",
("old_space", 0x04595): "ArrayIteratorProtector",
("old_space", 0x045a9): "ArrayBufferDetachingProtector",
("old_space", 0x045bd): "PromiseHookProtector",
("old_space", 0x045d1): "PromiseResolveProtector",
("old_space", 0x045e5): "MapIteratorProtector",
("old_space", 0x045f9): "PromiseThenProtector",
("old_space", 0x0460d): "SetIteratorProtector",
("old_space", 0x04621): "StringIteratorProtector",
("old_space", 0x04635): "SingleCharacterStringCache",
("old_space", 0x04a3d): "StringSplitCache",
("old_space", 0x04e45): "RegExpMultipleCache",
("old_space", 0x0524d): "BuiltinsConstantsTable",
("old_space", 0x05691): "AsyncFunctionAwaitRejectSharedFun",
("old_space", 0x056b5): "AsyncFunctionAwaitResolveSharedFun",
("old_space", 0x056d9): "AsyncGeneratorAwaitRejectSharedFun",
("old_space", 0x056fd): "AsyncGeneratorAwaitResolveSharedFun",
("old_space", 0x05721): "AsyncGeneratorYieldResolveSharedFun",
("old_space", 0x05745): "AsyncGeneratorReturnResolveSharedFun",
("old_space", 0x05769): "AsyncGeneratorReturnClosedRejectSharedFun",
("old_space", 0x0578d): "AsyncGeneratorReturnClosedResolveSharedFun",
("old_space", 0x057b1): "AsyncIteratorValueUnwrapSharedFun",
("old_space", 0x057d5): "PromiseAllResolveElementSharedFun",
("old_space", 0x057f9): "PromiseAllSettledResolveElementSharedFun",
("old_space", 0x0581d): "PromiseAllSettledRejectElementSharedFun",
("old_space", 0x05841): "PromiseAnyRejectElementSharedFun",
("old_space", 0x05865): "PromiseCapabilityDefaultRejectSharedFun",
("old_space", 0x05889): "PromiseCapabilityDefaultResolveSharedFun",
("old_space", 0x058ad): "PromiseCatchFinallySharedFun",
("old_space", 0x058d1): "PromiseGetCapabilitiesExecutorSharedFun",
("old_space", 0x058f5): "PromiseThenFinallySharedFun",
("old_space", 0x05919): "PromiseThrowerFinallySharedFun",
("old_space", 0x0593d): "PromiseValueThunkFinallySharedFun",
("old_space", 0x05961): "ProxyRevokeSharedFun",
("old_space", 0x05985): "ShadowRealmImportValueFulfilledSFI",
("old_space", 0x059a9): "SourceTextModuleExecuteAsyncModuleFulfilledSFI",
("old_space", 0x059cd): "SourceTextModuleExecuteAsyncModuleRejectedSFI",
}
# Lower 32 bits of first page addresses for various heap spaces.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment