[Temporal] Add Calendar.prototype.fields

Spec Text:
https://tc39.es/proposal-temporal/#sec-temporal.calendar.prototype.fields


Bug: v8:11544
Change-Id: I8df987ddbbf08372da637d7c4620c428fce97cae
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3534619
Reviewed-by: Leszek Swirski <leszeks@chromium.org>
Reviewed-by: Adam Klein <adamk@chromium.org>
Commit-Queue: Frank Tang <ftang@chromium.org>
Cr-Commit-Position: refs/heads/main@{#80127}
This commit is contained in:
Frank Tang 2022-04-22 13:55:55 -07:00 committed by V8 LUCI CQ
parent 3ae42771de
commit 5c3627754e
12 changed files with 224 additions and 71 deletions

View File

@ -1998,6 +1998,7 @@ filegroup(
"src/runtime/runtime-shadow-realm.cc",
"src/runtime/runtime-strings.cc",
"src/runtime/runtime-symbol.cc",
"src/runtime/runtime-temporal.cc",
"src/runtime/runtime-test.cc",
"src/runtime/runtime-trace.cc",
"src/runtime/runtime-typedarray.cc",

View File

@ -4462,6 +4462,7 @@ v8_source_set("v8_base_without_compiler") {
"src/runtime/runtime-shadow-realm.cc",
"src/runtime/runtime-strings.cc",
"src/runtime/runtime-symbol.cc",
"src/runtime/runtime-temporal.cc",
"src/runtime/runtime-test.cc",
"src/runtime/runtime-trace.cc",
"src/runtime/runtime-typedarray.cc",

View File

@ -1649,7 +1649,7 @@ namespace internal {
/* Temporal #sec-temporal.calendar.prototype.inleapyear */ \
CPP(TemporalCalendarPrototypeInLeapYear) \
/* Temporal #sec-temporal.calendar.prototype.fields */ \
CPP(TemporalCalendarPrototypeFields) \
TFJ(TemporalCalendarPrototypeFields, kJSArgcReceiverSlots, kIterable) \
/* Temporal #sec-temporal.calendar.prototype.mergefields */ \
CPP(TemporalCalendarPrototypeMergeFields) \
/* Temporal #sec-temporal.calendar.prototype.tostring */ \

View File

@ -18,11 +18,117 @@ class TemporalBuiltinsAssembler : public IteratorBuiltinsAssembler {
explicit TemporalBuiltinsAssembler(compiler::CodeAssemblerState* state)
: IteratorBuiltinsAssembler(state) {}
// Step 3 and later of #sec-temporal.calendar.prototype.fields
TNode<JSArray> CalendarFieldsArrayFromIterable(
TNode<Context> context, TNode<JSTemporalCalendar> calendar,
TNode<Object> iterable);
// For the use inside Temporal GetPossibleInstantFor
TNode<FixedArray> TemporalInstantFixedArrayFromIterable(
TNode<Context> context, TNode<Object> iterable);
};
// Step 3 and later of
// #sec-temporal.calendar.prototype.fields
TNode<JSArray> TemporalBuiltinsAssembler::CalendarFieldsArrayFromIterable(
TNode<Context> context, TNode<JSTemporalCalendar> calendar,
TNode<Object> iterable) {
Label done(this), add_fields(this, Label::kDeferred);
// 4. Let iteratorRecord be ? GetIterator(items).
// 5. Let fieldNames be a new empty List.
GrowableFixedArray field_names(state());
// 6. Repeat, while next is not false,
Iterate(
context, iterable,
[&](TNode<Object> next_value) {
// Handled by Iterate:
// a. Set next to ? IteratorStep(iteratorRecord).
// b. If next is not false, then
// i. Let nextValue be ? IteratorValue(next).
// ii. If Type(nextValue) is not String, then
Label if_isnotstringtype(this, Label::kDeferred),
if_rangeerror(this, Label::kDeferred), loop_body_end(this);
GotoIf(TaggedIsSmi(next_value), &if_isnotstringtype);
TNode<Uint16T> next_value_type = LoadInstanceType(CAST(next_value));
GotoIfNot(IsStringInstanceType(next_value_type), &if_isnotstringtype);
// Step iii and iv see IsInvalidTemporalCalendarField
// TODO(ftang) Optimize this and remove the runtime call by keeping a
// bitfield of "fields seen so far" and doing the string comparisons +
// bitfield access directly here.
GotoIf(IsTrue(CallRuntime(Runtime::kIsInvalidTemporalCalendarField,
context, next_value,
field_names.ToFixedArray())),
&if_rangeerror);
// v. Append nextValue to the end of the List fieldNames.
field_names.Push(next_value);
Goto(&loop_body_end);
// 6.b.ii
BIND(&if_isnotstringtype);
{
// 1. Let completion be ThrowCompletion(a newly created TypeError
// object).
CallRuntime(Runtime::kThrowTypeError, context,
SmiConstant(MessageTemplate::kIterableYieldedNonString),
next_value);
// 2. Return ? IteratorClose(iteratorRecord, completion). (handled by
// Iterate).
Unreachable();
}
// 6.b.ii
BIND(&if_rangeerror);
{
// 1. Let completion be ThrowCompletion(a newly created RangeError
// object).
CallRuntime(Runtime::kThrowRangeError, context,
SmiConstant(MessageTemplate::kInvalidTimeValue),
next_value);
// 2. Return ? IteratorClose(iteratorRecord, completion). (handled by
// Iterate).
Unreachable();
}
BIND(&loop_body_end);
},
{field_names.var_array(), field_names.var_length(),
field_names.var_capacity()});
{
// Step 7 and 8 of
// of #sup-temporal.calendar.prototype.fields.
// Notice this spec text is in the Chapter 15 of the #sup part not #sec
// part.
// 7. If calendar.[[Identifier]] is "iso8601", then
const TNode<Uint32T> flags =
LoadObjectField<Uint32T>(calendar, JSTemporalCalendar::kFlagsOffset);
// calendar is "iso8601" while the index of calendar is 0
const TNode<IntPtrT> index = Signed(
DecodeWordFromWord32<JSTemporalCalendar::CalendarIndexBits>(flags));
Branch(IntPtrEqual(index, IntPtrConstant(0)), &done, &add_fields);
BIND(&add_fields);
{
// Step 8.a. Let result be the result of implementation-defined processing
// of fieldNames and calendar.[[Identifier]]. We just always add "era" and
// "eraYear" for other calendar.
TNode<String> era_string = StringConstant("era");
field_names.Push(era_string);
TNode<String> eraYear_string = StringConstant("eraYear");
field_names.Push(eraYear_string);
}
Goto(&done);
}
BIND(&done);
return field_names.ToJSArray(context);
}
// #sec-iterabletolistoftype
TNode<FixedArray>
TemporalBuiltinsAssembler::TemporalInstantFixedArrayFromIterable(
@ -91,5 +197,26 @@ TF_BUILTIN(TemporalInstantFixedArrayFromIterable, TemporalBuiltinsAssembler) {
Return(TemporalInstantFixedArrayFromIterable(context, iterable));
}
// #sec-temporal.calendar.prototype.fields
TF_BUILTIN(TemporalCalendarPrototypeFields, TemporalBuiltinsAssembler) {
auto context = Parameter<Context>(Descriptor::kContext);
auto argc = UncheckedParameter<Int32T>(Descriptor::kJSActualArgumentsCount);
CodeStubArguments args(this, argc);
// 1. Let calendar be this value.
TNode<Object> receiver = args.GetReceiver();
// 2. Perform ? RequireInternalSlot(calendar,
// [[InitializedTemporalCalendar]]).
ThrowIfNotInstanceType(context, receiver, JS_TEMPORAL_CALENDAR_TYPE,
"Temporal.Calendar.prototype.fields");
TNode<JSTemporalCalendar> calendar = CAST(receiver);
// Step 3 and later is inside CalendarFieldsArrayFromIterable
TNode<Object> iterable = args.GetOptionalArgumentValue(0);
Return(CalendarFieldsArrayFromIterable(context, calendar, iterable));
}
} // namespace internal
} // namespace v8

View File

@ -317,10 +317,6 @@ TO_BE_IMPLEMENTED(TemporalCalendarPrototypeWeekOfYear)
/* Temporal #sec-temporal.calendar.prototype.tojson */
TO_BE_IMPLEMENTED(TemporalCalendarPrototypeToJSON)
// to be switch to TFJ later
/* Temporal #sec-temporal.calendar.prototype.fields */
TO_BE_IMPLEMENTED(TemporalCalendarPrototypeFields)
#ifdef V8_INTL_SUPPORT
/* Temporal */
/* Temporal #sec-temporal.calendar.prototype.era */

View File

@ -6605,5 +6605,39 @@ MaybeHandle<JSTemporalInstant> JSTemporalInstant::From(Isolate* isolate,
return ToTemporalInstant(isolate, item, method_name);
}
namespace temporal {
// Step iii and iv of #sec-temporal.calendar.prototype.fields
MaybeHandle<Oddball> IsInvalidTemporalCalendarField(
Isolate* isolate, Handle<String> next_value,
Handle<FixedArray> fields_name) {
Factory* factory = isolate->factory();
// iii. iii. If fieldNames contains nextValue, then
for (int i = 0; i < fields_name->length(); i++) {
Object item = fields_name->get(i);
CHECK(item.IsString());
if (String::Equals(isolate, next_value,
handle(String::cast(item), isolate))) {
return isolate->factory()->true_value();
}
}
// iv. If nextValue is not one of "year", "month", "monthCode", "day", "hour",
// "minute", "second", "millisecond", "microsecond", "nanosecond", then
if (!(String::Equals(isolate, next_value, factory->year_string()) ||
String::Equals(isolate, next_value, factory->month_string()) ||
String::Equals(isolate, next_value, factory->monthCode_string()) ||
String::Equals(isolate, next_value, factory->day_string()) ||
String::Equals(isolate, next_value, factory->hour_string()) ||
String::Equals(isolate, next_value, factory->minute_string()) ||
String::Equals(isolate, next_value, factory->second_string()) ||
String::Equals(isolate, next_value, factory->millisecond_string()) ||
String::Equals(isolate, next_value, factory->microsecond_string()) ||
String::Equals(isolate, next_value, factory->nanosecond_string()))) {
return isolate->factory()->true_value();
}
return isolate->factory()->false_value();
}
} // namespace temporal
} // namespace internal
} // namespace v8

View File

@ -105,7 +105,7 @@ class JSTemporalCalendar
// #sec-temporal.calendar.prototype.tostring
static MaybeHandle<String> ToString(Isolate* isolate,
Handle<JSTemporalCalendar> calendar,
const char* method);
const char* method_name);
DECL_PRINTER(JSTemporalCalendar)
@ -363,7 +363,7 @@ class JSTemporalTimeZone
// #sec-temporal.timezone.prototype.tostring
static MaybeHandle<Object> ToString(Isolate* isolate,
Handle<JSTemporalTimeZone> time_zone,
const char* method);
const char* method_name);
DECL_PRINTER(JSTemporalTimeZone)
@ -479,7 +479,7 @@ BuiltinTimeZoneGetPlainDateTimeFor(Isolate* isolate,
Handle<JSReceiver> time_zone,
Handle<JSTemporalInstant> instant,
Handle<JSReceiver> calendar,
const char* method);
const char* method_name);
V8_WARN_UNUSED_RESULT MaybeHandle<Object> InvokeCalendarMethod(
Isolate* isolate, Handle<JSReceiver> calendar, Handle<String> name,
@ -487,11 +487,14 @@ V8_WARN_UNUSED_RESULT MaybeHandle<Object> InvokeCalendarMethod(
V8_WARN_UNUSED_RESULT MaybeHandle<JSReceiver> ToTemporalCalendar(
Isolate* isolate, Handle<Object> temporal_calendar_like,
const char* method);
const char* method_name);
V8_WARN_UNUSED_RESULT MaybeHandle<JSReceiver> ToTemporalTimeZone(
Isolate* isolate, Handle<Object> temporal_time_zone_like,
const char* method);
const char* method_name);
V8_WARN_UNUSED_RESULT MaybeHandle<Oddball> IsInvalidTemporalCalendarField(
Isolate* isolate, Handle<String> string, Handle<FixedArray> field_names);
} // namespace temporal
} // namespace internal

