Skip to content

Commit

Permalink
polyfill: update TimeZoneFrom and CalendarFrom
Browse files Browse the repository at this point in the history
  • Loading branch information
ryzokuken committed Mar 8, 2021
1 parent 7cf1acb commit 955c9d2
Show file tree
Hide file tree
Showing 6 changed files with 53 additions and 57 deletions.
18 changes: 2 additions & 16 deletions polyfill/lib/calendar.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -153,21 +153,7 @@ export class Calendar {
return ES.ToString(this);
}
static from(item) {
if (ES.Type(item) === 'Object') {
if (!('calendar' in item)) return item;
item = item.calendar;
if (ES.Type(item) === 'Object' && !('calendar' in item)) return item;
}
const stringIdent = ES.ToString(item);
if (IsBuiltinCalendar(stringIdent)) return new Calendar(stringIdent);
let calendar;
try {
({ calendar } = ES.ParseISODateTime(stringIdent, { zoneRequired: false }));
} catch {
throw new RangeError(`Invalid calendar: ${stringIdent}`);
}
if (!calendar) calendar = 'iso8601';
return new Calendar(calendar);
return ES.CalendarFrom(item, this);
}
}

Expand Down Expand Up @@ -2000,6 +1986,6 @@ impl['gregory'] = ObjectAssign({}, nonIsoGeneralImpl, { helper: helperGregory })

const BUILTIN_CALENDAR_IDS = Object.keys(impl);

