OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // ECMAScript 402 API implementation. | 5 // ECMAScript 402 API implementation. |
6 | 6 |
7 /** | 7 /** |
8 * Intl object is a single object that has some named properties, | 8 * Intl object is a single object that has some named properties, |
9 * all of which are constructors. | 9 * all of which are constructors. |
10 */ | 10 */ |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 receiver[internalName] = boundMethod; | 89 receiver[internalName] = boundMethod; |
90 } | 90 } |
91 return receiver[internalName]; | 91 return receiver[internalName]; |
92 }); | 92 }); |
93 | 93 |
94 %FunctionRemovePrototype(getter); | 94 %FunctionRemovePrototype(getter); |
95 %DefineGetterPropertyUnchecked(obj.prototype, methodName, getter, DONT_ENUM); | 95 %DefineGetterPropertyUnchecked(obj.prototype, methodName, getter, DONT_ENUM); |
96 %SetNativeFlag(getter); | 96 %SetNativeFlag(getter); |
97 } | 97 } |
98 | 98 |
99 function IntlConstruct(receiver, constructor, initializer, newTarget, args, | 99 function IntlConstruct(receiver, constructor, create, newTarget, args, |
100 compat) { | 100 compat) { |
101 var locales = args[0]; | 101 var locales = args[0]; |
102 var options = args[1]; | 102 var options = args[1]; |
103 | 103 |
104 if (IS_UNDEFINED(newTarget)) { | 104 if (IS_UNDEFINED(newTarget)) { |
105 if (compat && receiver instanceof constructor) { | 105 if (compat && receiver instanceof constructor) { |
106 let success = %object_define_property(receiver, IntlFallbackSymbol, | 106 let success = %object_define_property(receiver, IntlFallbackSymbol, |
107 { value: new constructor(locales, options) }); | 107 { value: new constructor(locales, options) }); |
108 if (!success) { | 108 if (!success) { |
109 throw %make_type_error(kReinitializeIntl, constructor); | 109 throw %make_type_error(kReinitializeIntl, constructor); |
110 } | 110 } |
111 return receiver; | 111 return receiver; |
112 } | 112 } |
113 | 113 |
114 return new constructor(locales, options); | 114 return new constructor(locales, options); |
115 } | 115 } |
116 | 116 |
117 return initializer(receiver, locales, options); | 117 return create(locales, options); |
118 } | 118 } |
119 | 119 |
120 | 120 |
121 | 121 |
122 function Unwrap(receiver, typename, constructor, method, compat) { | 122 function Unwrap(receiver, typename, constructor, method, compat) { |
123 if (!%IsInitializedIntlObjectOfType(receiver, typename)) { | 123 if (!%IsInitializedIntlObjectOfType(receiver, typename)) { |
124 if (compat && receiver instanceof constructor) { | 124 if (compat && receiver instanceof constructor) { |
125 let fallback = receiver[IntlFallbackSymbol]; | 125 let fallback = receiver[IntlFallbackSymbol]; |
126 if (%IsInitializedIntlObjectOfType(fallback, typename)) { | 126 if (%IsInitializedIntlObjectOfType(fallback, typename)) { |
127 return fallback; | 127 return fallback; |
(...skipping 815 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
943 // ECMA 402 section 8.2.1 | 943 // ECMA 402 section 8.2.1 |
944 InstallFunction(GlobalIntl, 'getCanonicalLocales', function(locales) { | 944 InstallFunction(GlobalIntl, 'getCanonicalLocales', function(locales) { |
945 return makeArray(canonicalizeLocaleList(locales)); | 945 return makeArray(canonicalizeLocaleList(locales)); |
946 } | 946 } |
947 ); | 947 ); |
948 | 948 |
949 /** | 949 /** |
950 * Initializes the given object so it's a valid Collator instance. | 950 * Initializes the given object so it's a valid Collator instance. |
951 * Useful for subclassing. | 951 * Useful for subclassing. |
952 */ | 952 */ |
953 function initializeCollator(collator, locales, options) { | 953 function CreateCollator(locales, options) { |
954 if (%IsInitializedIntlObject(collator)) { | |
955 throw %make_type_error(kReinitializeIntl, "Collator"); | |
956 } | |
957 | |
958 if (IS_UNDEFINED(options)) { | 954 if (IS_UNDEFINED(options)) { |
959 options = {}; | 955 options = {}; |
960 } | 956 } |
961 | 957 |
962 var getOption = getGetOption(options, 'collator'); | 958 var getOption = getGetOption(options, 'collator'); |
963 | 959 |
964 var internalOptions = {}; | 960 var internalOptions = {}; |
965 | 961 |
966 defineWEProperty(internalOptions, 'usage', getOption( | 962 defineWEProperty(internalOptions, 'usage', getOption( |
967 'usage', 'string', ['sort', 'search'], 'sort')); | 963 'usage', 'string', ['sort', 'search'], 'sort')); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1034 collation: {value: internalOptions.collation, writable: true}, | 1030 collation: {value: internalOptions.collation, writable: true}, |
1035 ignorePunctuation: {writable: true}, | 1031 ignorePunctuation: {writable: true}, |
1036 locale: {writable: true}, | 1032 locale: {writable: true}, |
1037 numeric: {writable: true}, | 1033 numeric: {writable: true}, |
1038 requestedLocale: {value: requestedLocale, writable: true}, | 1034 requestedLocale: {value: requestedLocale, writable: true}, |
1039 sensitivity: {writable: true}, | 1035 sensitivity: {writable: true}, |
1040 strength: {writable: true}, | 1036 strength: {writable: true}, |
1041 usage: {value: internalOptions.usage, writable: true} | 1037 usage: {value: internalOptions.usage, writable: true} |
1042 }); | 1038 }); |
1043 | 1039 |
1044 var internalCollator = %CreateCollator(requestedLocale, | 1040 var collator = %CreateCollator(requestedLocale, internalOptions, resolved); |
1045 internalOptions, | |
1046 resolved); | |
1047 | 1041 |
1048 // Writable, configurable and enumerable are set to false by default. | 1042 %MarkAsInitializedIntlObjectOfType(collator, 'collator'); |
1049 %MarkAsInitializedIntlObjectOfType(collator, 'collator', internalCollator); | |
1050 collator[resolvedSymbol] = resolved; | 1043 collator[resolvedSymbol] = resolved; |
1051 | 1044 |
1052 return collator; | 1045 return collator; |
1053 } | 1046 } |
1054 | 1047 |
1055 | 1048 |
1056 /** | 1049 /** |
1057 * Constructs Intl.Collator object given optional locales and options | 1050 * Constructs Intl.Collator object given optional locales and options |
1058 * parameters. | 1051 * parameters. |
1059 * | 1052 * |
1060 * @constructor | 1053 * @constructor |
1061 */ | 1054 */ |
1062 function CollatorConstructor() { | 1055 function CollatorConstructor() { |
1063 return IntlConstruct(this, GlobalIntlCollator, initializeCollator, new.target, | 1056 return IntlConstruct(this, GlobalIntlCollator, CreateCollator, new.target, |
1064 arguments); | 1057 arguments); |
1065 } | 1058 } |
1066 %SetCode(GlobalIntlCollator, CollatorConstructor); | 1059 %SetCode(GlobalIntlCollator, CollatorConstructor); |
1067 | 1060 |
1068 | 1061 |
1069 /** | 1062 /** |
1070 * Collator resolvedOptions method. | 1063 * Collator resolvedOptions method. |
1071 */ | 1064 */ |
1072 InstallFunction(GlobalIntlCollator.prototype, 'resolvedOptions', function() { | 1065 InstallFunction(GlobalIntlCollator.prototype, 'resolvedOptions', function() { |
1073 var coll = Unwrap(this, 'collator', GlobalIntlCollator, 'resolvedOptions', | 1066 var coll = Unwrap(this, 'collator', GlobalIntlCollator, 'resolvedOptions', |
(...skipping 30 matching lines...) Expand all Loading... |
1104 * When the compare method is called with two arguments x and y, it returns a | 1097 * When the compare method is called with two arguments x and y, it returns a |
1105 * Number other than NaN that represents the result of a locale-sensitive | 1098 * Number other than NaN that represents the result of a locale-sensitive |
1106 * String comparison of x with y. | 1099 * String comparison of x with y. |
1107 * The result is intended to order String values in the sort order specified | 1100 * The result is intended to order String values in the sort order specified |
1108 * by the effective locale and collation options computed during construction | 1101 * by the effective locale and collation options computed during construction |
1109 * of this Collator object, and will be negative, zero, or positive, depending | 1102 * of this Collator object, and will be negative, zero, or positive, depending |
1110 * on whether x comes before y in the sort order, the Strings are equal under | 1103 * on whether x comes before y in the sort order, the Strings are equal under |
1111 * the sort order, or x comes after y in the sort order, respectively. | 1104 * the sort order, or x comes after y in the sort order, respectively. |
1112 */ | 1105 */ |
1113 function compare(collator, x, y) { | 1106 function compare(collator, x, y) { |
1114 return %InternalCompare(%GetImplFromInitializedIntlObject(collator), | 1107 return %InternalCompare(collator, TO_STRING(x), TO_STRING(y)); |
1115 TO_STRING(x), TO_STRING(y)); | |
1116 }; | 1108 }; |
1117 | 1109 |
1118 | 1110 |
1119 AddBoundMethod(GlobalIntlCollator, 'compare', compare, 2, 'collator', false); | 1111 AddBoundMethod(GlobalIntlCollator, 'compare', compare, 2, 'collator', false); |
1120 | 1112 |
1121 /** | 1113 /** |
1122 * Verifies that the input is a well-formed ISO 4217 currency code. | 1114 * Verifies that the input is a well-formed ISO 4217 currency code. |
1123 * Don't uppercase to test. It could convert invalid code into a valid one. | 1115 * Don't uppercase to test. It could convert invalid code into a valid one. |
1124 * For example \u00DFP (Eszett+P) becomes SSP. | 1116 * For example \u00DFP (Eszett+P) becomes SSP. |
1125 */ | 1117 */ |
(...skipping 27 matching lines...) Expand all Loading... |
1153 }, | 1145 }, |
1154 set(value) { | 1146 set(value) { |
1155 this[patternSymbol] = value; | 1147 this[patternSymbol] = value; |
1156 } | 1148 } |
1157 }; | 1149 }; |
1158 | 1150 |
1159 /** | 1151 /** |
1160 * Initializes the given object so it's a valid NumberFormat instance. | 1152 * Initializes the given object so it's a valid NumberFormat instance. |
1161 * Useful for subclassing. | 1153 * Useful for subclassing. |
1162 */ | 1154 */ |
1163 function initializeNumberFormat(numberFormat, locales, options) { | 1155 function CreateNumberFormat(locales, options) { |
1164 if (%IsInitializedIntlObject(numberFormat)) { | |
1165 throw %make_type_error(kReinitializeIntl, "NumberFormat"); | |
1166 } | |
1167 | |
1168 if (IS_UNDEFINED(options)) { | 1156 if (IS_UNDEFINED(options)) { |
1169 options = {}; | 1157 options = {}; |
1170 } | 1158 } |
1171 | 1159 |
1172 var getOption = getGetOption(options, 'numberformat'); | 1160 var getOption = getGetOption(options, 'numberformat'); |
1173 | 1161 |
1174 var locale = resolveLocale('numberformat', locales, options); | 1162 var locale = resolveLocale('numberformat', locales, options); |
1175 | 1163 |
1176 var internalOptions = {}; | 1164 var internalOptions = {}; |
1177 defineWEProperty(internalOptions, 'style', getOption( | 1165 defineWEProperty(internalOptions, 'style', getOption( |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1253 requestedLocale: {value: requestedLocale, writable: true}, | 1241 requestedLocale: {value: requestedLocale, writable: true}, |
1254 style: {value: internalOptions.style, writable: true}, | 1242 style: {value: internalOptions.style, writable: true}, |
1255 useGrouping: {writable: true} | 1243 useGrouping: {writable: true} |
1256 }); | 1244 }); |
1257 if (HAS_OWN_PROPERTY(internalOptions, 'minimumSignificantDigits')) { | 1245 if (HAS_OWN_PROPERTY(internalOptions, 'minimumSignificantDigits')) { |
1258 defineWEProperty(resolved, 'minimumSignificantDigits', UNDEFINED); | 1246 defineWEProperty(resolved, 'minimumSignificantDigits', UNDEFINED); |
1259 } | 1247 } |
1260 if (HAS_OWN_PROPERTY(internalOptions, 'maximumSignificantDigits')) { | 1248 if (HAS_OWN_PROPERTY(internalOptions, 'maximumSignificantDigits')) { |
1261 defineWEProperty(resolved, 'maximumSignificantDigits', UNDEFINED); | 1249 defineWEProperty(resolved, 'maximumSignificantDigits', UNDEFINED); |
1262 } | 1250 } |
1263 var formatter = %CreateNumberFormat(requestedLocale, | 1251 var numberFormat = %CreateNumberFormat(requestedLocale, internalOptions, |
1264 internalOptions, | 1252 resolved); |
1265 resolved); | |
1266 | 1253 |
1267 if (internalOptions.style === 'currency') { | 1254 if (internalOptions.style === 'currency') { |
1268 %object_define_property(resolved, 'currencyDisplay', | 1255 %object_define_property(resolved, 'currencyDisplay', |
1269 {value: currencyDisplay, writable: true}); | 1256 {value: currencyDisplay, writable: true}); |
1270 } | 1257 } |
1271 | 1258 |
1272 %MarkAsInitializedIntlObjectOfType(numberFormat, 'numberformat', formatter); | 1259 %MarkAsInitializedIntlObjectOfType(numberFormat, 'numberformat'); |
1273 numberFormat[resolvedSymbol] = resolved; | 1260 numberFormat[resolvedSymbol] = resolved; |
1274 | 1261 |
1275 return numberFormat; | 1262 return numberFormat; |
1276 } | 1263 } |
1277 | 1264 |
1278 | 1265 |
1279 /** | 1266 /** |
1280 * Constructs Intl.NumberFormat object given optional locales and options | 1267 * Constructs Intl.NumberFormat object given optional locales and options |
1281 * parameters. | 1268 * parameters. |
1282 * | 1269 * |
1283 * @constructor | 1270 * @constructor |
1284 */ | 1271 */ |
1285 function NumberFormatConstructor() { | 1272 function NumberFormatConstructor() { |
1286 return IntlConstruct(this, GlobalIntlNumberFormat, initializeNumberFormat, | 1273 return IntlConstruct(this, GlobalIntlNumberFormat, CreateNumberFormat, |
1287 new.target, arguments, true); | 1274 new.target, arguments, true); |
1288 } | 1275 } |
1289 %SetCode(GlobalIntlNumberFormat, NumberFormatConstructor); | 1276 %SetCode(GlobalIntlNumberFormat, NumberFormatConstructor); |
1290 | 1277 |
1291 | 1278 |
1292 /** | 1279 /** |
1293 * NumberFormat resolvedOptions method. | 1280 * NumberFormat resolvedOptions method. |
1294 */ | 1281 */ |
1295 InstallFunction(GlobalIntlNumberFormat.prototype, 'resolvedOptions', | 1282 InstallFunction(GlobalIntlNumberFormat.prototype, 'resolvedOptions', |
1296 function() { | 1283 function() { |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1345 | 1332 |
1346 /** | 1333 /** |
1347 * Returns a String value representing the result of calling ToNumber(value) | 1334 * Returns a String value representing the result of calling ToNumber(value) |
1348 * according to the effective locale and the formatting options of this | 1335 * according to the effective locale and the formatting options of this |
1349 * NumberFormat. | 1336 * NumberFormat. |
1350 */ | 1337 */ |
1351 function formatNumber(formatter, value) { | 1338 function formatNumber(formatter, value) { |
1352 // Spec treats -0 and +0 as 0. | 1339 // Spec treats -0 and +0 as 0. |
1353 var number = TO_NUMBER(value) + 0; | 1340 var number = TO_NUMBER(value) + 0; |
1354 | 1341 |
1355 return %InternalNumberFormat(%GetImplFromInitializedIntlObject(formatter), | 1342 return %InternalNumberFormat(formatter, number); |
1356 number); | |
1357 } | 1343 } |
1358 | 1344 |
1359 | 1345 |
1360 AddBoundMethod(GlobalIntlNumberFormat, 'format', formatNumber, 1, | 1346 AddBoundMethod(GlobalIntlNumberFormat, 'format', formatNumber, 1, |
1361 'numberformat', true); | 1347 'numberformat', true); |
1362 | 1348 |
1363 /** | 1349 /** |
1364 * Returns a string that matches LDML representation of the options object. | 1350 * Returns a string that matches LDML representation of the options object. |
1365 */ | 1351 */ |
1366 function toLDMLString(options) { | 1352 function toLDMLString(options) { |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1557 } | 1543 } |
1558 | 1544 |
1559 return options; | 1545 return options; |
1560 } | 1546 } |
1561 | 1547 |
1562 | 1548 |
1563 /** | 1549 /** |
1564 * Initializes the given object so it's a valid DateTimeFormat instance. | 1550 * Initializes the given object so it's a valid DateTimeFormat instance. |
1565 * Useful for subclassing. | 1551 * Useful for subclassing. |
1566 */ | 1552 */ |
1567 function initializeDateTimeFormat(dateFormat, locales, options) { | 1553 function CreateDateTimeFormat(locales, options) { |
1568 | |
1569 if (%IsInitializedIntlObject(dateFormat)) { | |
1570 throw %make_type_error(kReinitializeIntl, "DateTimeFormat"); | |
1571 } | |
1572 | |
1573 if (IS_UNDEFINED(options)) { | 1554 if (IS_UNDEFINED(options)) { |
1574 options = {}; | 1555 options = {}; |
1575 } | 1556 } |
1576 | 1557 |
1577 var locale = resolveLocale('dateformat', locales, options); | 1558 var locale = resolveLocale('dateformat', locales, options); |
1578 | 1559 |
1579 options = toDateTimeOptions(options, 'any', 'date'); | 1560 options = toDateTimeOptions(options, 'any', 'date'); |
1580 | 1561 |
1581 var getOption = getGetOption(options, 'dateformat'); | 1562 var getOption = getGetOption(options, 'dateformat'); |
1582 | 1563 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1624 [patternSymbol]: {writable: true}, | 1605 [patternSymbol]: {writable: true}, |
1625 requestedLocale: {value: requestedLocale, writable: true}, | 1606 requestedLocale: {value: requestedLocale, writable: true}, |
1626 second: {writable: true}, | 1607 second: {writable: true}, |
1627 timeZone: {writable: true}, | 1608 timeZone: {writable: true}, |
1628 timeZoneName: {writable: true}, | 1609 timeZoneName: {writable: true}, |
1629 tz: {value: tz, writable: true}, | 1610 tz: {value: tz, writable: true}, |
1630 weekday: {writable: true}, | 1611 weekday: {writable: true}, |
1631 year: {writable: true} | 1612 year: {writable: true} |
1632 }); | 1613 }); |
1633 | 1614 |
1634 var formatter = %CreateDateTimeFormat( | 1615 var dateFormat = %CreateDateTimeFormat( |
1635 requestedLocale, {skeleton: ldmlString, timeZone: tz}, resolved); | 1616 requestedLocale, {skeleton: ldmlString, timeZone: tz}, resolved); |
1636 | 1617 |
1637 if (resolved.timeZone === "Etc/Unknown") { | 1618 if (resolved.timeZone === "Etc/Unknown") { |
1638 throw %make_range_error(kUnsupportedTimeZone, tz); | 1619 throw %make_range_error(kUnsupportedTimeZone, tz); |
1639 } | 1620 } |
1640 | 1621 |
1641 %MarkAsInitializedIntlObjectOfType(dateFormat, 'dateformat', formatter); | 1622 %MarkAsInitializedIntlObjectOfType(dateFormat, 'dateformat'); |
1642 dateFormat[resolvedSymbol] = resolved; | 1623 dateFormat[resolvedSymbol] = resolved; |
1643 | 1624 |
1644 return dateFormat; | 1625 return dateFormat; |
1645 } | 1626 } |
1646 | 1627 |
1647 | 1628 |
1648 /** | 1629 /** |
1649 * Constructs Intl.DateTimeFormat object given optional locales and options | 1630 * Constructs Intl.DateTimeFormat object given optional locales and options |
1650 * parameters. | 1631 * parameters. |
1651 * | 1632 * |
1652 * @constructor | 1633 * @constructor |
1653 */ | 1634 */ |
1654 function DateTimeFormatConstructor() { | 1635 function DateTimeFormatConstructor() { |
1655 return IntlConstruct(this, GlobalIntlDateTimeFormat, initializeDateTimeFormat, | 1636 return IntlConstruct(this, GlobalIntlDateTimeFormat, CreateDateTimeFormat, |
1656 new.target, arguments, true); | 1637 new.target, arguments, true); |
1657 } | 1638 } |
1658 %SetCode(GlobalIntlDateTimeFormat, DateTimeFormatConstructor); | 1639 %SetCode(GlobalIntlDateTimeFormat, DateTimeFormatConstructor); |
1659 | 1640 |
1660 | 1641 |
1661 /** | 1642 /** |
1662 * DateTimeFormat resolvedOptions method. | 1643 * DateTimeFormat resolvedOptions method. |
1663 */ | 1644 */ |
1664 InstallFunction(GlobalIntlDateTimeFormat.prototype, 'resolvedOptions', | 1645 InstallFunction(GlobalIntlDateTimeFormat.prototype, 'resolvedOptions', |
1665 function() { | 1646 function() { |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1731 function formatDate(formatter, dateValue) { | 1712 function formatDate(formatter, dateValue) { |
1732 var dateMs; | 1713 var dateMs; |
1733 if (IS_UNDEFINED(dateValue)) { | 1714 if (IS_UNDEFINED(dateValue)) { |
1734 dateMs = %DateCurrentTime(); | 1715 dateMs = %DateCurrentTime(); |
1735 } else { | 1716 } else { |
1736 dateMs = TO_NUMBER(dateValue); | 1717 dateMs = TO_NUMBER(dateValue); |
1737 } | 1718 } |
1738 | 1719 |
1739 if (!NUMBER_IS_FINITE(dateMs)) throw %make_range_error(kDateRange); | 1720 if (!NUMBER_IS_FINITE(dateMs)) throw %make_range_error(kDateRange); |
1740 | 1721 |
1741 return %InternalDateFormat(%GetImplFromInitializedIntlObject(formatter), | 1722 return %InternalDateFormat(formatter, new GlobalDate(dateMs)); |
1742 new GlobalDate(dateMs)); | |
1743 } | 1723 } |
1744 | 1724 |
1745 function FormatDateToParts(dateValue) { | 1725 function FormatDateToParts(dateValue) { |
1746 CHECK_OBJECT_COERCIBLE(this, "Intl.DateTimeFormat.prototype.formatToParts"); | 1726 CHECK_OBJECT_COERCIBLE(this, "Intl.DateTimeFormat.prototype.formatToParts"); |
1747 if (!IS_OBJECT(this)) { | 1727 if (!IS_OBJECT(this)) { |
1748 throw %make_type_error(kCalledOnNonObject, this); | 1728 throw %make_type_error(kCalledOnNonObject, this); |
1749 } | 1729 } |
1750 if (!%IsInitializedIntlObjectOfType(this, 'dateformat')) { | 1730 if (!%IsInitializedIntlObjectOfType(this, 'dateformat')) { |
1751 throw %make_type_error(kIncompatibleMethodReceiver, | 1731 throw %make_type_error(kIncompatibleMethodReceiver, |
1752 'Intl.DateTimeFormat.prototype.formatToParts', | 1732 'Intl.DateTimeFormat.prototype.formatToParts', |
1753 this); | 1733 this); |
1754 } | 1734 } |
1755 var dateMs; | 1735 var dateMs; |
1756 if (IS_UNDEFINED(dateValue)) { | 1736 if (IS_UNDEFINED(dateValue)) { |
1757 dateMs = %DateCurrentTime(); | 1737 dateMs = %DateCurrentTime(); |
1758 } else { | 1738 } else { |
1759 dateMs = TO_NUMBER(dateValue); | 1739 dateMs = TO_NUMBER(dateValue); |
1760 } | 1740 } |
1761 | 1741 |
1762 if (!NUMBER_IS_FINITE(dateMs)) throw %make_range_error(kDateRange); | 1742 if (!NUMBER_IS_FINITE(dateMs)) throw %make_range_error(kDateRange); |
1763 | 1743 |
1764 return %InternalDateFormatToParts( | 1744 return %InternalDateFormatToParts(this, new GlobalDate(dateMs)); |
1765 %GetImplFromInitializedIntlObject(this), new GlobalDate(dateMs)); | |
1766 } | 1745 } |
1767 | 1746 |
1768 %FunctionSetLength(FormatDateToParts, 0); | 1747 %FunctionSetLength(FormatDateToParts, 0); |
1769 | 1748 |
1770 | 1749 |
1771 // 0 because date is optional argument. | 1750 // 0 because date is optional argument. |
1772 AddBoundMethod(GlobalIntlDateTimeFormat, 'format', formatDate, 0, 'dateformat', | 1751 AddBoundMethod(GlobalIntlDateTimeFormat, 'format', formatDate, 0, 'dateformat', |
1773 true); | 1752 true); |
1774 | 1753 |
1775 | 1754 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1811 } | 1790 } |
1812 } | 1791 } |
1813 | 1792 |
1814 return result; | 1793 return result; |
1815 } | 1794 } |
1816 | 1795 |
1817 /** | 1796 /** |
1818 * Initializes the given object so it's a valid BreakIterator instance. | 1797 * Initializes the given object so it's a valid BreakIterator instance. |
1819 * Useful for subclassing. | 1798 * Useful for subclassing. |
1820 */ | 1799 */ |
1821 function initializeBreakIterator(iterator, locales, options) { | 1800 function CreateBreakIterator(locales, options) { |
1822 if (%IsInitializedIntlObject(iterator)) { | |
1823 throw %make_type_error(kReinitializeIntl, "v8BreakIterator"); | |
1824 } | |
1825 | |
1826 if (IS_UNDEFINED(options)) { | 1801 if (IS_UNDEFINED(options)) { |
1827 options = {}; | 1802 options = {}; |
1828 } | 1803 } |
1829 | 1804 |
1830 var getOption = getGetOption(options, 'breakiterator'); | 1805 var getOption = getGetOption(options, 'breakiterator'); |
1831 | 1806 |
1832 var internalOptions = {}; | 1807 var internalOptions = {}; |
1833 | 1808 |
1834 defineWEProperty(internalOptions, 'type', getOption( | 1809 defineWEProperty(internalOptions, 'type', getOption( |
1835 'type', 'string', ['character', 'word', 'sentence', 'line'], 'word')); | 1810 'type', 'string', ['character', 'word', 'sentence', 'line'], 'word')); |
1836 | 1811 |
1837 var locale = resolveLocale('breakiterator', locales, options); | 1812 var locale = resolveLocale('breakiterator', locales, options); |
1838 var resolved = %object_define_properties({}, { | 1813 var resolved = %object_define_properties({}, { |
1839 requestedLocale: {value: locale.locale, writable: true}, | 1814 requestedLocale: {value: locale.locale, writable: true}, |
1840 type: {value: internalOptions.type, writable: true}, | 1815 type: {value: internalOptions.type, writable: true}, |
1841 locale: {writable: true} | 1816 locale: {writable: true} |
1842 }); | 1817 }); |
1843 | 1818 |
1844 var internalIterator = %CreateBreakIterator(locale.locale, | 1819 var iterator = %CreateBreakIterator(locale.locale, internalOptions, resolved); |
1845 internalOptions, | |
1846 resolved); | |
1847 | 1820 |
1848 %MarkAsInitializedIntlObjectOfType(iterator, 'breakiterator', | 1821 %MarkAsInitializedIntlObjectOfType(iterator, 'breakiterator'); |
1849 internalIterator); | |
1850 iterator[resolvedSymbol] = resolved; | 1822 iterator[resolvedSymbol] = resolved; |
1851 | 1823 |
1852 return iterator; | 1824 return iterator; |
1853 } | 1825 } |
1854 | 1826 |
1855 | 1827 |
1856 /** | 1828 /** |
1857 * Constructs Intl.v8BreakIterator object given optional locales and options | 1829 * Constructs Intl.v8BreakIterator object given optional locales and options |
1858 * parameters. | 1830 * parameters. |
1859 * | 1831 * |
1860 * @constructor | 1832 * @constructor |
1861 */ | 1833 */ |
1862 function v8BreakIteratorConstructor() { | 1834 function v8BreakIteratorConstructor() { |
1863 return IntlConstruct(this, GlobalIntlv8BreakIterator, initializeBreakIterator, | 1835 return IntlConstruct(this, GlobalIntlv8BreakIterator, CreateBreakIterator, |
1864 new.target, arguments); | 1836 new.target, arguments); |
1865 } | 1837 } |
1866 %SetCode(GlobalIntlv8BreakIterator, v8BreakIteratorConstructor); | 1838 %SetCode(GlobalIntlv8BreakIterator, v8BreakIteratorConstructor); |
1867 | 1839 |
1868 | 1840 |
1869 /** | 1841 /** |
1870 * BreakIterator resolvedOptions method. | 1842 * BreakIterator resolvedOptions method. |
1871 */ | 1843 */ |
1872 InstallFunction(GlobalIntlv8BreakIterator.prototype, 'resolvedOptions', | 1844 InstallFunction(GlobalIntlv8BreakIterator.prototype, 'resolvedOptions', |
1873 function() { | 1845 function() { |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1905 return supportedLocalesOf('breakiterator', locales, arguments[1]); | 1877 return supportedLocalesOf('breakiterator', locales, arguments[1]); |
1906 } | 1878 } |
1907 ); | 1879 ); |
1908 | 1880 |
1909 | 1881 |
1910 /** | 1882 /** |
1911 * Adopts text to segment using the iterator. Old text, if present, | 1883 * Adopts text to segment using the iterator. Old text, if present, |
1912 * gets discarded. | 1884 * gets discarded. |
1913 */ | 1885 */ |
1914 function adoptText(iterator, text) { | 1886 function adoptText(iterator, text) { |
1915 %BreakIteratorAdoptText(%GetImplFromInitializedIntlObject(iterator), | 1887 %BreakIteratorAdoptText(iterator, TO_STRING(text)); |
1916 TO_STRING(text)); | |
1917 } | 1888 } |
1918 | 1889 |
1919 | 1890 |
1920 /** | 1891 /** |
1921 * Returns index of the first break in the string and moves current pointer. | 1892 * Returns index of the first break in the string and moves current pointer. |
1922 */ | 1893 */ |
1923 function first(iterator) { | 1894 function first(iterator) { |
1924 return %BreakIteratorFirst(%GetImplFromInitializedIntlObject(iterator)); | 1895 return %BreakIteratorFirst(iterator); |
1925 } | 1896 } |
1926 | 1897 |
1927 | 1898 |
1928 /** | 1899 /** |
1929 * Returns the index of the next break and moves the pointer. | 1900 * Returns the index of the next break and moves the pointer. |
1930 */ | 1901 */ |
1931 function next(iterator) { | 1902 function next(iterator) { |
1932 return %BreakIteratorNext(%GetImplFromInitializedIntlObject(iterator)); | 1903 return %BreakIteratorNext(iterator); |
1933 } | 1904 } |
1934 | 1905 |
1935 | 1906 |
1936 /** | 1907 /** |
1937 * Returns index of the current break. | 1908 * Returns index of the current break. |
1938 */ | 1909 */ |
1939 function current(iterator) { | 1910 function current(iterator) { |
1940 return %BreakIteratorCurrent(%GetImplFromInitializedIntlObject(iterator)); | 1911 return %BreakIteratorCurrent(iterator); |
1941 } | 1912 } |
1942 | 1913 |
1943 | 1914 |
1944 /** | 1915 /** |
1945 * Returns type of the current break. | 1916 * Returns type of the current break. |
1946 */ | 1917 */ |
1947 function breakType(iterator) { | 1918 function breakType(iterator) { |
1948 return %BreakIteratorBreakType(%GetImplFromInitializedIntlObject(iterator)); | 1919 return %BreakIteratorBreakType(iterator); |
1949 } | 1920 } |
1950 | 1921 |
1951 | 1922 |
1952 AddBoundMethod(GlobalIntlv8BreakIterator, 'adoptText', adoptText, 1, | 1923 AddBoundMethod(GlobalIntlv8BreakIterator, 'adoptText', adoptText, 1, |
1953 'breakiterator'); | 1924 'breakiterator'); |
1954 AddBoundMethod(GlobalIntlv8BreakIterator, 'first', first, 0, 'breakiterator'); | 1925 AddBoundMethod(GlobalIntlv8BreakIterator, 'first', first, 0, 'breakiterator'); |
1955 AddBoundMethod(GlobalIntlv8BreakIterator, 'next', next, 0, 'breakiterator'); | 1926 AddBoundMethod(GlobalIntlv8BreakIterator, 'next', next, 0, 'breakiterator'); |
1956 AddBoundMethod(GlobalIntlv8BreakIterator, 'current', current, 0, | 1927 AddBoundMethod(GlobalIntlv8BreakIterator, 'current', current, 0, |
1957 'breakiterator'); | 1928 'breakiterator'); |
1958 AddBoundMethod(GlobalIntlv8BreakIterator, 'breakType', breakType, 0, | 1929 AddBoundMethod(GlobalIntlv8BreakIterator, 'breakType', breakType, 0, |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2195 } | 2166 } |
2196 ); | 2167 ); |
2197 | 2168 |
2198 %FunctionRemovePrototype(FormatDateToParts); | 2169 %FunctionRemovePrototype(FormatDateToParts); |
2199 | 2170 |
2200 utils.Export(function(to) { | 2171 utils.Export(function(to) { |
2201 to.FormatDateToParts = FormatDateToParts; | 2172 to.FormatDateToParts = FormatDateToParts; |
2202 }); | 2173 }); |
2203 | 2174 |
2204 }) | 2175 }) |
OLD | NEW |