View File

@ -0,0 +1,26 @@
// 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.
#include "src/base/bits.h"
#include "src/execution/arguments-inl.h"
#include "src/execution/isolate-inl.h"
#include "src/init/bootstrapper.h"
#include "src/logging/counters.h"
#include "src/objects/js-temporal-objects.h"
#include "src/runtime/runtime-utils.h"
namespace v8 {
namespace internal {
RUNTIME_FUNCTION(Runtime_IsInvalidTemporalCalendarField) {
HandleScope scope(isolate);
DCHECK_EQ(2, args.length());
Handle<String> s = args.at<String>(0);
Handle<FixedArray> f = args.at<FixedArray>(1);
RETURN_RESULT_OR_FAILURE(
isolate, temporal::IsInvalidTemporalCalendarField(isolate, s, f));
}
} // namespace internal
} // namespace v8

View File

@ -470,6 +470,9 @@ namespace internal {
F(SymbolDescriptiveString, 1, 1) \
F(SymbolIsPrivate, 1, 1)
#define FOR_EACH_INTRINSIC_TEMPORAL(F, I) \
F(IsInvalidTemporalCalendarField, 2, 1)
#define FOR_EACH_INTRINSIC_TEST(F, I) \
F(Abort, 1, 1) \
F(AbortCSADcheck, 1, 1) \
@ -702,6 +705,7 @@ namespace internal {
FOR_EACH_INTRINSIC_SHADOW_REALM(F, I) \
FOR_EACH_INTRINSIC_STRINGS(F, I) \
FOR_EACH_INTRINSIC_SYMBOL(F, I) \
FOR_EACH_INTRINSIC_TEMPORAL(F, I) \
FOR_EACH_INTRINSIC_TEST(F, I) \
FOR_EACH_INTRINSIC_TYPEDARRAY(F, I) \
IF_WASM(FOR_EACH_INTRINSIC_WASM, F, I) \

View File

@ -49,7 +49,6 @@
'temporal/calendar-date-from-fields': [FAIL],
'temporal/calendar-date-until': [FAIL],
'temporal/calendar-day': [FAIL],
'temporal/calendar-fields': [FAIL],
'temporal/calendar-month': [FAIL],
'temporal/calendar-month-code': [FAIL],
'temporal/calendar-month-day-from-fields': [FAIL],

View File

@ -507,33 +507,12 @@
'built-ins/Temporal/Calendar/prototype/day/infinity-throws-rangeerror': [FAIL],
'built-ins/Temporal/Calendar/prototype/day/month-day': [FAIL],
'built-ins/Temporal/Calendar/prototype/dayOfWeek/basic': [FAIL],
'built-ins/Temporal/Calendar/prototype/dayOfWeek/calendar-temporal-object': [FAIL],
'built-ins/Temporal/Calendar/prototype/dayOfWeek/infinity-throws-rangeerror': [FAIL],
'built-ins/Temporal/Calendar/prototype/dayOfYear/basic': [FAIL],
'built-ins/Temporal/Calendar/prototype/dayOfYear/calendar-temporal-object': [FAIL],
'built-ins/Temporal/Calendar/prototype/dayOfYear/infinity-throws-rangeerror': [FAIL],
'built-ins/Temporal/Calendar/prototype/daysInMonth/basic': [FAIL],
'built-ins/Temporal/Calendar/prototype/daysInMonth/calendar-temporal-object': [FAIL],
'built-ins/Temporal/Calendar/prototype/daysInMonth/infinity-throws-rangeerror': [FAIL],
'built-ins/Temporal/Calendar/prototype/daysInWeek/basic': [FAIL],
'built-ins/Temporal/Calendar/prototype/daysInWeek/calendar-temporal-object': [FAIL],
'built-ins/Temporal/Calendar/prototype/daysInWeek/infinity-throws-rangeerror': [FAIL],
'built-ins/Temporal/Calendar/prototype/daysInYear/basic': [FAIL],
'built-ins/Temporal/Calendar/prototype/daysInYear/calendar-temporal-object': [FAIL],
'built-ins/Temporal/Calendar/prototype/daysInYear/infinity-throws-rangeerror': [FAIL],
'built-ins/Temporal/Calendar/prototype/day/string': [FAIL],
'built-ins/Temporal/Calendar/prototype/day/throw-range-error-ToTemporalDate': [FAIL],
'built-ins/Temporal/Calendar/prototype/fields/argument-iterable-not-array': [FAIL],
'built-ins/Temporal/Calendar/prototype/fields/argument-throws-duplicate-keys': [FAIL],
'built-ins/Temporal/Calendar/prototype/fields/argument-throws-invalid-keys': [FAIL],
'built-ins/Temporal/Calendar/prototype/fields/branding': [FAIL],
'built-ins/Temporal/Calendar/prototype/fields/long-input': [FAIL],
'built-ins/Temporal/Calendar/prototype/fields/non-string-element-throws': [FAIL],
'built-ins/Temporal/Calendar/prototype/fields/repeated-throw': [FAIL],
'built-ins/Temporal/Calendar/prototype/fields/reverse': [FAIL],
'built-ins/Temporal/Calendar/prototype/inLeapYear/basic': [FAIL],
'built-ins/Temporal/Calendar/prototype/inLeapYear/calendar-temporal-object': [FAIL],
'built-ins/Temporal/Calendar/prototype/inLeapYear/infinity-throws-rangeerror': [FAIL],
'built-ins/Temporal/Calendar/prototype/month/argument-string-with-utc-designator': [FAIL],
'built-ins/Temporal/Calendar/prototype/month/argument-zoneddatetime-timezone-getoffsetnanosecondsfor-non-integer': [FAIL],
'built-ins/Temporal/Calendar/prototype/month/argument-zoneddatetime-timezone-getoffsetnanosecondsfor-not-callable': [FAIL],
@ -569,9 +548,6 @@
'built-ins/Temporal/Calendar/prototype/monthDayFromFields/overflow-wrong-type': [FAIL],
'built-ins/Temporal/Calendar/prototype/month/infinity-throws-rangeerror': [FAIL],
'built-ins/Temporal/Calendar/prototype/month/month-day-throw-type-error': [FAIL],
'built-ins/Temporal/Calendar/prototype/monthsInYear/basic': [FAIL],
'built-ins/Temporal/Calendar/prototype/monthsInYear/calendar-temporal-object': [FAIL],
'built-ins/Temporal/Calendar/prototype/monthsInYear/infinity-throws-rangeerror': [FAIL],
'built-ins/Temporal/Calendar/prototype/month/string': [FAIL],
'built-ins/Temporal/Calendar/prototype/month/throw-range-error-ToTemporalDate': [FAIL],
'built-ins/Temporal/Calendar/prototype/month/year-month': [FAIL],
@ -587,8 +563,6 @@
'built-ins/Temporal/Calendar/prototype/weekOfYear/cross-year': [FAIL],
'built-ins/Temporal/Calendar/prototype/weekOfYear/infinity-throws-rangeerror': [FAIL],
'built-ins/Temporal/Calendar/prototype/year/basic': [FAIL],
'built-ins/Temporal/Calendar/prototype/year/calendar-temporal-object': [FAIL],
'built-ins/Temporal/Calendar/prototype/year/infinity-throws-rangeerror': [FAIL],
'built-ins/Temporal/Calendar/prototype/yearMonthFromFields/branding': [FAIL],
'built-ins/Temporal/Calendar/prototype/yearMonthFromFields/fields-not-object': [FAIL],
'built-ins/Temporal/Calendar/prototype/yearMonthFromFields/infinity-throws-rangeerror': [FAIL],
@ -903,12 +877,9 @@
'built-ins/Temporal/PlainDate/from/argument-plaindate': [FAIL],
'built-ins/Temporal/PlainDate/from/argument-plaindatetime': [FAIL],
'built-ins/Temporal/PlainDate/from/argument-string': [FAIL],
'built-ins/Temporal/PlainDate/from/calendar-temporal-object': [FAIL],
'built-ins/Temporal/PlainDate/from/infinity-throws-rangeerror': [FAIL],
'built-ins/Temporal/PlainDate/from/limits': [FAIL],
'built-ins/Temporal/PlainDate/from/options-undefined': [FAIL],
'built-ins/Temporal/PlainDate/from/order-of-operations': [FAIL],
'built-ins/Temporal/PlainDate/from/overflow-invalid-string': [FAIL],
'built-ins/Temporal/PlainDate/from/overflow-undefined': [FAIL],
'built-ins/Temporal/PlainDate/from/overflow-wrong-type': [FAIL],
'built-ins/Temporal/PlainDate/from/subclassing-ignored': [FAIL],
@ -2231,11 +2202,6 @@
'intl402/Temporal/Calendar/prototype/dateFromFields/infinity-throws-rangeerror': [FAIL],
'intl402/Temporal/Calendar/prototype/dateUntil/argument-infinity-throws-rangeerror': [FAIL],
'intl402/Temporal/Calendar/prototype/day/infinity-throws-rangeerror': [FAIL],
'intl402/Temporal/Calendar/prototype/dayOfWeek/infinity-throws-rangeerror': [FAIL],
'intl402/Temporal/Calendar/prototype/dayOfYear/infinity-throws-rangeerror': [FAIL],
'intl402/Temporal/Calendar/prototype/daysInMonth/infinity-throws-rangeerror': [FAIL],
'intl402/Temporal/Calendar/prototype/daysInWeek/infinity-throws-rangeerror': [FAIL],
'intl402/Temporal/Calendar/prototype/daysInYear/infinity-throws-rangeerror': [FAIL],
'intl402/Temporal/Calendar/prototype/era/argument-string-with-utc-designator': [FAIL],
'intl402/Temporal/Calendar/prototype/era/argument-zoneddatetime-timezone-getoffsetnanosecondsfor-not-callable': [FAIL],
'intl402/Temporal/Calendar/prototype/era/branding': [FAIL],
@ -2246,13 +2212,10 @@
'intl402/Temporal/Calendar/prototype/eraYear/branding': [FAIL],
'intl402/Temporal/Calendar/prototype/eraYear/calendar-datefromfields-called-with-options-undefined': [FAIL],
'intl402/Temporal/Calendar/prototype/eraYear/infinity-throws-rangeerror': [FAIL],
'intl402/Temporal/Calendar/prototype/inLeapYear/infinity-throws-rangeerror': [FAIL],
'intl402/Temporal/Calendar/prototype/monthCode/infinity-throws-rangeerror': [FAIL],
'intl402/Temporal/Calendar/prototype/monthDayFromFields/infinity-throws-rangeerror': [FAIL],
'intl402/Temporal/Calendar/prototype/month/infinity-throws-rangeerror': [FAIL],
'intl402/Temporal/Calendar/prototype/monthsInYear/infinity-throws-rangeerror': [FAIL],
'intl402/Temporal/Calendar/prototype/weekOfYear/infinity-throws-rangeerror': [FAIL],
'intl402/Temporal/Calendar/prototype/year/infinity-throws-rangeerror': [FAIL],
'intl402/Temporal/Calendar/prototype/yearMonthFromFields/infinity-throws-rangeerror': [FAIL],
'intl402/Temporal/Duration/prototype/add/relativeto-infinity-throws-rangeerror': [FAIL],
'intl402/Temporal/Duration/prototype/round/relativeto-infinity-throws-rangeerror': [FAIL],
@ -2263,7 +2226,6 @@
'intl402/Temporal/Instant/prototype/toLocaleString/options-undefined': [FAIL],
'intl402/Temporal/Now/plainDateTimeISO/timezone-string-datetime': [FAIL],
'intl402/Temporal/PlainDate/compare/infinity-throws-rangeerror': [FAIL],
'intl402/Temporal/PlainDate/from/infinity-throws-rangeerror': [FAIL],
'intl402/Temporal/PlainDate/prototype/equals/infinity-throws-rangeerror': [FAIL],
'intl402/Temporal/PlainDate/prototype/since/infinity-throws-rangeerror': [FAIL],
'intl402/Temporal/PlainDate/prototype/toLocaleString/locales-undefined': [FAIL],

View File

@ -538,28 +538,28 @@ KNOWN_OBJECTS = {
("old_space", 0x04b39): "StringSplitCache",
("old_space", 0x04f41): "RegExpMultipleCache",
("old_space", 0x05349): "BuiltinsConstantsTable",
("old_space", 0x05779): "AsyncFunctionAwaitRejectSharedFun",
("old_space", 0x0579d): "AsyncFunctionAwaitResolveSharedFun",
("old_space", 0x057c1): "AsyncGeneratorAwaitRejectSharedFun",
("old_space", 0x057e5): "AsyncGeneratorAwaitResolveSharedFun",
("old_space", 0x05809): "AsyncGeneratorYieldResolveSharedFun",
("old_space", 0x0582d): "AsyncGeneratorReturnResolveSharedFun",
("old_space", 0x05851): "AsyncGeneratorReturnClosedRejectSharedFun",
("old_space", 0x05875): "AsyncGeneratorReturnClosedResolveSharedFun",
("old_space", 0x05899): "AsyncIteratorValueUnwrapSharedFun",
("old_space", 0x058bd): "PromiseAllResolveElementSharedFun",
("old_space", 0x058e1): "PromiseAllSettledResolveElementSharedFun",
("old_space", 0x05905): "PromiseAllSettledRejectElementSharedFun",
("old_space", 0x05929): "PromiseAnyRejectElementSharedFun",
("old_space", 0x0594d): "PromiseCapabilityDefaultRejectSharedFun",
("old_space", 0x05971): "PromiseCapabilityDefaultResolveSharedFun",
("old_space", 0x05995): "PromiseCatchFinallySharedFun",
("old_space", 0x059b9): "PromiseGetCapabilitiesExecutorSharedFun",
("old_space", 0x059dd): "PromiseThenFinallySharedFun",
("old_space", 0x05a01): "PromiseThrowerFinallySharedFun",
("old_space", 0x05a25): "PromiseValueThunkFinallySharedFun",
("old_space", 0x05a49): "ProxyRevokeSharedFun",
("old_space", 0x05a6d): "ShadowRealmImportValueFulfilledSFI",
("old_space", 0x0577d): "AsyncFunctionAwaitRejectSharedFun",
("old_space", 0x057a1): "AsyncFunctionAwaitResolveSharedFun",
("old_space", 0x057c5): "AsyncGeneratorAwaitRejectSharedFun",
("old_space", 0x057e9): "AsyncGeneratorAwaitResolveSharedFun",
("old_space", 0x0580d): "AsyncGeneratorYieldResolveSharedFun",
("old_space", 0x05831): "AsyncGeneratorReturnResolveSharedFun",
("old_space", 0x05855): "AsyncGeneratorReturnClosedRejectSharedFun",
("old_space", 0x05879): "AsyncGeneratorReturnClosedResolveSharedFun",
("old_space", 0x0589d): "AsyncIteratorValueUnwrapSharedFun",
("old_space", 0x058c1): "PromiseAllResolveElementSharedFun",
("old_space", 0x058e5): "PromiseAllSettledResolveElementSharedFun",
("old_space", 0x05909): "PromiseAllSettledRejectElementSharedFun",
("old_space", 0x0592d): "PromiseAnyRejectElementSharedFun",
("old_space", 0x05951): "PromiseCapabilityDefaultRejectSharedFun",
("old_space", 0x05975): "PromiseCapabilityDefaultResolveSharedFun",
("old_space", 0x05999): "PromiseCatchFinallySharedFun",
("old_space", 0x059bd): "PromiseGetCapabilitiesExecutorSharedFun",
("old_space", 0x059e1): "PromiseThenFinallySharedFun",
("old_space", 0x05a05): "PromiseThrowerFinallySharedFun",
("old_space", 0x05a29): "PromiseValueThunkFinallySharedFun",
("old_space", 0x05a4d): "ProxyRevokeSharedFun",
("old_space", 0x05a71): "ShadowRealmImportValueFulfilledSFI",
}
# Lower 32 bits of first page addresses for various heap spaces.