Skip to content

Commit ee586f8

Browse files
committed
ToTemporal*() operations should canonicalize the calendar ID.
1 parent 731e7ca commit ee586f8

File tree

5 files changed

+40
-29
lines changed

5 files changed

+40
-29
lines changed

graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/nodes/temporal/ToRelativeTemporalObjectNode.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
import com.oracle.truffle.js.runtime.Errors;
6262
import com.oracle.truffle.js.runtime.JSContext;
6363
import com.oracle.truffle.js.runtime.JSRealm;
64+
import com.oracle.truffle.js.runtime.Strings;
6465
import com.oracle.truffle.js.runtime.builtins.temporal.JSTemporalDateTimeRecord;
6566
import com.oracle.truffle.js.runtime.builtins.temporal.JSTemporalParserRecord;
6667
import com.oracle.truffle.js.runtime.builtins.temporal.JSTemporalPlainDate;
@@ -71,8 +72,8 @@
7172
import com.oracle.truffle.js.runtime.builtins.temporal.ParseISODateTimeResult;
7273
import com.oracle.truffle.js.runtime.objects.JSDynamicObject;
7374
import com.oracle.truffle.js.runtime.objects.Undefined;
75+
import com.oracle.truffle.js.runtime.util.IntlUtil;
7476
import com.oracle.truffle.js.runtime.util.TemporalConstants;
75-
import com.oracle.truffle.js.runtime.util.TemporalErrors;
7677
import com.oracle.truffle.js.runtime.util.TemporalUtil;
7778

