diff --git a/spec/datetimeformat.html b/spec/datetimeformat.html
index bbbbd0c0..b6a85758 100644
--- a/spec/datetimeformat.html
+++ b/spec/datetimeformat.html
@@ -761,7 +761,7 @@
1. If _options_ is *undefined*, let _options_ be *null*; otherwise let _options_ be ? ToObject(_options_).
- 1. Let _options_ be OrdinaryObjectCreate(_options_).
+ 1. Let _options_ be ! OrdinaryObjectCreate(_options_).
1. Let _needDefaults_ be *true*.
1. If _required_ is *"date"* or *"any"*, then
1. For each property name _prop_ of « *"weekday"*, *"year"*, *"month"*, *"day"* », do
@@ -920,16 +920,16 @@ FormatDateTimePattern ( _dateTimeFormat_, _patternParts_, _x_, _rangeFormatO
1. Let _x_ be TimeClip(_x_).
1. If _x_ is *NaN*, throw a *RangeError* exception.
1. Let _locale_ be _dateTimeFormat_.[[Locale]].
- 1. Let _nfOptions_ be OrdinaryObjectCreate(*null*).
+ 1. Let _nfOptions_ be ! OrdinaryObjectCreate(*null*).
1. Perform ! CreateDataPropertyOrThrow(_nfOptions_, *"useGrouping"*, *false*).
1. Let _nf_ be ? Construct(%NumberFormat%, « _locale_, _nfOptions_ »).
- 1. Let _nf2Options_ be OrdinaryObjectCreate(*null*).
+ 1. Let _nf2Options_ be ! OrdinaryObjectCreate(*null*).
1. Perform ! CreateDataPropertyOrThrow(_nf2Options_, *"minimumIntegerDigits"*, 2).
1. Perform ! CreateDataPropertyOrThrow(_nf2Options_, *"useGrouping"*, *false*).
1. Let _nf2_ be ? Construct(%NumberFormat%, « _locale_, _nf2Options_ »).
1. Let _fractionalSecondDigits_ be _dateTimeFormat_.[[FractionalSecondDigits]].
1. If _fractionalSecondDigits_ is not *undefined*, then
- 1. Let _nf3Options_ be OrdinaryObjectCreate(*null*).
+ 1. Let _nf3Options_ be ! OrdinaryObjectCreate(*null*).
1. Perform ! CreateDataPropertyOrThrow(_nf3Options_, *"minimumIntegerDigits"*, _fractionalSecondDigits_).
1. Perform ! CreateDataPropertyOrThrow(_nf3Options_, *"useGrouping"*, *false*).
1. Let _nf3_ be ? Construct(%NumberFormat%, « _locale_, _nf3Options_ »).
@@ -1040,10 +1040,10 @@ FormatDateTimeToParts ( _dateTimeFormat_, _x_ )
1. Let _parts_ be ? PartitionDateTimePattern(_dateTimeFormat_, _x_).
- 1. Let _result_ be ArrayCreate(0).
+ 1. Let _result_ be ! ArrayCreate(0).
1. Let _n_ be 0.
1. For each Record { [[Type]], [[Value]] } _part_ in _parts_, do
- 1. Let _O_ be OrdinaryObjectCreate(%Object.prototype%).
+ 1. Let _O_ be ! OrdinaryObjectCreate(%Object.prototype%).
1. Perform ! CreateDataPropertyOrThrow(_O_, *"type"*, _part_.[[Type]]).
1. Perform ! CreateDataPropertyOrThrow(_O_, *"value"*, _part_.[[Value]]).
1. Perform ! CreateDataProperty(_result_, ! ToString(_n_), _O_).
@@ -1153,10 +1153,10 @@ FormatDateTimeRangeToParts ( _dateTimeFormat_, _x_, _y_ )
1. Let _parts_ be ? PartitionDateTimeRangePattern(_dateTimeFormat_, _x_, _y_).
- 1. Let _result_ be ArrayCreate(0).
+ 1. Let _result_ be ! ArrayCreate(0).
1. Let _n_ be 0.
1. For each Record { [[Type]], [[Value]], [[Source]] } _part_ in _parts_, do
- 1. Let _O_ be OrdinaryObjectCreate(%ObjectPrototype%).
+ 1. Let _O_ be ! OrdinaryObjectCreate(%Object.prototype%).
1. Perform ! CreateDataPropertyOrThrow(_O_, *"type"*, _part_.[[Type]]).
1. Perform ! CreateDataPropertyOrThrow(_O_, *"value"*, _part_.[[Value]]).
1. Perform ! CreateDataPropertyOrThrow(_O_, *"source"*, _part_.[[Source]]).
diff --git a/spec/displaynames.html b/spec/displaynames.html
index da97d82e..f71f33a1 100644
--- a/spec/displaynames.html
+++ b/spec/displaynames.html
@@ -248,34 +248,32 @@ Abstract Operations for DisplayNames Objects
CanonicalCodeForDisplayNames ( _type_, _code_ )
- The CanonicalCodeForDisplayNames abstract operation is called with arguments _type_ and _code_. It verifies that the _code_ argument represents a well-formed code according to the _type_ argument and returns the case-regularized form of the _code_. The algorithm refers to UTS 35's Unicode Language and Locale Identifiers grammar. The following steps are taken:
+ The CanonicalCodeForDisplayNames abstract operation takes arguments _type_ (a String) and _code_ (a String). It verifies that the _code_ argument represents a well-formed code according to the _type_ argument and returns the case-regularized form of the _code_. The algorithm refers to UTS 35's Unicode Language and Locale Identifiers grammar. The following steps are taken:
1. If _type_ is *"language"*, then
1. If _code_ does not match the `unicode_language_id` production, throw a *RangeError* exception.
- 1. If IsStructurallyValidLanguageTag(_code_) is *false*, throw a *RangeError* exception.
- 1. Set _code_ to CanonicalizeUnicodeLocaleId(_code_).
- 1. Return _code_.
+ 1. If ! IsStructurallyValidLanguageTag(_code_) is *false*, throw a *RangeError* exception.
+ 1. Return ! CanonicalizeUnicodeLocaleId(_code_).
1. If _type_ is *"region"*, then
1. If _code_ does not match the `unicode_region_subtag` production, throw a *RangeError* exception.
- 1. Let _code_ be the result of mapping _code_ to upper case as described in .
- 1. Return _code_.
+ 1. Return the ASCII-uppercase of _code_.
1. If _type_ is *"script"*, then
1. If _code_ does not match the `unicode_script_subtag` production, throw a *RangeError* exception.
- 1. Let _code_ be the result of mapping the first character in _code_ to upper case, and mapping the second, third, and fourth character in _code_ to lower case, as described in .
- 1. Return _code_.
+ 1. Assert: The length of _code_ is 4, and every code unit of _code_ represents an ASCII letter (0x0041 through 0x005A and 0x0061 through 0x007A, both inclusive).
+ 1. Let _first_ be the ASCII-uppercase of the substring of _code_ from 0 to 1.
+ 1. Let _rest_ be the ASCII-lowercase of the substring of _code_ from 1.
+ 1. Return the string-concatenation of _first_ and _rest_.
1. If _type_ is *"calendar"*, then
1. If _code_ does not match the Unicode Locale Identifier `type` nonterminal, throw a *RangeError* exception.
1. If _code_ uses any of the backwards compatibility syntax described in Unicode Technical Standard #35 LDML § 3.3 BCP 47 Conformance, throw a *RangeError* exception.
- 1. Let _code_ be the result of mapping _code_ to lower case as described in .
- 1. Return _code_.
+ 1. Return the ASCII-lowercase of _code_.
1. If _type_ is *"dateTimeField"*, then
1. If the result of IsValidDateTimeFieldCode(_code_) is *false*, throw a *RangeError* exception.
1. Return _code_.
1. Assert: _type_ is *"currency"*.
1. If ! IsWellFormedCurrencyCode(_code_) is *false*, throw a *RangeError* exception.
- 1. Let _code_ be the result of mapping _code_ to upper case as described in .
- 1. Return _code_.
+ 1. Return the ASCII-uppercase of _code_.
diff --git a/spec/intl.html b/spec/intl.html
index a6ff46b8..0d768e4c 100644
--- a/spec/intl.html
+++ b/spec/intl.html
@@ -114,7 +114,7 @@ Intl.getCanonicalLocales ( _locales_ )
1. Let _ll_ be ? CanonicalizeLocaleList(_locales_).
- 1. Return CreateArrayFromList(_ll_).
+ 1. Return ! CreateArrayFromList(_ll_).
diff --git a/spec/listformat.html b/spec/listformat.html
index af014ca3..2f8bd914 100644
--- a/spec/listformat.html
+++ b/spec/listformat.html
@@ -142,7 +142,7 @@ Intl.ListFormat.prototype.format ( _list_ )
1. Let _lf_ be the *this* value.
1. Perform ? RequireInternalSlot(_lf_, [[InitializedListFormat]]).
1. Let _stringList_ be ? StringListFromIterable(_list_).
- 1. Return FormatList(_lf_, _stringList_).
+ 1. Return ! FormatList(_lf_, _stringList_).
@@ -157,7 +157,7 @@ Intl.ListFormat.prototype.formatToParts ( _list_ )
1. Let _lf_ be the *this* value.
1. Perform ? RequireInternalSlot(_lf_, [[InitializedListFormat]]).
1. Let _stringList_ be ? StringListFromIterable(_list_).
- 1. Return FormatListToParts(_lf_, _stringList_).
+ 1. Return ! FormatListToParts(_lf_, _stringList_).
@@ -259,7 +259,7 @@ DeconstructPattern ( _pattern_, _placeables_ )
»
- 1. Let _patternParts_ be PartitionPattern(_pattern_).
+ 1. Let _patternParts_ be ! PartitionPattern(_pattern_).
1. Let _result_ be a new empty List.
1. For each Record { [[Type]], [[Value]] } _patternPart_ of _patternParts_, do
1. Let _part_ be _patternPart_.[[Type]].
@@ -296,7 +296,7 @@ CreatePartsFromList ( _listFormat_, _list_ )
1. Let _first_ be a new Record { [[Type]]: *"element"*, [[Value]]: _list_[0] }.
1. Let _second_ be a new Record { [[Type]]: *"element"*, [[Value]]: _list_[1] }.
1. Let _placeables_ be a new Record { [[0]]: _first_, [[1]]: _second_ }.
- 1. Return DeconstructPattern(_pattern_, _placeables_).
+ 1. Return ! DeconstructPattern(_pattern_, _placeables_).
1. Let _last_ be a new Record { [[Type]]: *"element"*, [[Value]]: _list_[_size_ - 1] }.
1. Let _parts_ be « _last_ ».
1. Let _i_ be _size_ - 2.
@@ -310,7 +310,7 @@ CreatePartsFromList ( _listFormat_, _list_ )
1. Else,
1. Let _pattern_ be _listFormat_.[[Templates]][_n_].[[End]].
1. Let _placeables_ be a new Record { [[0]]: _head_, [[1]]: _parts_ }.
- 1. Set _parts_ to DeconstructPattern(_pattern_, _placeables_).
+ 1. Set _parts_ to ! DeconstructPattern(_pattern_, _placeables_).
1. Decrement _i_ by 1.
1. Return _parts_.
@@ -328,7 +328,7 @@ FormatList ( _listFormat_, _list_ )
- 1. Let _parts_ be CreatePartsFromList(_listFormat_, _list_).
+ 1. Let _parts_ be ! CreatePartsFromList(_listFormat_, _list_).
1. Let _result_ be an empty String.
1. For each Record { [[Type]], [[Value]] } _part_ in _parts_, do
1. Set _result_ to the string-concatenation of _result_ and _part_.[[Value]].
@@ -344,11 +344,11 @@ FormatListToParts ( _listFormat_, _list_ )
- 1. Let _parts_ be CreatePartsFromList(_listFormat_, _list_).
- 1. Let _result_ be ArrayCreate(0).
+ 1. Let _parts_ be ! CreatePartsFromList(_listFormat_, _list_).
+ 1. Let _result_ be ! ArrayCreate(0).
1. Let _n_ be 0.
1. For each Record { [[Type]], [[Value]] } _part_ in _parts_, do
- 1. Let _O_ be OrdinaryObjectCreate(%Object.prototype%).
+ 1. Let _O_ be ! OrdinaryObjectCreate(%Object.prototype%).
1. Perform ! CreateDataPropertyOrThrow(_O_, *"type"*, _part_.[[Type]]).
1. Perform ! CreateDataPropertyOrThrow(_O_, *"value"*, _part_.[[Value]]).
1. Perform ! CreateDataPropertyOrThrow(_result_, ! ToString(_n_), _O_).
diff --git a/spec/locale-sensitive-functions.html b/spec/locale-sensitive-functions.html
index a492069b..f88e8d57 100644
--- a/spec/locale-sensitive-functions.html
+++ b/spec/locale-sensitive-functions.html
@@ -89,10 +89,10 @@
1. If _locale_ is *undefined*, set _locale_ to *"und"*.
1. Let _codePoints_ be ! StringToCodePoints(_S_).
1. If _targetCase_ is ~lower~, then
- 1. Let _newCodePoints_ be a List whose elements are the result of a lower case transformation of _codePoints_ according to an implementation-derived algorithm using _locale_ or the Unicode Default Case Conversion algorithm.
+ 1. Let _newCodePoints_ be a List whose elements are the result of a lowercase transformation of _codePoints_ according to an implementation-derived algorithm using _locale_ or the Unicode Default Case Conversion algorithm.
1. Else,
1. Assert: _targetCase_ is ~upper~.
- 1. Let _newCodePoints_ be a List whose elements are the result of an upper case transformation of _codePoints_ according to an implementation-derived algorithm using _locale_ or the Unicode Default Case Conversion algorithm.
+ 1. Let _newCodePoints_ be a List whose elements are the result of an uppercase transformation of _codePoints_ according to an implementation-derived algorithm using _locale_ or the Unicode Default Case Conversion algorithm.
1. Return ! CodePointsToString(_newCodePoints_).
diff --git a/spec/locale.html b/spec/locale.html
index 084139ad..e390ac80 100644
--- a/spec/locale.html
+++ b/spec/locale.html
@@ -78,7 +78,7 @@ ApplyOptionsToTag ( _tag_, _options_ )
1. Assert: Type(_tag_) is String.
1. Assert: Type(_options_) is Object.
- 1. If IsStructurallyValidLanguageTag(_tag_) is *false*, throw a *RangeError* exception.
+ 1. If ! IsStructurallyValidLanguageTag(_tag_) is *false*, throw a *RangeError* exception.
1. Let _language_ be ? GetOption(_options_, *"language"*, *"string"*, *undefined*, *undefined*).
1. If _language_ is not *undefined*, then
1. If _language_ does not match the `unicode_language_subtag` production, throw a *RangeError* exception.
@@ -88,7 +88,7 @@ ApplyOptionsToTag ( _tag_, _options_ )
1. Let _region_ be ? GetOption(_options_, *"region"*, *"string"*, *undefined*, *undefined*).
1. If _region_ is not *undefined*, then
1. If _region_ does not match the `unicode_region_subtag` production, throw a *RangeError* exception.
- 1. Set _tag_ to CanonicalizeUnicodeLocaleId(_tag_).
+ 1. Set _tag_ to ! CanonicalizeUnicodeLocaleId(_tag_).
1. Assert: _tag_ matches the `unicode_locale_id` production.
1. Let _languageId_ be the substring of _tag_ corresponding to the `unicode_language_id` production.
1. If _language_ is not *undefined*, then
@@ -104,7 +104,7 @@ ApplyOptionsToTag ( _tag_, _options_ )
1. Else,
1. Set _languageId_ to _languageId_ with the substring corresponding to the `unicode_region_subtag` production replaced by the string _region_.
1. Set _tag_ to _tag_ with the substring corresponding to the `unicode_language_id` production replaced by the string _languageId_.
- 1. Return CanonicalizeUnicodeLocaleId(_tag_).
+ 1. Return ! CanonicalizeUnicodeLocaleId(_tag_).
diff --git a/spec/locales-currencies-tz.html b/spec/locales-currencies-tz.html
index d9b06258..0c169d46 100644
--- a/spec/locales-currencies-tz.html
+++ b/spec/locales-currencies-tz.html
@@ -9,21 +9,20 @@ Identification of Locales, Currencies, Time Zones, and Measurement Units
Case Sensitivity and Case Mapping
- The String values used to identify locales, currencies, scripts, and time zones are interpreted in an ASCII-case-insensitive manner, treating the code units 0x0041 through 0x005A (corresponding to Unicode characters LATIN CAPITAL LETTER A through LATIN CAPITAL LETTER Z) as equivalent to the corresponding code units 0x0061 through 0x007A (corresponding to Unicode characters LATIN SMALL LETTER A through LATIN SMALL LETTER Z), inclusive. No other case folding equivalences are applied.
+ The String values used to identify locales, currencies, scripts, and time zones are interpreted in an ASCII-case-insensitive manner, treating the code units 0x0041 through 0x005A (corresponding to Unicode characters LATIN CAPITAL LETTER A through LATIN CAPITAL LETTER Z) as equivalent to the corresponding code units 0x0061 through 0x007A (corresponding to Unicode characters LATIN SMALL LETTER A through LATIN SMALL LETTER Z), both inclusive. No other case folding equivalences are applied.
+
+ For example, *"ß"* (U+00DF) must not match or be mapped to *"SS"* (U+0053, U+0053). *"ı"* (U+0131) must not match or be mapped to *"I"* (U+0049).
+
- Mapping to upper case takes a String value and produces a new String value in which each lower case ASCII letter code unit (0x0061 through 0x007A, inclusive) is replaced with the corresponding upper case ASCII letter code unit (0x0041 through 0x005A, inclusive) and all other code units are preserved.
+ The ASCII-uppercase of a String value _S_ is the String value derived from _S_ by replacing each occurrence of an ASCII lowercase letter code unit (0x0061 through 0x007A, inclusive) with the corresponding ASCII uppercase letter code unit (0x0041 through 0x005A, inclusive) while preserving all other code units.
- Mapping to lower case takes a String value and produces a new String value in which each upper case ASCII letter code unit (0x0041 through 0x005A, inclusive) is replaced with the corresponding lower case ASCII letter code unit (0x0061 through 0x007A, inclusive) and all other code units are preserved.
+ The ASCII-lowercase of a String value _S_ is the String value derived from _S_ by replacing each occurrence of an ASCII uppercase letter code unit (0x0041 through 0x005A, inclusive) with the corresponding ASCII lowercase letter code unit (0x0061 through 0x007A, inclusive) while preserving all other code units.
- A String value _A_ is an ASCII-case-insensitive match for String value _B_ if mapping _A_ to upper case is exactly the same sequence of code units as mapping _B_ to upper case. A sequence of Unicode code points _A_ is an ASCII-case-insensitive match for _B_ if _B_ is an ASCII-case-insensitive match for ! CodePointsToString(_A_).
+ A String value _A_ is an ASCII-case-insensitive match for String value _B_ if the ASCII-uppercase of _A_ is exactly the same sequence of code units as the ASCII-uppercase of _B_. A sequence of Unicode code points _A_ is an ASCII-case-insensitive match for _B_ if _B_ is an ASCII-case-insensitive match for ! CodePointsToString(_A_).
-
-
- For example, *"ß"* (U+00DF) must not match or be mapped to *"SS"* (U+0053, U+0053). *"ı"* (U+0131) must not match or be mapped to *"I"* (U+0049).
-
@@ -75,7 +74,7 @@ IsStructurallyValidLanguageTag ( _locale_ )
- When evaluating each condition, terminal value characters in the grammar are interpreted as the corresponding ASCII code points. Subtags are duplicates if they are ASCII case-insensitively equivalent.
+ When evaluating each condition, terminal value characters in the grammar are interpreted as the corresponding Basic Latin code points. Two subtags are duplicates if one is an ASCII-case-insensitive match for the other.
@@ -137,7 +136,7 @@ DefaultLocale ( )
Currency Codes
- The ECMAScript 2022 Internationalization API Specification identifies currencies using 3-letter currency codes as defined by ISO 4217. Their canonical form is upper case.
+ The ECMAScript 2022 Internationalization API Specification identifies currencies using 3-letter currency codes as defined by ISO 4217. Their canonical form is uppercase.
@@ -152,8 +151,8 @@
IsWellFormedCurrencyCode ( _currency_ )
- 1. Let _normalized_ be the result of mapping _currency_ to upper case as described in .
1. If the length of _normalized_ is not 3, return *false*.
+ 1. Let _normalized_ be the ASCII-uppercase of _currency_.
1. If _normalized_ contains any code unit outside of 0x0041 through 0x005A (corresponding to Unicode characters LATIN CAPITAL LETTER A through LATIN CAPITAL LETTER Z), return *false*.
1. Return *true*.
@@ -179,7 +178,7 @@ IsValidTimeZoneName ( _timeZone_ )
- 1. If one of the Zone or Link names of the IANA Time Zone Database is an ASCII-case-insensitive match of _timeZone_ as described in , return *true*.
+ 1. If one of the Zone or Link names of the IANA Time Zone Database is an ASCII-case-insensitive match of _timeZone_, return *true*.
1. If _timeZone_ is an ASCII-case-insensitive match of *"UTC"*, return *true*.
1. Return *false*.
@@ -200,7 +199,7 @@
It returns the canonical and case-regularized form of _timeZone_.
- 1. Let _ianaTimeZone_ be the String value of the Zone or Link name of the IANA Time Zone Database that is an ASCII-case-insensitive match of _timeZone_ as described in .
+ 1. Let _ianaTimeZone_ be the String value of the Zone or Link name of the IANA Time Zone Database that is an ASCII-case-insensitive match of _timeZone_.
1. If _ianaTimeZone_ is a Link name, let _ianaTimeZone_ be the String value of the corresponding Zone name as specified in the file backward of the IANA Time Zone Database.
1. If _ianaTimeZone_ is *"Etc/UTC"* or *"Etc/GMT"*, return *"UTC"*.
1. Return _ianaTimeZone_.
@@ -220,54 +219,54 @@ DefaultTimeZone ( )
Measurement Unit Identifiers
- The ECMAScript 2022 Internationalization API Specification identifies measurement units using a core unit identifier as defined by Unicode Technical Standard #35, Part 2, Section 6. Their canonical form is a string containing only Unicode Basic Latin lower case letters (U+0061 LATIN SMALL LETTER A through U+007A LATIN SMALL LETTER Z) with zero or more medial hyphens (U+002D HYPHEN-MINUS).
+ The ECMAScript 2022 Internationalization API Specification identifies measurement units using a core unit identifier (or equivalently core unit ID) as defined by Unicode Technical Standard #35, Part 2, Section 6.2. Their canonical form is a string containing only Unicode Basic Latin lowercase letters (U+0061 LATIN SMALL LETTER A through U+007A LATIN SMALL LETTER Z) with zero or more medial hyphens (U+002D HYPHEN-MINUS).
- Only a limited set of core unit identifiers are allowed.
- An illegal core unit identifier results in a RangeError.
+ Only a limited set of core unit identifiers are sanctioned.
+ Attempting to use an unsanctioned core unit identifier results in a RangeError.
IsWellFormedUnitIdentifier ( _unitIdentifier_ )
- The IsWellFormedUnitIdentifier abstract operation verifies that the _unitIdentifier_ argument (which must be a String value) represents a well-formed core unit identifier as defined in UTS #35, Part 2, Section 6. In addition to obeying the UTS #35 core unit identifier syntax, _unitIdentifier_ must be one of the identifiers sanctioned by UTS #35 or be a compound unit composed of two sanctioned simple units. The following steps are taken:
+ The IsWellFormedUnitIdentifier abstract operation verifies that the _unitIdentifier_ argument (which must be a String value) represents a well-formed UTS #35 core unit identifier that is either a sanctioned single unit or a complex unit formed by division of two sanctioned single units. The following steps are taken:
- 1. If the result of IsSanctionedSimpleUnitIdentifier(_unitIdentifier_) is *true*, then
+ 1. If ! IsSanctionedSingleUnitIdentifier(_unitIdentifier_) is *true*, then
1. Return *true*.
- 1. If the substring *"-per-"* does not occur exactly once in _unitIdentifier_, then
- 1. Return *false*.
- 1. Let _numerator_ be the substring of _unitIdentifier_ from the beginning to just before *"-per-"*.
- 1. If the result of IsSanctionedSimpleUnitIdentifier(_numerator_) is *false*, then
- 1. Return *false*.
- 1. Let _denominator_ be the substring of _unitIdentifier_ from just after *"-per-"* to the end.
- 1. If the result of IsSanctionedSimpleUnitIdentifier(_denominator_) is *false*, then
+ 1. Let _i_ be ! StringIndexOf(_unitIdentifier_, *"-per-"*, 0).
+ 1. If _i_ is -1 or ! StringIndexOf(_unitIdentifier_, *"-per-"*, _i_ + 1) is not -1, then
1. Return *false*.
- 1. Return *true*.
+ 1. Assert: The five-character substring *"-per-"* occurs exactly once in _unitIdentifier_, at index _i_.
+ 1. Let _numerator_ be the substring of _unitIdentifier_ from 0 to _i_.
+ 1. Let _denominator_ be the substring of _unitIdentifier_ from _i_ + 5.
+ 1. If ! IsSanctionedSingleUnitIdentifier(_numerator_) and ! IsSanctionedSingleUnitIdentifier(_denominator_) are both *true*, then
+ 1. Return *true*.
+ 1. Return *false*.
-
- IsSanctionedSimpleUnitIdentifier ( _unitIdentifier_ )
+
+ IsSanctionedSingleUnitIdentifier ( _unitIdentifier_ )
- The IsSanctionedSimpleUnitIdentifier abstract operation verifies that the given core unit identifier is among the simple units sanctioned in the current version of the ECMAScript Internationalization API Specification, a subset of the Validity Data as described in UTS #35, Part 1, Section 3.11; the list may grow over time. As discussed in UTS #35, a simple unit is one that does not have a numerator and denominator. The following steps are taken:
+ The IsSanctionedSingleUnitIdentifier abstract operation verifies that the _unitIdentifier_ argument (which must be a String value) is among the single unit identifiers sanctioned in the current version of the ECMAScript Internationalization API Specification, which are a subset of the Common Locale Data Repository release 38 unit validity data; the list may grow over time. As discussed in UTS #35, a single unit identifier is a core unit identifier that is not composed of multiplication or division of other unit identifiers. The following steps are taken:
- 1. If _unitIdentifier_ is listed in below, return *true*.
+ 1. If _unitIdentifier_ is listed in below, return *true*.
1. Else, return *false*.
-
- Simple units sanctioned for use in ECMAScript
+
+ Single units sanctioned for use in ECMAScript
- | Simple Unit |
+ Single Unit Identifier |
| acre |
diff --git a/spec/negotiation.html b/spec/negotiation.html
index 5930d6d0..833ad4e0 100644
--- a/spec/negotiation.html
+++ b/spec/negotiation.html
@@ -44,7 +44,7 @@ CanonicalizeLocaleList ( _locales_ )
1. Return a new empty List.
1. Let _seen_ be a new empty List.
1. If Type(_locales_) is String or Type(_locales_) is Object and _locales_ has an [[InitializedLocale]] internal slot, then
- 1. Let _O_ be CreateArrayFromList(« _locales_ »).
+ 1. Let _O_ be ! CreateArrayFromList(« _locales_ »).
1. Else,
1. Let _O_ be ? ToObject(_locales_).
1. Let _len_ be ? ToLength(? Get(_O_, *"length"*)).
@@ -59,8 +59,8 @@ CanonicalizeLocaleList ( _locales_ )
1. Let _tag_ be _kValue_.[[Locale]].
1. Else,
1. Let _tag_ be ? ToString(_kValue_).
- 1. If IsStructurallyValidLanguageTag(_tag_) is *false*, throw a *RangeError* exception.
- 1. Let _canonicalizedTag_ be CanonicalizeUnicodeLocaleId(_tag_).
+ 1. If ! IsStructurallyValidLanguageTag(_tag_) is *false*, throw a *RangeError* exception.
+ 1. Let _canonicalizedTag_ be ! CanonicalizeUnicodeLocaleId(_tag_).
1. If _canonicalizedTag_ is not an element of _seen_, append _canonicalizedTag_ as the last element of _seen_.
1. Increase _k_ by 1.
1. Return _seen_.
@@ -103,14 +103,14 @@ LookupMatcher ( _availableLocales_, _requestedLocales_ )
1. Let _result_ be a new Record.
1. For each element _locale_ of _requestedLocales_, do
1. Let _noExtensionsLocale_ be the String value that is _locale_ with any Unicode locale extension sequences removed.
- 1. Let _availableLocale_ be BestAvailableLocale(_availableLocales_, _noExtensionsLocale_).
+ 1. Let _availableLocale_ be ! BestAvailableLocale(_availableLocales_, _noExtensionsLocale_).
1. If _availableLocale_ is not *undefined*, then
1. Set _result_.[[locale]] to _availableLocale_.
1. If _locale_ and _noExtensionsLocale_ are not the same String value, then
1. Let _extension_ be the String value consisting of the substring of the Unicode locale extension sequence within _locale_.
1. Set _result_.[[extension]] to _extension_.
1. Return _result_.
- 1. Let _defLocale_ be DefaultLocale().
+ 1. Let _defLocale_ be ! DefaultLocale().
1. Set _result_.[[locale]] to _defLocale_.
1. Return _result_.
@@ -183,7 +183,7 @@ InsertUnicodeExtensionAndCanonicalize ( _locale_, _extension_ )
1. Let _preExtension_ be the substring of _locale_ from position 0, inclusive, to position _privateIndex_, exclusive.
1. Let _postExtension_ be the substring of _locale_ from position _privateIndex_ to the end of the string.
1. Let _locale_ be the string-concatenation of _preExtension_, _extension_, and _postExtension_.
- 1. Assert: IsStructurallyValidLanguageTag(_locale_) is *true*.
+ 1. Assert: ! IsStructurallyValidLanguageTag(_locale_) is *true*.
1. Return ! CanonicalizeUnicodeLocaleId(_locale_).
@@ -202,9 +202,9 @@ ResolveLocale ( _availableLocales_, _requestedLocales_, _options_, _relevant
1. Let _matcher_ be _options_.[[localeMatcher]].
1. If _matcher_ is *"lookup"*, then
- 1. Let _r_ be LookupMatcher(_availableLocales_, _requestedLocales_).
+ 1. Let _r_ be ! LookupMatcher(_availableLocales_, _requestedLocales_).
1. Else,
- 1. Let _r_ be BestFitMatcher(_availableLocales_, _requestedLocales_).
+ 1. Let _r_ be ! BestFitMatcher(_availableLocales_, _requestedLocales_).
1. Let _foundLocale_ be _r_.[[locale]].
1. Let _result_ be a new Record.
1. Set _result_.[[dataLocale]] to _foundLocale_.
@@ -267,7 +267,7 @@ LookupSupportedLocales ( _availableLocales_, _requestedLocales_ )
1. Let _subset_ be a new empty List.
1. For each element _locale_ of _requestedLocales_, do
1. Let _noExtensionsLocale_ be the String value that is _locale_ with any Unicode locale extension sequences removed.
- 1. Let _availableLocale_ be BestAvailableLocale(_availableLocales_, _noExtensionsLocale_).
+ 1. Let _availableLocale_ be ! BestAvailableLocale(_availableLocales_, _noExtensionsLocale_).
1. If _availableLocale_ is not *undefined*, append _locale_ to the end of _subset_.
1. Return _subset_.
@@ -295,7 +295,7 @@ SupportedLocales ( _availableLocales_, _requestedLocales_, _options_ )
1. Let _supportedLocales_ be BestFitSupportedLocales(_availableLocales_, _requestedLocales_).
1. Else,
1. Let _supportedLocales_ be LookupSupportedLocales(_availableLocales_, _requestedLocales_).
- 1. Return CreateArrayFromList(_supportedLocales_).
+ 1. Return ! CreateArrayFromList(_supportedLocales_).
diff --git a/spec/numberformat.html b/spec/numberformat.html
index b9fa6adf..da93a49c 100644
--- a/spec/numberformat.html
+++ b/spec/numberformat.html
@@ -166,18 +166,17 @@ SetNumberFormatUnitOptions ( _intlObj_, _options_ )
1. If _currency_ is *undefined*, then
1. If _style_ is *"currency"*, throw a *TypeError* exception.
1. Else,
- 1. If the result of IsWellFormedCurrencyCode(_currency_) is *false*, throw a *RangeError* exception.
+ 1. If ! IsWellFormedCurrencyCode(_currency_) is *false*, throw a *RangeError* exception.
1. Let _currencyDisplay_ be ? GetOption(_options_, *"currencyDisplay"*, *"string"*, « *"code"*, *"symbol"*, *"narrowSymbol"*, *"name"* », *"symbol"*).
1. Let _currencySign_ be ? GetOption(_options_, *"currencySign"*, *"string"*, « *"standard"*, *"accounting"* », *"standard"*).
1. Let _unit_ be ? GetOption(_options_, *"unit"*, *"string"*, *undefined*, *undefined*).
1. If _unit_ is *undefined*, then
1. If _style_ is *"unit"*, throw a *TypeError* exception.
1. Else,
- 1. If the result of IsWellFormedUnitIdentifier(_unit_) is *false*, throw a *RangeError* exception.
+ 1. If ! IsWellFormedUnitIdentifier(_unit_) is *false*, throw a *RangeError* exception.
1. Let _unitDisplay_ be ? GetOption(_options_, *"unitDisplay"*, *"string"*, « *"short"*, *"narrow"*, *"long"* », *"short"*).
1. If _style_ is *"currency"*, then
- 1. Let _currency_ be the result of mapping _currency_ to upper case as specified in .
- 1. Set _intlObj_.[[Currency]] to _currency_.
+ 1. Set _intlObj_.[[Currency]] to the ASCII-uppercase of _currency_.
1. Set _intlObj_.[[CurrencyDisplay]] to _currencyDisplay_.
1. Set _intlObj_.[[CurrencySign]] to _currencySign_.
1. If _style_ is *"unit"*, then
@@ -483,7 +482,7 @@ Abstract Operations for NumberFormat Objects
CurrencyDigits ( _currency_ )
- When the CurrencyDigits abstract operation is called with an argument _currency_ (which must be an upper case String value), the following steps are taken:
+ When the CurrencyDigits abstract operation is called with an argument _currency_ (which must be an uppercase String value), the following steps are taken:
@@ -1002,10 +1001,10 @@ FormatNumericToParts ( _numberFormat_, _x_ )
1. Let _parts_ be ? PartitionNumberPattern(_numberFormat_, _x_).
- 1. Let _result_ be ArrayCreate(0).
+ 1. Let _result_ be ! ArrayCreate(0).
1. Let _n_ be 0.
1. For each Record { [[Type]], [[Value]] } _part_ in _parts_, do
- 1. Let _O_ be OrdinaryObjectCreate(%Object.prototype%).
+ 1. Let _O_ be ! OrdinaryObjectCreate(%Object.prototype%).
1. Perform ! CreateDataPropertyOrThrow(_O_, *"type"*, _part_.[[Type]]).
1. Perform ! CreateDataPropertyOrThrow(_O_, *"value"*, _part_.[[Value]]).
1. Perform ! CreateDataPropertyOrThrow(_result_, ! ToString(_n_), _O_).
diff --git a/spec/pluralrules.html b/spec/pluralrules.html
index 9e228202..1507d910 100644
--- a/spec/pluralrules.html
+++ b/spec/pluralrules.html
@@ -161,7 +161,7 @@ Intl.PluralRules.prototype.resolvedOptions ( )
1. If _v_ is not *undefined*, then
1. Perform ! CreateDataPropertyOrThrow(_options_, _p_, _v_).
1. Let _pluralCategories_ be a List of Strings containing all possible results of PluralRuleSelect for the selected locale _pr_.[[Locale]].
- 1. Perform ! CreateDataProperty(_options_, *"pluralCategories"*, CreateArrayFromList(_pluralCategories_)).
+ 1. Perform ! CreateDataProperty(_options_, *"pluralCategories"*, ! CreateArrayFromList(_pluralCategories_)).
1. Return _options_.
diff --git a/spec/relativetimeformat.html b/spec/relativetimeformat.html
index e376e76c..c3fcfdf7 100644
--- a/spec/relativetimeformat.html
+++ b/spec/relativetimeformat.html
@@ -385,10 +385,10 @@ FormatRelativeTimeToParts ( _relativeTimeFormat_, _value_, _unit_ )
1. Let _parts_ be ? PartitionRelativeTimePattern(_relativeTimeFormat_, _value_, _unit_).
- 1. Let _result_ be ArrayCreate(0).
+ 1. Let _result_ be ! ArrayCreate(0).
1. Let _n_ be 0.
1. For each Record { [[Type]], [[Value]], [[Unit]] } _part_ in _parts_, do
- 1. Let _O_ be OrdinaryObjectCreate(%Object.prototype%).
+ 1. Let _O_ be ! OrdinaryObjectCreate(%Object.prototype%).
1. Perform ! CreateDataPropertyOrThrow(_O_, *"type"*, _part_.[[Type]]).
1. Perform ! CreateDataPropertyOrThrow(_O_, *"value"*, _part_.[[Value]]).
1. If _part_.[[Unit]] is not ~empty~, then