[JSC] Fix Temporal regulateTime's constraints for milliseconds, microseconds, and nanoseconds
https://bugs.webkit.org/show_bug.cgi?id=241818
rdar://95534859

Reviewed by Ross Kirsling.

This patch fixes constraints for milliseconds, microseconds, and nanoseconds in constrainTime.
It should be from 0 to 999, not to 1000[1].

[1]: https://tc39.es/proposal-temporal/#sec-temporal-constraintime

* JSTests/stress/temporal-plaintime-tostring-1000-millisecond.js: Added.
(shouldBe):
(throw.new.Error):
* Source/JavaScriptCore/runtime/TemporalPlainTime.cpp:
(JSC::constrainTime):

Canonical link: https://commits.webkit.org/251698@main


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@295693 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/JSTests/stress/temporal-plaintime-tostring-1000-millisecond.js b/JSTests/stress/temporal-plaintime-tostring-1000-millisecond.js
new file mode 100644
index 0000000..e5f5a81
--- /dev/null
+++ b/JSTests/stress/temporal-plaintime-tostring-1000-millisecond.js
@@ -0,0 +1,43 @@
+//@ requireOptions("--useTemporal=1")
+
+function shouldBe(actual, expected) {
+    if (actual !== expected)
+        throw new Error('bad value: ' + actual);
+}
+
+{
+    let data = Temporal.PlainTime.from({
+      hour: 0,
+      minute: 0,
+      second: 0,
+      millisecond: 1000,
+      microsecond: 0,
+      nanosecond: 0,
+    }).toString();
+
+    shouldBe(data, `00:00:00.999`);
+}
+{
+    let data = Temporal.PlainTime.from({
+      hour: 0,
+      minute: 0,
+      second: 0,
+      millisecond: 0,
+      microsecond: 1000,
+      nanosecond: 0,
+    }).toString();
+
+    shouldBe(data, `00:00:00.000999`);
+}
+{
+    let data = Temporal.PlainTime.from({
+      hour: 0,
+      minute: 0,
+      second: 0,
+      millisecond: 0,
+      microsecond: 0,
+      nanosecond: 1000,
+    }).toString();
+
+    shouldBe(data, `00:00:00.000000999`);
+}
diff --git a/Source/JavaScriptCore/runtime/TemporalPlainTime.cpp b/Source/JavaScriptCore/runtime/TemporalPlainTime.cpp
index 223d648..d9ea7f0 100644
--- a/Source/JavaScriptCore/runtime/TemporalPlainTime.cpp
+++ b/Source/JavaScriptCore/runtime/TemporalPlainTime.cpp
@@ -375,9 +375,9 @@
         constrainToRange(duration.hours(), 0, 23),
         constrainToRange(duration.minutes(), 0, 59),
         constrainToRange(duration.seconds(), 0, 59),
-        constrainToRange(duration.milliseconds(), 0, 1000),
-        constrainToRange(duration.microseconds(), 0, 1000),
-        constrainToRange(duration.nanoseconds(), 0, 1000));
+        constrainToRange(duration.milliseconds(), 0, 999),
+        constrainToRange(duration.microseconds(), 0, 999),
+        constrainToRange(duration.nanoseconds(), 0, 999));
 }
 
 static ISO8601::PlainTime regulateTime(JSGlobalObject* globalObject, ISO8601::Duration&& duration, TemporalOverflow overflow)