7879
/**
@@ -110,7 +111,9 @@ protected Result toRelativeTemporalObject(JSDynamicObject options,
110111
@Cached IsObjectNode isObjectNode,
111112
@Cached TemporalCalendarDateFromFieldsNode dateFromFieldsNode,
112113
@Cached ToTemporalTimeZoneIdentifierNode toTimeZoneIdentifier,
113-
@Cached GetTemporalCalendarIdentifierWithISODefaultNode getTemporalCalendarWithISODefaultNode) {
114+
@Cached GetTemporalCalendarIdentifierWithISODefaultNode getTemporalCalendarWithISODefaultNode,
115+
@Cached TruffleString.ToJavaStringNode toJavaString,
116+
@Cached TruffleString.FromJavaStringNode fromJavaString) {
114117
Object value = getRelativeToNode.getValue(options);
115118
if (valueIsUndefined.profile(this, value == Undefined.instance)) {
116119
return none();
@@ -177,10 +180,9 @@ protected Result toRelativeTemporalObject(JSDynamicObject options,
177180
calendar = result.getCalendar();
178181
if (calendar == null) {
179182
calendar = TemporalConstants.ISO8601;
180-
}
181-
if (!TemporalUtil.isBuiltinCalendar(calendar)) {
182-
errorBranch.enter(this);
183-
throw TemporalErrors.createRangeErrorCalendarNotSupported();
183+
} else {
184+
String calendarJLS = toJavaString.execute(calendar);
185+
calendar = Strings.fromJavaString(fromJavaString, IntlUtil.canonicalizeCalendar(calendarJLS));
184186
}
185187
} else {
186188
errorBranch.enter(this);

graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/nodes/temporal/ToTemporalDateNode.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
import com.oracle.truffle.js.runtime.Errors;
5454
import com.oracle.truffle.js.runtime.JSContext;
5555
import com.oracle.truffle.js.runtime.JSRealm;
56+
import com.oracle.truffle.js.runtime.Strings;
5657
import com.oracle.truffle.js.runtime.builtins.temporal.JSTemporalDateTimeRecord;
5758
import com.oracle.truffle.js.runtime.builtins.temporal.JSTemporalInstant;
5859
import com.oracle.truffle.js.runtime.builtins.temporal.JSTemporalPlainDate;
@@ -63,8 +64,8 @@
6364
import com.oracle.truffle.js.runtime.builtins.temporal.JSTemporalZonedDateTimeObject;
6465
import com.oracle.truffle.js.runtime.objects.JSDynamicObject;
6566
import com.oracle.truffle.js.runtime.objects.Undefined;
67+
import com.oracle.truffle.js.runtime.util.IntlUtil;
6668
import com.oracle.truffle.js.runtime.util.TemporalConstants;
67-
import com.oracle.truffle.js.runtime.util.TemporalErrors;
6869
import com.oracle.truffle.js.runtime.util.TemporalUtil;
6970

7071
/**
@@ -92,7 +93,9 @@ public JSTemporalPlainDateObject toTemporalDate(Object itemParam, Object options
9293
@Cached("create(getJSContext())") GetOptionsObjectNode getOptionsObject,
9394
@Cached TemporalGetOptionNode getOptionNode,
9495
@Cached GetTemporalCalendarIdentifierWithISODefaultNode getCalendarWithISODefault,
95-
@Cached TemporalCalendarDateFromFieldsNode dateFromFieldsNode) {
96+
@Cached TemporalCalendarDateFromFieldsNode dateFromFieldsNode,
97+
@Cached TruffleString.ToJavaStringNode toJavaString,
98+
@Cached TruffleString.FromJavaStringNode fromJavaString) {
9699
JSContext ctx = getLanguage().getJSContext();
97100
JSRealm realm = getRealm();
98101
if (isObjectProfile.profile(this, isObjectNode.executeBoolean(itemParam))) {
@@ -128,9 +131,9 @@ public JSTemporalPlainDateObject toTemporalDate(Object itemParam, Object options
128131
TruffleString calendar = result.getCalendar();
129132
if (calendar == null) {
130133
calendar = TemporalConstants.ISO8601;
131-
} else if (!TemporalUtil.isBuiltinCalendar(calendar)) {
132-
errorBranch.enter(this);
133-
throw TemporalErrors.createRangeErrorCalendarNotSupported();
134+
} else {
135+
String calendarJLS = toJavaString.execute(calendar);
136+
calendar = Strings.fromJavaString(fromJavaString, IntlUtil.canonicalizeCalendar(calendarJLS));
134137
}
135138
TemporalUtil.toTemporalOverflow(options, getOptionNode);
136139
return JSTemporalPlainDate.create(ctx, realm, result.getYear(), result.getMonth(), result.getDay(), calendar, this, errorBranch);

graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/nodes/temporal/ToTemporalDateTimeNode.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,16 @@
5555
import com.oracle.truffle.js.runtime.Errors;
5656
import com.oracle.truffle.js.runtime.JSContext;
5757
import com.oracle.truffle.js.runtime.JSRealm;
58+
import com.oracle.truffle.js.runtime.Strings;
5859
import com.oracle.truffle.js.runtime.builtins.temporal.JSTemporalDateTimeRecord;
5960
import com.oracle.truffle.js.runtime.builtins.temporal.JSTemporalInstant;
6061
import com.oracle.truffle.js.runtime.builtins.temporal.JSTemporalPlainDateObject;
6162
import com.oracle.truffle.js.runtime.builtins.temporal.JSTemporalPlainDateTime;
6263
import com.oracle.truffle.js.runtime.builtins.temporal.JSTemporalPlainDateTimeObject;
6364
import com.oracle.truffle.js.runtime.builtins.temporal.JSTemporalZonedDateTimeObject;
6465
import com.oracle.truffle.js.runtime.objects.JSDynamicObject;
66+
import com.oracle.truffle.js.runtime.util.IntlUtil;
6567
import com.oracle.truffle.js.runtime.util.TemporalConstants;
66-
import com.oracle.truffle.js.runtime.util.TemporalErrors;
6768
import com.oracle.truffle.js.runtime.util.TemporalUtil;
6869

6970
/**
@@ -87,7 +88,9 @@ public JSTemporalPlainDateTimeObject toTemporalDateTime(Object item, Object opti
8788
@Cached("create(getJSContext())") GetOptionsObjectNode getOptionsNode,
8889
@Cached GetTemporalCalendarIdentifierWithISODefaultNode getTemporalCalendarNode,
8990
@Cached TemporalGetOptionNode getOptionNode,
90-
@Cached TemporalCalendarDateFromFieldsNode dateFromFieldsNode) {
91+
@Cached TemporalCalendarDateFromFieldsNode dateFromFieldsNode,
92+
@Cached TruffleString.ToJavaStringNode toJavaString,
93+
@Cached TruffleString.FromJavaStringNode fromJavaString) {
9194
JSTemporalDateTimeRecord result;
9295
TruffleString calendar;
9396
JSContext ctx = getLanguage().getJSContext();
@@ -130,10 +133,9 @@ public JSTemporalPlainDateTimeObject toTemporalDateTime(Object item, Object opti
130133
calendar = result.getCalendar();
131134
if (calendar == null) {
132135
calendar = TemporalConstants.ISO8601;
133-
}
134-
if (!TemporalUtil.isBuiltinCalendar(calendar)) {
135-
errorBranch.enter(this);
136-
throw TemporalErrors.createRangeErrorCalendarNotSupported();
136+
} else {
137+
String calendarJLS = toJavaString.execute(calendar);
138+
calendar = Strings.fromJavaString(fromJavaString, IntlUtil.canonicalizeCalendar(calendarJLS));
137139
}
138140
Object resolvedOptions = getOptionsNode.execute(options);
139141
TemporalUtil.toTemporalOverflow(resolvedOptions, getOptionNode);

graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/nodes/temporal/ToTemporalYearMonthNode.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,13 @@
5151
import com.oracle.truffle.js.nodes.access.IsObjectNode;
5252
import com.oracle.truffle.js.nodes.intl.GetOptionsObjectNode;
5353
import com.oracle.truffle.js.runtime.Errors;
54+
import com.oracle.truffle.js.runtime.Strings;
5455
import com.oracle.truffle.js.runtime.builtins.temporal.JSTemporalDateTimeRecord;
5556
import com.oracle.truffle.js.runtime.builtins.temporal.JSTemporalPlainYearMonth;
5657
import com.oracle.truffle.js.runtime.builtins.temporal.JSTemporalPlainYearMonthObject;
5758
import com.oracle.truffle.js.runtime.objects.JSDynamicObject;
59+
import com.oracle.truffle.js.runtime.util.IntlUtil;
5860
import com.oracle.truffle.js.runtime.util.TemporalConstants;
59-
import com.oracle.truffle.js.runtime.util.TemporalErrors;
6061
import com.oracle.truffle.js.runtime.util.TemporalUtil;
6162

6263
/**
@@ -77,7 +78,9 @@ public JSTemporalPlainYearMonthObject toTemporalYearMonth(Object item, Object op
7778
@Cached IsObjectNode isObjectNode,
7879
@Cached TemporalGetOptionNode getOptionNode,
7980
@Cached GetTemporalCalendarIdentifierWithISODefaultNode getCalendarWithISODefault,
80-
@Cached TemporalYearMonthFromFieldsNode yearMonthFromFieldsNode) {
81+
@Cached TemporalYearMonthFromFieldsNode yearMonthFromFieldsNode,
82+
@Cached TruffleString.ToJavaStringNode toJavaString,
83+
@Cached TruffleString.FromJavaStringNode fromJavaString) {
8184
Object options = optionsParam;
8285
if (isObjectProfile.profile(this, isObjectNode.executeBoolean(item))) {
8386
if (item instanceof JSTemporalPlainYearMonthObject yearMonth) {
@@ -96,10 +99,9 @@ public JSTemporalPlainYearMonthObject toTemporalYearMonth(Object item, Object op
9699
TruffleString calendar = result.getCalendar();
97100
if (calendar == null) {
98101
calendar = TemporalConstants.ISO8601;
99-
}
100-
if (!TemporalUtil.isBuiltinCalendar(calendar)) {
101-
errorBranch.enter(this);
102-
throw TemporalErrors.createRangeErrorCalendarNotSupported();
102+
} else {
103+
String calendarJLS = toJavaString.execute(calendar);
104+
calendar = Strings.fromJavaString(fromJavaString, IntlUtil.canonicalizeCalendar(calendarJLS));
103105
}
104106
Object resolvedOptions = getOptionsObject.execute(options);
105107
TemporalUtil.Overflow overflow = TemporalUtil.getTemporalOverflowOption(resolvedOptions, getOptionNode);

graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/nodes/temporal/ToTemporalZonedDateTimeNode.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
import com.oracle.truffle.js.runtime.Errors;
6161
import com.oracle.truffle.js.runtime.JSContext;
6262
import com.oracle.truffle.js.runtime.JSRealm;
63+
import com.oracle.truffle.js.runtime.Strings;
6364
import com.oracle.truffle.js.runtime.builtins.temporal.JSTemporalDateTimeRecord;
6465
import com.oracle.truffle.js.runtime.builtins.temporal.JSTemporalParserRecord;
6566
import com.oracle.truffle.js.runtime.builtins.temporal.JSTemporalZonedDateTime;
@@ -68,8 +69,8 @@
6869
import com.oracle.truffle.js.runtime.objects.JSDynamicObject;
6970
import com.oracle.truffle.js.runtime.objects.JSObject;
7071
import com.oracle.truffle.js.runtime.objects.Undefined;
72+
import com.oracle.truffle.js.runtime.util.IntlUtil;
7173
import com.oracle.truffle.js.runtime.util.TemporalConstants;
72-
import com.oracle.truffle.js.runtime.util.TemporalErrors;
7374
import com.oracle.truffle.js.runtime.util.TemporalUtil;
7475
import com.oracle.truffle.js.runtime.util.TemporalUtil.MatchBehaviour;
7576
import com.oracle.truffle.js.runtime.util.TemporalUtil.OffsetBehaviour;
@@ -96,7 +97,9 @@ public JSTemporalZonedDateTimeObject toTemporalZonedDateTime(Object item, Object
9697
@Cached TemporalGetOptionNode getOptionNode,
9798
@Cached ToTemporalTimeZoneIdentifierNode toTimeZoneIdentifier,
9899
@Cached GetTemporalCalendarIdentifierWithISODefaultNode getCalendarWithISODefault,
99-
@Cached TemporalCalendarDateFromFieldsNode dateFromFieldsNode) {
100+
@Cached TemporalCalendarDateFromFieldsNode dateFromFieldsNode,
101+
@Cached TruffleString.ToJavaStringNode toJavaString,
102+
@Cached TruffleString.FromJavaStringNode fromJavaString) {
100103
JSTemporalDateTimeRecord result;
101104
TruffleString offsetString = null;
102105
TruffleString timeZone;
@@ -151,10 +154,9 @@ public JSTemporalZonedDateTimeObject toTemporalZonedDateTime(Object item, Object
151154
calendar = result.getCalendar();
152155
if (calendar == null) {
153156
calendar = TemporalConstants.ISO8601;
154-
}
155-
if (!TemporalUtil.isBuiltinCalendar(calendar)) {
156-
errorBranch.enter(this);
157-
throw TemporalErrors.createRangeErrorCalendarNotSupported();
157+
} else {
158+
String calendarJLS = toJavaString.execute(calendar);
159+
calendar = Strings.fromJavaString(fromJavaString, IntlUtil.canonicalizeCalendar(calendarJLS));
158160
}
159161
matchBehaviour = MatchBehaviour.MATCH_MINUTES;
160162
if (offsetString != null) {

0 commit comments

Comments
 (0)