Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(338)

Side by Side Diff: src/i18n.js

Issue 253903003: Bugfix: internationalization routines fail on monkeypatching. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Comment response. Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | test/mjsunit/regress/regress-builtinbust-7.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 %SetNativeFlag(boundMethod); 274 %SetNativeFlag(boundMethod);
275 this[internalName] = boundMethod; 275 this[internalName] = boundMethod;
276 } 276 }
277 return this[internalName]; 277 return this[internalName];
278 } 278 }
279 279
280 %FunctionSetName(getter, methodName); 280 %FunctionSetName(getter, methodName);
281 %FunctionRemovePrototype(getter); 281 %FunctionRemovePrototype(getter);
282 %SetNativeFlag(getter); 282 %SetNativeFlag(getter);
283 283
284 $Object.defineProperty(obj.prototype, methodName, { 284 ObjectDefineProperty(obj.prototype, methodName, {
285 get: getter, 285 get: getter,
286 enumerable: false, 286 enumerable: false,
287 configurable: true 287 configurable: true
288 }); 288 });
289 } 289 }
290 290
291 291
292 /** 292 /**
293 * Returns an intersection of locales and service supported locales. 293 * Returns an intersection of locales and service supported locales.
294 * Parameter locales is treated as a priority list. 294 * Parameter locales is treated as a priority list.
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after
609 return extension === ''? '' : '-u' + extension; 609 return extension === ''? '' : '-u' + extension;
610 } 610 }
611 611
612 612
613 /** 613 /**
614 * Converts all OwnProperties into 614 * Converts all OwnProperties into
615 * configurable: false, writable: false, enumerable: true. 615 * configurable: false, writable: false, enumerable: true.
616 */ 616 */
617 function freezeArray(array) { 617 function freezeArray(array) {
618 array.forEach(function(element, index) { 618 array.forEach(function(element, index) {
619 $Object.defineProperty(array, index, {value: element, 619 ObjectDefineProperty(array, index, {value: element,
620 configurable: false, 620 configurable: false,
621 writable: false, 621 writable: false,
622 enumerable: true}); 622 enumerable: true});
623 }); 623 });
624 624
625 $Object.defineProperty(array, 'length', {value: array.length, 625 ObjectDefineProperty(array, 'length', {value: array.length,
626 writable: false}); 626 writable: false});
627
628 return array; 627 return array;
629 } 628 }
630 629
631 630
632 /** 631 /**
633 * It's sometimes desireable to leave user requested locale instead of ICU 632 * It's sometimes desireable to leave user requested locale instead of ICU
634 * supported one (zh-TW is equivalent to zh-Hant-TW, so we should keep shorter 633 * supported one (zh-TW is equivalent to zh-Hant-TW, so we should keep shorter
635 * one, if that was what user requested). 634 * one, if that was what user requested).
636 * This function returns user specified tag if its maximized form matches ICU 635 * This function returns user specified tag if its maximized form matches ICU
637 * resolved locale. If not we return ICU result. 636 * resolved locale. If not we return ICU result.
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
678 677
679 return available; 678 return available;
680 } 679 }
681 680
682 681
683 /** 682 /**
684 * Defines a property and sets writable and enumerable to true. 683 * Defines a property and sets writable and enumerable to true.
685 * Configurable is false by default. 684 * Configurable is false by default.
686 */ 685 */
687 function defineWEProperty(object, property, value) { 686 function defineWEProperty(object, property, value) {
688 $Object.defineProperty(object, property, 687 ObjectDefineProperty(object, property,
689 {value: value, writable: true, enumerable: true}); 688 {value: value, writable: true, enumerable: true});
690 } 689 }
691 690
692 691
693 /** 692 /**
694 * Adds property to an object if the value is not undefined. 693 * Adds property to an object if the value is not undefined.
695 * Sets configurable descriptor to false. 694 * Sets configurable descriptor to false.
696 */ 695 */
697 function addWEPropertyIfDefined(object, property, value) { 696 function addWEPropertyIfDefined(object, property, value) {
698 if (value !== undefined) { 697 if (value !== undefined) {
699 defineWEProperty(object, property, value); 698 defineWEProperty(object, property, value);
700 } 699 }
701 } 700 }
702 701
703 702
704 /** 703 /**
705 * Defines a property and sets writable, enumerable and configurable to true. 704 * Defines a property and sets writable, enumerable and configurable to true.
706 */ 705 */
707 function defineWECProperty(object, property, value) { 706 function defineWECProperty(object, property, value) {
708 $Object.defineProperty(object, property, 707 ObjectDefineProperty(object, property,
709 {value: value, 708 {value: value,
710 writable: true, 709 writable: true,
711 enumerable: true, 710 enumerable: true,
712 configurable: true}); 711 configurable: true});
713 } 712 }
714 713
715 714
716 /** 715 /**
717 * Adds property to an object if the value is not undefined. 716 * Adds property to an object if the value is not undefined.
718 * Sets all descriptors to true. 717 * Sets all descriptors to true.
719 */ 718 */
720 function addWECPropertyIfDefined(object, property, value) { 719 function addWECPropertyIfDefined(object, property, value) {
721 if (value !== undefined) { 720 if (value !== undefined) {
722 defineWECProperty(object, property, value); 721 defineWECProperty(object, property, value);
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
941 } else if (internalOptions.usage === 'search') { 940 } else if (internalOptions.usage === 'search') {
942 extension = '-u-co-search'; 941 extension = '-u-co-search';
943 } 942 }
944 defineWEProperty(internalOptions, 'collation', collation); 943 defineWEProperty(internalOptions, 'collation', collation);
945 944
946 var requestedLocale = locale.locale + extension; 945 var requestedLocale = locale.locale + extension;
947 946
948 // We define all properties C++ code may produce, to prevent security 947 // We define all properties C++ code may produce, to prevent security
949 // problems. If malicious user decides to redefine Object.prototype.locale 948 // problems. If malicious user decides to redefine Object.prototype.locale
950 // we can't just use plain x.locale = 'us' or in C++ Set("locale", "us"). 949 // we can't just use plain x.locale = 'us' or in C++ Set("locale", "us").
951 // Object.defineProperties will either succeed defining or throw an error. 950 // ObjectDefineProperties will either succeed defining or throw an error.
952 var resolved = $Object.defineProperties({}, { 951 var resolved = ObjectDefineProperties({}, {
953 caseFirst: {writable: true}, 952 caseFirst: {writable: true},
954 collation: {value: internalOptions.collation, writable: true}, 953 collation: {value: internalOptions.collation, writable: true},
955 ignorePunctuation: {writable: true}, 954 ignorePunctuation: {writable: true},
956 locale: {writable: true}, 955 locale: {writable: true},
957 numeric: {writable: true}, 956 numeric: {writable: true},
958 requestedLocale: {value: requestedLocale, writable: true}, 957 requestedLocale: {value: requestedLocale, writable: true},
959 sensitivity: {writable: true}, 958 sensitivity: {writable: true},
960 strength: {writable: true}, 959 strength: {writable: true},
961 usage: {value: internalOptions.usage, writable: true} 960 usage: {value: internalOptions.usage, writable: true}
962 }); 961 });
963 962
964 var internalCollator = %CreateCollator(requestedLocale, 963 var internalCollator = %CreateCollator(requestedLocale,
965 internalOptions, 964 internalOptions,
966 resolved); 965 resolved);
967 966
968 // Writable, configurable and enumerable are set to false by default. 967 // Writable, configurable and enumerable are set to false by default.
969 %MarkAsInitializedIntlObjectOfType(collator, 'collator', internalCollator); 968 %MarkAsInitializedIntlObjectOfType(collator, 'collator', internalCollator);
970 $Object.defineProperty(collator, 'resolved', {value: resolved}); 969 ObjectDefineProperty(collator, 'resolved', {value: resolved});
971 970
972 return collator; 971 return collator;
973 } 972 }
974 973
975 974
976 /** 975 /**
977 * Constructs Intl.Collator object given optional locales and options 976 * Constructs Intl.Collator object given optional locales and options
978 * parameters. 977 * parameters.
979 * 978 *
980 * @constructor 979 * @constructor
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
1157 defineWEProperty(internalOptions, 'useGrouping', getOption( 1156 defineWEProperty(internalOptions, 'useGrouping', getOption(
1158 'useGrouping', 'boolean', undefined, true)); 1157 'useGrouping', 'boolean', undefined, true));
1159 1158
1160 // ICU prefers options to be passed using -u- extension key/values for 1159 // ICU prefers options to be passed using -u- extension key/values for
1161 // number format, so we need to build that. 1160 // number format, so we need to build that.
1162 var extensionMap = parseExtension(locale.extension); 1161 var extensionMap = parseExtension(locale.extension);
1163 var extension = setOptions(options, extensionMap, NUMBER_FORMAT_KEY_MAP, 1162 var extension = setOptions(options, extensionMap, NUMBER_FORMAT_KEY_MAP,
1164 getOption, internalOptions); 1163 getOption, internalOptions);
1165 1164
1166 var requestedLocale = locale.locale + extension; 1165 var requestedLocale = locale.locale + extension;
1167 var resolved = $Object.defineProperties({}, { 1166 var resolved = ObjectDefineProperties({}, {
1168 currency: {writable: true}, 1167 currency: {writable: true},
1169 currencyDisplay: {writable: true}, 1168 currencyDisplay: {writable: true},
1170 locale: {writable: true}, 1169 locale: {writable: true},
1171 maximumFractionDigits: {writable: true}, 1170 maximumFractionDigits: {writable: true},
1172 minimumFractionDigits: {writable: true}, 1171 minimumFractionDigits: {writable: true},
1173 minimumIntegerDigits: {writable: true}, 1172 minimumIntegerDigits: {writable: true},
1174 numberingSystem: {writable: true}, 1173 numberingSystem: {writable: true},
1175 requestedLocale: {value: requestedLocale, writable: true}, 1174 requestedLocale: {value: requestedLocale, writable: true},
1176 style: {value: internalOptions.style, writable: true}, 1175 style: {value: internalOptions.style, writable: true},
1177 useGrouping: {writable: true} 1176 useGrouping: {writable: true}
1178 }); 1177 });
1179 if (internalOptions.hasOwnProperty('minimumSignificantDigits')) { 1178 if (internalOptions.hasOwnProperty('minimumSignificantDigits')) {
1180 defineWEProperty(resolved, 'minimumSignificantDigits', undefined); 1179 defineWEProperty(resolved, 'minimumSignificantDigits', undefined);
1181 } 1180 }
1182 if (internalOptions.hasOwnProperty('maximumSignificantDigits')) { 1181 if (internalOptions.hasOwnProperty('maximumSignificantDigits')) {
1183 defineWEProperty(resolved, 'maximumSignificantDigits', undefined); 1182 defineWEProperty(resolved, 'maximumSignificantDigits', undefined);
1184 } 1183 }
1185 var formatter = %CreateNumberFormat(requestedLocale, 1184 var formatter = %CreateNumberFormat(requestedLocale,
1186 internalOptions, 1185 internalOptions,
1187 resolved); 1186 resolved);
1188 1187
1189 // We can't get information about number or currency style from ICU, so we 1188 // We can't get information about number or currency style from ICU, so we
1190 // assume user request was fulfilled. 1189 // assume user request was fulfilled.
1191 if (internalOptions.style === 'currency') { 1190 if (internalOptions.style === 'currency') {
1192 $Object.defineProperty(resolved, 'currencyDisplay', {value: currencyDisplay, 1191 ObjectDefineProperty(resolved, 'currencyDisplay', {value: currencyDisplay,
1193 writable: true}); 1192 writable: true});
1194 } 1193 }
1195 1194
1196 %MarkAsInitializedIntlObjectOfType(numberFormat, 'numberformat', formatter); 1195 %MarkAsInitializedIntlObjectOfType(numberFormat, 'numberformat', formatter);
1197 $Object.defineProperty(numberFormat, 'resolved', {value: resolved}); 1196 ObjectDefineProperty(numberFormat, 'resolved', {value: resolved});
1198 1197
1199 return numberFormat; 1198 return numberFormat;
1200 } 1199 }
1201 1200
1202 1201
1203 /** 1202 /**
1204 * Constructs Intl.NumberFormat object given optional locales and options 1203 * Constructs Intl.NumberFormat object given optional locales and options
1205 * parameters. 1204 * parameters.
1206 * 1205 *
1207 * @constructor 1206 * @constructor
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
1459 1458
1460 return options; 1459 return options;
1461 } 1460 }
1462 1461
1463 1462
1464 /** 1463 /**
1465 * Returns options with at least default values in it. 1464 * Returns options with at least default values in it.
1466 */ 1465 */
1467 function toDateTimeOptions(options, required, defaults) { 1466 function toDateTimeOptions(options, required, defaults) {
1468 if (options === undefined) { 1467 if (options === undefined) {
1469 options = null; 1468 options = {};
1470 } else { 1469 } else {
1471 options = toObject(options); 1470 options = TO_OBJECT_INLINE(options);
1472 } 1471 }
1473 1472
1474 options = $Object.apply(this, [options]);
1475
1476 var needsDefault = true; 1473 var needsDefault = true;
1477 if ((required === 'date' || required === 'any') && 1474 if ((required === 'date' || required === 'any') &&
1478 (options.weekday !== undefined || options.year !== undefined || 1475 (options.weekday !== undefined || options.year !== undefined ||
1479 options.month !== undefined || options.day !== undefined)) { 1476 options.month !== undefined || options.day !== undefined)) {
1480 needsDefault = false; 1477 needsDefault = false;
1481 } 1478 }
1482 1479
1483 if ((required === 'time' || required === 'any') && 1480 if ((required === 'time' || required === 'any') &&
1484 (options.hour !== undefined || options.minute !== undefined || 1481 (options.hour !== undefined || options.minute !== undefined ||
1485 options.second !== undefined)) { 1482 options.second !== undefined)) {
1486 needsDefault = false; 1483 needsDefault = false;
1487 } 1484 }
1488 1485
1489 if (needsDefault && (defaults === 'date' || defaults === 'all')) { 1486 if (needsDefault && (defaults === 'date' || defaults === 'all')) {
1490 $Object.defineProperty(options, 'year', {value: 'numeric', 1487 ObjectDefineProperty(options, 'year', {value: 'numeric',
1488 writable: true,
1489 enumerable: true,
1490 configurable: true});
1491 ObjectDefineProperty(options, 'month', {value: 'numeric',
1492 writable: true,
1493 enumerable: true,
1494 configurable: true});
1495 ObjectDefineProperty(options, 'day', {value: 'numeric',
1496 writable: true,
1497 enumerable: true,
1498 configurable: true});
1499 }
1500
1501 if (needsDefault && (defaults === 'time' || defaults === 'all')) {
1502 ObjectDefineProperty(options, 'hour', {value: 'numeric',
1491 writable: true, 1503 writable: true,
1492 enumerable: true, 1504 enumerable: true,
1493 configurable: true}); 1505 configurable: true});
1494 $Object.defineProperty(options, 'month', {value: 'numeric', 1506 ObjectDefineProperty(options, 'minute', {value: 'numeric',
1495 writable: true,
1496 enumerable: true,
1497 configurable: true});
1498 $Object.defineProperty(options, 'day', {value: 'numeric',
1499 writable: true,
1500 enumerable: true,
1501 configurable: true});
1502 }
1503
1504 if (needsDefault && (defaults === 'time' || defaults === 'all')) {
1505 $Object.defineProperty(options, 'hour', {value: 'numeric',
1506 writable: true,
1507 enumerable: true,
1508 configurable: true});
1509 $Object.defineProperty(options, 'minute', {value: 'numeric',
1510 writable: true, 1507 writable: true,
1511 enumerable: true, 1508 enumerable: true,
1512 configurable: true}); 1509 configurable: true});
1513 $Object.defineProperty(options, 'second', {value: 'numeric', 1510 ObjectDefineProperty(options, 'second', {value: 'numeric',
1514 writable: true, 1511 writable: true,
1515 enumerable: true, 1512 enumerable: true,
1516 configurable: true}); 1513 configurable: true});
1517 } 1514 }
1518 1515
1519 return options; 1516 return options;
1520 } 1517 }
1521 1518
1522 1519
1523 /** 1520 /**
(...skipping 30 matching lines...) Expand all
1554 var tz = canonicalizeTimeZoneID(options.timeZone); 1551 var tz = canonicalizeTimeZoneID(options.timeZone);
1555 1552
1556 // ICU prefers options to be passed using -u- extension key/values, so 1553 // ICU prefers options to be passed using -u- extension key/values, so
1557 // we need to build that. 1554 // we need to build that.
1558 var internalOptions = {}; 1555 var internalOptions = {};
1559 var extensionMap = parseExtension(locale.extension); 1556 var extensionMap = parseExtension(locale.extension);
1560 var extension = setOptions(options, extensionMap, DATETIME_FORMAT_KEY_MAP, 1557 var extension = setOptions(options, extensionMap, DATETIME_FORMAT_KEY_MAP,
1561 getOption, internalOptions); 1558 getOption, internalOptions);
1562 1559
1563 var requestedLocale = locale.locale + extension; 1560 var requestedLocale = locale.locale + extension;
1564 var resolved = $Object.defineProperties({}, { 1561 var resolved = ObjectDefineProperties({}, {
1565 calendar: {writable: true}, 1562 calendar: {writable: true},
1566 day: {writable: true}, 1563 day: {writable: true},
1567 era: {writable: true}, 1564 era: {writable: true},
1568 hour12: {writable: true}, 1565 hour12: {writable: true},
1569 hour: {writable: true}, 1566 hour: {writable: true},
1570 locale: {writable: true}, 1567 locale: {writable: true},
1571 minute: {writable: true}, 1568 minute: {writable: true},
1572 month: {writable: true}, 1569 month: {writable: true},
1573 numberingSystem: {writable: true}, 1570 numberingSystem: {writable: true},
1574 pattern: {writable: true}, 1571 pattern: {writable: true},
1575 requestedLocale: {value: requestedLocale, writable: true}, 1572 requestedLocale: {value: requestedLocale, writable: true},
1576 second: {writable: true}, 1573 second: {writable: true},
1577 timeZone: {writable: true}, 1574 timeZone: {writable: true},
1578 timeZoneName: {writable: true}, 1575 timeZoneName: {writable: true},
1579 tz: {value: tz, writable: true}, 1576 tz: {value: tz, writable: true},
1580 weekday: {writable: true}, 1577 weekday: {writable: true},
1581 year: {writable: true} 1578 year: {writable: true}
1582 }); 1579 });
1583 1580
1584 var formatter = %CreateDateTimeFormat( 1581 var formatter = %CreateDateTimeFormat(
1585 requestedLocale, {skeleton: ldmlString, timeZone: tz}, resolved); 1582 requestedLocale, {skeleton: ldmlString, timeZone: tz}, resolved);
1586 1583
1587 if (tz !== undefined && tz !== resolved.timeZone) { 1584 if (tz !== undefined && tz !== resolved.timeZone) {
1588 throw new $RangeError('Unsupported time zone specified ' + tz); 1585 throw new $RangeError('Unsupported time zone specified ' + tz);
1589 } 1586 }
1590 1587
1591 %MarkAsInitializedIntlObjectOfType(dateFormat, 'dateformat', formatter); 1588 %MarkAsInitializedIntlObjectOfType(dateFormat, 'dateformat', formatter);
1592 $Object.defineProperty(dateFormat, 'resolved', {value: resolved}); 1589 ObjectDefineProperty(dateFormat, 'resolved', {value: resolved});
1593 1590
1594 return dateFormat; 1591 return dateFormat;
1595 } 1592 }
1596 1593
1597 1594
1598 /** 1595 /**
1599 * Constructs Intl.DateTimeFormat object given optional locales and options 1596 * Constructs Intl.DateTimeFormat object given optional locales and options
1600 * parameters. 1597 * parameters.
1601 * 1598 *
1602 * @constructor 1599 * @constructor
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
1776 } 1773 }
1777 1774
1778 var getOption = getGetOption(options, 'breakiterator'); 1775 var getOption = getGetOption(options, 'breakiterator');
1779 1776
1780 var internalOptions = {}; 1777 var internalOptions = {};
1781 1778
1782 defineWEProperty(internalOptions, 'type', getOption( 1779 defineWEProperty(internalOptions, 'type', getOption(
1783 'type', 'string', ['character', 'word', 'sentence', 'line'], 'word')); 1780 'type', 'string', ['character', 'word', 'sentence', 'line'], 'word'));
1784 1781
1785 var locale = resolveLocale('breakiterator', locales, options); 1782 var locale = resolveLocale('breakiterator', locales, options);
1786 var resolved = $Object.defineProperties({}, { 1783 var resolved = ObjectDefineProperties({}, {
1787 requestedLocale: {value: locale.locale, writable: true}, 1784 requestedLocale: {value: locale.locale, writable: true},
1788 type: {value: internalOptions.type, writable: true}, 1785 type: {value: internalOptions.type, writable: true},
1789 locale: {writable: true} 1786 locale: {writable: true}
1790 }); 1787 });
1791 1788
1792 var internalIterator = %CreateBreakIterator(locale.locale, 1789 var internalIterator = %CreateBreakIterator(locale.locale,
1793 internalOptions, 1790 internalOptions,
1794 resolved); 1791 resolved);
1795 1792
1796 %MarkAsInitializedIntlObjectOfType(iterator, 'breakiterator', 1793 %MarkAsInitializedIntlObjectOfType(iterator, 'breakiterator',
1797 internalIterator); 1794 internalIterator);
1798 $Object.defineProperty(iterator, 'resolved', {value: resolved}); 1795 ObjectDefineProperty(iterator, 'resolved', {value: resolved});
1799 1796
1800 return iterator; 1797 return iterator;
1801 } 1798 }
1802 1799
1803 1800
1804 /** 1801 /**
1805 * Constructs Intl.v8BreakIterator object given optional locales and options 1802 * Constructs Intl.v8BreakIterator object given optional locales and options
1806 * parameters. 1803 * parameters.
1807 * 1804 *
1808 * @constructor 1805 * @constructor
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
1954 return defaultObjects[service]; 1951 return defaultObjects[service];
1955 } 1952 }
1956 return new savedObjects[service](locales, useOptions); 1953 return new savedObjects[service](locales, useOptions);
1957 } 1954 }
1958 1955
1959 1956
1960 /** 1957 /**
1961 * Compares this and that, and returns less than 0, 0 or greater than 0 value. 1958 * Compares this and that, and returns less than 0, 0 or greater than 0 value.
1962 * Overrides the built-in method. 1959 * Overrides the built-in method.
1963 */ 1960 */
1964 $Object.defineProperty($String.prototype, 'localeCompare', { 1961 ObjectDefineProperty($String.prototype, 'localeCompare', {
1965 value: function(that) { 1962 value: function(that) {
1966 if (%_IsConstructCall()) { 1963 if (%_IsConstructCall()) {
1967 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR); 1964 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR);
1968 } 1965 }
1969 1966
1970 if (IS_NULL_OR_UNDEFINED(this)) { 1967 if (IS_NULL_OR_UNDEFINED(this)) {
1971 throw new $TypeError('Method invoked on undefined or null value.'); 1968 throw new $TypeError('Method invoked on undefined or null value.');
1972 } 1969 }
1973 1970
1974 var locales = %_Arguments(1); 1971 var locales = %_Arguments(1);
(...skipping 10 matching lines...) Expand all
1985 %SetNativeFlag($String.prototype.localeCompare); 1982 %SetNativeFlag($String.prototype.localeCompare);
1986 1983
1987 1984
1988 /** 1985 /**
1989 * Unicode normalization. This method is called with one argument that 1986 * Unicode normalization. This method is called with one argument that
1990 * specifies the normalization form. 1987 * specifies the normalization form.
1991 * If none is specified, "NFC" is assumed. 1988 * If none is specified, "NFC" is assumed.
1992 * If the form is not one of "NFC", "NFD", "NFKC", or "NFKD", then throw 1989 * If the form is not one of "NFC", "NFD", "NFKC", or "NFKD", then throw
1993 * a RangeError Exception. 1990 * a RangeError Exception.
1994 */ 1991 */
1995 $Object.defineProperty($String.prototype, 'normalize', { 1992 ObjectDefineProperty($String.prototype, 'normalize', {
1996 value: function(that) { 1993 value: function(that) {
1997 if (%_IsConstructCall()) { 1994 if (%_IsConstructCall()) {
1998 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR); 1995 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR);
1999 } 1996 }
2000 1997
2001 CHECK_OBJECT_COERCIBLE(this, "String.prototype.normalize"); 1998 CHECK_OBJECT_COERCIBLE(this, "String.prototype.normalize");
2002 1999
2003 var form = $String(%_Arguments(0) || 'NFC'); 2000 var form = $String(%_Arguments(0) || 'NFC');
2004 2001
2005 var normalizationForm = NORMALIZATION_FORMS.indexOf(form); 2002 var normalizationForm = NORMALIZATION_FORMS.indexOf(form);
(...skipping 10 matching lines...) Expand all
2016 }); 2013 });
2017 %FunctionSetName($String.prototype.normalize, 'normalize'); 2014 %FunctionSetName($String.prototype.normalize, 'normalize');
2018 %FunctionRemovePrototype($String.prototype.normalize); 2015 %FunctionRemovePrototype($String.prototype.normalize);
2019 %SetNativeFlag($String.prototype.normalize); 2016 %SetNativeFlag($String.prototype.normalize);
2020 2017
2021 2018
2022 /** 2019 /**
2023 * Formats a Number object (this) using locale and options values. 2020 * Formats a Number object (this) using locale and options values.
2024 * If locale or options are omitted, defaults are used. 2021 * If locale or options are omitted, defaults are used.
2025 */ 2022 */
2026 $Object.defineProperty($Number.prototype, 'toLocaleString', { 2023 ObjectDefineProperty($Number.prototype, 'toLocaleString', {
2027 value: function() { 2024 value: function() {
2028 if (%_IsConstructCall()) { 2025 if (%_IsConstructCall()) {
2029 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR); 2026 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR);
2030 } 2027 }
2031 2028
2032 if (!(this instanceof $Number) && typeof(this) !== 'number') { 2029 if (!(this instanceof $Number) && typeof(this) !== 'number') {
2033 throw new $TypeError('Method invoked on an object that is not Number.'); 2030 throw new $TypeError('Method invoked on an object that is not Number.');
2034 } 2031 }
2035 2032
2036 var locales = %_Arguments(0); 2033 var locales = %_Arguments(0);
(...skipping 29 matching lines...) Expand all
2066 2063
2067 return formatDate(dateFormat, date); 2064 return formatDate(dateFormat, date);
2068 } 2065 }
2069 2066
2070 2067
2071 /** 2068 /**
2072 * Formats a Date object (this) using locale and options values. 2069 * Formats a Date object (this) using locale and options values.
2073 * If locale or options are omitted, defaults are used - both date and time are 2070 * If locale or options are omitted, defaults are used - both date and time are
2074 * present in the output. 2071 * present in the output.
2075 */ 2072 */
2076 $Object.defineProperty($Date.prototype, 'toLocaleString', { 2073 ObjectDefineProperty($Date.prototype, 'toLocaleString', {
2077 value: function() { 2074 value: function() {
2078 if (%_IsConstructCall()) { 2075 if (%_IsConstructCall()) {
2079 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR); 2076 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR);
2080 } 2077 }
2081 2078
2082 var locales = %_Arguments(0); 2079 var locales = %_Arguments(0);
2083 var options = %_Arguments(1); 2080 var options = %_Arguments(1);
2084 return toLocaleDateTime( 2081 return toLocaleDateTime(
2085 this, locales, options, 'any', 'all', 'dateformatall'); 2082 this, locales, options, 'any', 'all', 'dateformatall');
2086 }, 2083 },
2087 writable: true, 2084 writable: true,
2088 configurable: true, 2085 configurable: true,
2089 enumerable: false 2086 enumerable: false
2090 }); 2087 });
2091 %FunctionSetName($Date.prototype.toLocaleString, 'toLocaleString'); 2088 %FunctionSetName($Date.prototype.toLocaleString, 'toLocaleString');
2092 %FunctionRemovePrototype($Date.prototype.toLocaleString); 2089 %FunctionRemovePrototype($Date.prototype.toLocaleString);
2093 %SetNativeFlag($Date.prototype.toLocaleString); 2090 %SetNativeFlag($Date.prototype.toLocaleString);
2094 2091
2095 2092
2096 /** 2093 /**
2097 * Formats a Date object (this) using locale and options values. 2094 * Formats a Date object (this) using locale and options values.
2098 * If locale or options are omitted, defaults are used - only date is present 2095 * If locale or options are omitted, defaults are used - only date is present
2099 * in the output. 2096 * in the output.
2100 */ 2097 */
2101 $Object.defineProperty($Date.prototype, 'toLocaleDateString', { 2098 ObjectDefineProperty($Date.prototype, 'toLocaleDateString', {
2102 value: function() { 2099 value: function() {
2103 if (%_IsConstructCall()) { 2100 if (%_IsConstructCall()) {
2104 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR); 2101 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR);
2105 } 2102 }
2106 2103
2107 var locales = %_Arguments(0); 2104 var locales = %_Arguments(0);
2108 var options = %_Arguments(1); 2105 var options = %_Arguments(1);
2109 return toLocaleDateTime( 2106 return toLocaleDateTime(
2110 this, locales, options, 'date', 'date', 'dateformatdate'); 2107 this, locales, options, 'date', 'date', 'dateformatdate');
2111 }, 2108 },
2112 writable: true, 2109 writable: true,
2113 configurable: true, 2110 configurable: true,
2114 enumerable: false 2111 enumerable: false
2115 }); 2112 });
2116 %FunctionSetName($Date.prototype.toLocaleDateString, 'toLocaleDateString'); 2113 %FunctionSetName($Date.prototype.toLocaleDateString, 'toLocaleDateString');
2117 %FunctionRemovePrototype($Date.prototype.toLocaleDateString); 2114 %FunctionRemovePrototype($Date.prototype.toLocaleDateString);
2118 %SetNativeFlag($Date.prototype.toLocaleDateString); 2115 %SetNativeFlag($Date.prototype.toLocaleDateString);
2119 2116
2120 2117
2121 /** 2118 /**
2122 * Formats a Date object (this) using locale and options values. 2119 * Formats a Date object (this) using locale and options values.
2123 * If locale or options are omitted, defaults are used - only time is present 2120 * If locale or options are omitted, defaults are used - only time is present
2124 * in the output. 2121 * in the output.
2125 */ 2122 */
2126 $Object.defineProperty($Date.prototype, 'toLocaleTimeString', { 2123 ObjectDefineProperty($Date.prototype, 'toLocaleTimeString', {
2127 value: function() { 2124 value: function() {
2128 if (%_IsConstructCall()) { 2125 if (%_IsConstructCall()) {
2129 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR); 2126 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR);
2130 } 2127 }
2131 2128
2132 var locales = %_Arguments(0); 2129 var locales = %_Arguments(0);
2133 var options = %_Arguments(1); 2130 var options = %_Arguments(1);
2134 return toLocaleDateTime( 2131 return toLocaleDateTime(
2135 this, locales, options, 'time', 'time', 'dateformattime'); 2132 this, locales, options, 'time', 'time', 'dateformattime');
2136 }, 2133 },
2137 writable: true, 2134 writable: true,
2138 configurable: true, 2135 configurable: true,
2139 enumerable: false 2136 enumerable: false
2140 }); 2137 });
2141 %FunctionSetName($Date.prototype.toLocaleTimeString, 'toLocaleTimeString'); 2138 %FunctionSetName($Date.prototype.toLocaleTimeString, 'toLocaleTimeString');
2142 %FunctionRemovePrototype($Date.prototype.toLocaleTimeString); 2139 %FunctionRemovePrototype($Date.prototype.toLocaleTimeString);
2143 %SetNativeFlag($Date.prototype.toLocaleTimeString); 2140 %SetNativeFlag($Date.prototype.toLocaleTimeString);
2144 2141
2145 return Intl; 2142 return Intl;
2146 }())}); 2143 }())});
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/regress/regress-builtinbust-7.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698