function IsBuiltinCalendar(id) {
export function IsBuiltinCalendar(id) {
return ArrayIncludes.call(BUILTIN_CALENDAR_IDS, id);
}
51 changes: 29 additions & 22 deletions polyfill/lib/ecmascript.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ import {
MICROSECONDS,
NANOSECONDS
} from './slots.mjs';
import { IsBuiltinCalendar } from './calendar.mjs';

const DAYMILLIS = 86400000;
const NS_MIN = bigInt(-86400).multiply(1e17);
Expand Down Expand Up @@ -1481,7 +1482,7 @@ export const ES = ObjectAssign({}, ES2020, {
calendar
} = ES.ParseTemporalZonedDateTimeString(ES.ToString(item)));
if (!ianaName) throw new RangeError('time zone ID required in brackets');
timeZone = ES.TimeZoneFrom(ianaName);
timeZone = ES.TimeZoneFrom(ianaName, GetIntrinsic('%Temporal.TimeZone%'));
if (!calendar) calendar = ES.GetISO8601Calendar();
calendar = ES.ToTemporalCalendar(calendar);
}
Expand Down Expand Up @@ -1513,18 +1514,22 @@ export const ES = ObjectAssign({}, ES2020, {
const TemporalCalendar = GetIntrinsic('%Temporal.Calendar%');
return new TemporalCalendar('iso8601');
},
CalendarFrom: (calendarLike) => {
const TemporalCalendar = GetIntrinsic('%Temporal.Calendar%');
// let from = TemporalCalendar.from;
// if (from === undefined) {
// from = GetIntrinsic('%Temporal.Calendar.from%');
// }
const from = GetIntrinsic('%Temporal.Calendar.from%');
const calendar = ES.Call(from, TemporalCalendar, [calendarLike]);
if (ES.Type(calendar) !== 'Object') {
throw new TypeError('Temporal.Calendar.from should return an object');
CalendarFrom: (item, constructor) => {
if (ES.Type(item) === 'Object') {
if (!('calendar' in item)) return item;
item = item.calendar;
if (ES.Type(item) === 'Object' && !('calendar' in item)) return item;
}
const stringIdent = ES.ToString(item);
if (IsBuiltinCalendar(stringIdent)) return new constructor(stringIdent);
let calendar;
try {
({ calendar } = ES.ParseISODateTime(stringIdent, { zoneRequired: false }));
} catch {
throw new RangeError(`Invalid calendar: ${stringIdent}`);
}
return calendar;
if (!calendar) calendar = 'iso8601';
return new constructor(calendar);
},
CalendarFields: (calendar, fieldNames) => {
const fields = ES.GetMethod(calendar, 'fields');
Expand Down Expand Up @@ -1634,7 +1639,7 @@ export const ES = ObjectAssign({}, ES2020, {
return calendarLike;
}
const identifier = ES.ToString(calendarLike);
return ES.CalendarFrom(identifier);
return ES.CalendarFrom(identifier, GetIntrinsic('%Temporal.Calendar%'));
},
CalendarCompare: (one, two) => {
const cal1 = ES.ToString(one);
Expand Down Expand Up @@ -1675,21 +1680,23 @@ export const ES = ObjectAssign({}, ES2020, {
if (!ES.IsTemporalMonthDay(result)) throw new TypeError('invalid result');
return result;
},
TimeZoneFrom: (temporalTimeZoneLike) => {
const TemporalTimeZone = GetIntrinsic('%Temporal.TimeZone%');
// let from = TemporalTimeZone.from;
// if (from === undefined) {
// from = GetIntrinsic('%Temporal.TimeZone.from%');
// }
const from = GetIntrinsic('%Temporal.TimeZone.from%');
return ES.Call(from, TemporalTimeZone, [temporalTimeZoneLike]);
TimeZoneFrom: (item, constructor) => {
if (ES.Type(item) === 'Object') {
if (!('timeZone' in item)) return item;
item = item.timeZone;
if (ES.Type(item) === 'Object' && !('timeZone' in item)) return item;
}
const timeZone = ES.TemporalTimeZoneFromString(ES.ToString(item));
const result = new constructor(timeZone);
if (!ES.IsTemporalTimeZone(result)) throw new TypeError('invalid result');
return result;
},
ToTemporalTimeZone: (temporalTimeZoneLike) => {
if (ES.Type(temporalTimeZoneLike) === 'Object') {
return temporalTimeZoneLike;
}
const identifier = ES.ToString(temporalTimeZoneLike);
return ES.TimeZoneFrom(identifier);
return ES.TimeZoneFrom(identifier, GetIntrinsic('%Temporal.TimeZone%'));
},
TimeZoneCompare: (one, two) => {
const tz1 = ES.ToString(one);
Expand Down
11 changes: 1 addition & 10 deletions polyfill/lib/timezone.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -143,18 +143,9 @@ export class TimeZone {
return ES.ToString(this);
}
static from(item) {
if (ES.Type(item) === 'Object') {
if (!('timeZone' in item)) return item;
item = item.timeZone;
if (ES.Type(item) === 'Object' && !('timeZone' in item)) return item;
}
const timeZone = ES.TemporalTimeZoneFromString(ES.ToString(item));
const result = new this(timeZone);
if (!ES.IsTemporalTimeZone(result)) throw new TypeError('invalid result');
return result;
return ES.TimeZoneFrom(item, this);
}
}

MakeIntrinsicClass(TimeZone, 'Temporal.TimeZone');
DefineIntrinsic('Temporal.TimeZone.from', TimeZone.from);
DefineIntrinsic('Temporal.TimeZone.prototype.getOffsetNanosecondsFor', TimeZone.prototype.getOffsetNanosecondsFor);
20 changes: 16 additions & 4 deletions spec/calendar.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,17 @@ <h1>Temporal.Calendar Objects</h1>
<emu-clause id="sec-temporal-calendar-abstract-ops">
<h1>Abstract Operations for Temporal.Calendar Objects</h1>

<emu-clause id="sec-temporal-createtemporalcalendarfromstatic" aoid="CreateTemporalCalendarFromStatic">
<h1>CreateTemporalCalendarFromStatic ( _constructor_, _identifier_ )</h1>
<emu-alg>
1. Assert: ! IsBuiltinCalendar(_identifier_) is *true*.
1. If ! IsConstructor(_constructor_) is *false*, throw a *TypeError* exception.
1. Let _result_ be ? Construct(_constructor_, « _identifier_ »).
1. Perform ? RequireInternalSlot(_result_, [[InitializedTemporalCalendar]]).
1. Return _result_.
</emu-alg>
</emu-clause>

<emu-clause id="sec-temporal-isbuiltincalendar" aoid="IsBuiltinCalendar">
<h1>IsBuiltinCalendar ( _id_ )</h1>
<p>
Expand Down Expand Up @@ -228,7 +239,7 @@ <h1>ToTemporalCalendar ( _temporalCalendarLike_ )</h1>
1. If Type(_temporalCalendarLike_) is Object, then
1. Return _temporalCalendarLike_.
1. Let _identifier_ be ? ToString(_temporalCalendarLike_).
1. Return ? CalendarFrom(_identifier_).
1. Return ? CalendarFrom(_identifier_, %Temporal.Calendar%).
</emu-alg>
</emu-clause>

Expand Down Expand Up @@ -258,7 +269,7 @@ <h1>GetOptionalTemporalCalendar ( _item_ )</h1>
</emu-clause>

<emu-clause id="sec-temporal-calendarfrom" aoid="CalendarFrom">
<h1>CalendarFrom ( _identifier_ )</h1>
<h1>CalendarFrom ( _identifier_, _constructor_ )</h1>
<emu-alg>
1. If Type(_item_) is Object, then
1. If ? HasProperty(_item_, *"calendar"*) is *false*, return _item_.
Expand All @@ -267,7 +278,7 @@ <h1>CalendarFrom ( _identifier_ )</h1>
1. Let _string_ be ? ToString(_item_).
1. If ! IsBuiltinCalendar(_string_) is *false*, then
1. Let _string_ be ? ParseTemporalCalendarString(_string_).
1. Return ? GetBuiltinCalendar(_string_).
1. Return ? CreateTemporalCalendarFromStatic(_constructor_, _string_).
</emu-alg>
</emu-clause>

Expand Down Expand Up @@ -663,7 +674,8 @@ <h1>Temporal.Calendar.from ( _item_ )</h1>
The following steps are taken:
</p>
<emu-alg>
1. Return ? CalendarFrom(_item_).
1. Let _constructor_ be the *this* value.
1. Return ? CalendarFrom(_item_, _constructor_).
</emu-alg>
</emu-clause>
</emu-clause>
Expand Down
8 changes: 4 additions & 4 deletions spec/timezone.html
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,8 @@ <h1>Temporal.TimeZone.from ( _item_ )</h1>
The following steps are taken:
</p>
<emu-alg>
1. Return ? TimeZoneFrom(_item_).
1. Let _constructor_ be the *this* value.
1. Return ? TimeZoneFrom(_item_, _constructor_).
</emu-alg>
</emu-clause>
</emu-clause>
Expand Down Expand Up @@ -561,20 +562,19 @@ <h1>ToTemporalTimeZone ( _temporalTimeZoneLike_ )</h1>
<emu-alg>
1. If Type(_temporalTimeZoneLike_) is Object, return _temporalTimeZoneLike_.
1. Let _identifier_ be ? ToString(_temporalTimeZoneLike_).
1. Return ? TimeZoneFrom(_identifier_).
1. Return ? TimeZoneFrom(_identifier_, %Temporal.TimeZone%).
</emu-alg>
</emu-clause>

<emu-clause id="sec-temporal-timezonefrom" aoid="TimeZoneFrom">
<h1>TimeZoneFrom ( _identifier_ )</h1>
<h1>TimeZoneFrom ( _identifier_, _constructor_ )</h1>
<emu-alg>
1. If Type(_item_) is Object, then
1. If ? HasProperty(_item_, *"timeZone"*) is *false*, return _item_.
1. Set _item_ to ? Get(_item_, *"timeZone"*).
1. If Type(_item_) is Object and ? HasProperty(_item_, *"timeZone"*) is *false*, return _item_.
1. Let _string_ be ? ToString(_item_).
1. Let _result_ be ? ParseTemporalTimeZone(_string_).
1. Let _constructor_ be the *this* value.
1. Return ? CreateTemporalTimeZoneFromStatic(_constructor_, _result_).
</emu-alg>
</emu-clause>
Expand Down
2 changes: 1 addition & 1 deletion spec/zoneddatetime.html
Original file line number Diff line number Diff line change
Expand Up @@ -1139,7 +1139,7 @@ <h1>ToTemporalZonedDateTime ( _item_ [ , _constructor_ [ , _options_ ] ] )</h1>
1. Let _string_ be ? ToString(_item_).
1. Let _result_ be ? ParseTemporalZonedDateTimeString(_string_).
1. If _result_.[[TimeZoneName]] is *undefined*, throw a *RangeError* exception.
1. Let _timeZone_ be ? TimeZoneFrom(_result_.[[TimeZoneName]]).
1. Let _timeZone_ be ? TimeZoneFrom(_result_.[[TimeZoneName]], %Temporal.TimeZone%).
1. Let _offsetString_ be _result_.[[TimeZoneOffsetString]].
1. Let _calendar_ be ? ToOptionalTemporalCalendar(_result_.[[Calendar]]).
1. Let _offsetNanoseconds_ be ? ParseTimeZoneOffsetString(_offsetString_).
Expand Down

0 comments on commit 955c9d2

Please sign in to comment.