1c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org// Copyright 2013 the V8 project authors. All rights reserved.
2c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org// Redistribution and use in source and binary forms, with or without
3c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org// modification, are permitted provided that the following conditions are
4c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org// met:
5c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org//
6c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org//     * Redistributions of source code must retain the above copyright
7c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org//       notice, this list of conditions and the following disclaimer.
8c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org//     * Redistributions in binary form must reproduce the above
9c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org//       copyright notice, this list of conditions and the following
10c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org//       disclaimer in the documentation and/or other materials provided
11c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org//       with the distribution.
12c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org//     * Neither the name of Google Inc. nor the names of its
13c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org//       contributors may be used to endorse or promote products derived
14c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org//       from this software without specific prior written permission.
15c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org//
16c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org// limitations under the License.
28c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
29c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org// ECMAScript 402 API implementation is broken into separate files for
30c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org// each service. The build system combines them together into one
31c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org// Intl namespace.
32c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
33c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
34c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org// Save references to Intl objects and methods we use, for added security.
35c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.orgvar savedObjects = {
36c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  'collator': Intl.Collator,
37c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  'numberformat': Intl.NumberFormat,
38c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  'dateformatall': Intl.DateTimeFormat,
39c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  'dateformatdate': Intl.DateTimeFormat,
40c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  'dateformattime': Intl.DateTimeFormat
41c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org};
42c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
43c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
44c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org// Default (created with undefined locales and options parameters) collator,
45c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org// number and date format instances. They'll be created as needed.
46c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.orgvar defaultObjects = {
47c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  'collator': undefined,
48c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  'numberformat': undefined,
49c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  'dateformatall': undefined,
50c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  'dateformatdate': undefined,
51c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  'dateformattime': undefined,
52c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org};
53c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
54c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
55c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org/**
56c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org * Returns cached or newly created instance of a given service.
57c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org * We cache only default instances (where no locales or options are provided).
58c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org */
59c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.orgfunction cachedOrNewService(service, locales, options, defaults) {
60c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  var useOptions = (defaults === undefined) ? options : defaults;
61c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  if (locales === undefined && options === undefined) {
62c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    if (defaultObjects[service] === undefined) {
63c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org      defaultObjects[service] = new savedObjects[service](locales, useOptions);
64c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    }
65c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    return defaultObjects[service];
66c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  }
67c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  return new savedObjects[service](locales, useOptions);
68c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org}
69c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
70c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
71c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org/**
72c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org * Compares this and that, and returns less than 0, 0 or greater than 0 value.
73c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org * Overrides the built-in method.
74c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org */
75c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.orgObject.defineProperty(String.prototype, 'localeCompare', {
76c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  value: function(that) {
77c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    if (%_IsConstructCall()) {
78c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org      throw new TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR);
79c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    }
80c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
81c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    if (this === undefined || this === null) {
82c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org      throw new TypeError('Method invoked on undefined or null value.');
83c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    }
84c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
85c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    var locales = arguments[1];
86c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    var options = arguments[2];
87c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    var collator = cachedOrNewService('collator', locales, options);
88c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    return compare(collator, this, that);
89c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  },
90c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  writable: true,
91c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  configurable: true,
92c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  enumerable: false
93c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org});
94c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org%FunctionSetName(String.prototype.localeCompare, 'localeCompare');
95c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org%FunctionRemovePrototype(String.prototype.localeCompare);
96c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org%SetNativeFlag(String.prototype.localeCompare);
97c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
98c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
99c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org/**
100c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org * Formats a Number object (this) using locale and options values.
101c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org * If locale or options are omitted, defaults are used.
102c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org */
103c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.orgObject.defineProperty(Number.prototype, 'toLocaleString', {
104c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  value: function() {
105c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    if (%_IsConstructCall()) {
106c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org      throw new TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR);
107c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    }
108c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
109c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    if (!(this instanceof Number) && typeof(this) !== 'number') {
110c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org      throw new TypeError('Method invoked on an object that is not Number.');
111c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    }
112c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
113c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    var locales = arguments[0];
114c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    var options = arguments[1];
115c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    var numberFormat = cachedOrNewService('numberformat', locales, options);
116c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    return formatNumber(numberFormat, this);
117c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  },
118c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  writable: true,
119c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  configurable: true,
120c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  enumerable: false
121c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org});
122c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org%FunctionSetName(Number.prototype.toLocaleString, 'toLocaleString');
123c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org%FunctionRemovePrototype(Number.prototype.toLocaleString);
124c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org%SetNativeFlag(Number.prototype.toLocaleString);
125c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
126c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
127c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org/**
128c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org * Returns actual formatted date or fails if date parameter is invalid.
129c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org */
130c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.orgfunction toLocaleDateTime(date, locales, options, required, defaults, service) {
131c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  if (!(date instanceof Date)) {
132c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    throw new TypeError('Method invoked on an object that is not Date.');
133c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  }
134c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
135c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  if (isNaN(date)) {
136c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    return 'Invalid Date';
137c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  }
138c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
139c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  var internalOptions = toDateTimeOptions(options, required, defaults);
140c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
141c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  var dateFormat =
142c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org      cachedOrNewService(service, locales, options, internalOptions);
143c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
144c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  return formatDate(dateFormat, date);
145c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org}
146c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
147c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
148c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org/**
149c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org * Formats a Date object (this) using locale and options values.
150c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org * If locale or options are omitted, defaults are used - both date and time are
151c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org * present in the output.
152c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org */
153c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.orgObject.defineProperty(Date.prototype, 'toLocaleString', {
154c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  value: function() {
155c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    if (%_IsConstructCall()) {
156c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org      throw new TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR);
157c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    }
158c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
159c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    var locales = arguments[0];
160c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    var options = arguments[1];
161c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    return toLocaleDateTime(
162c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org        this, locales, options, 'any', 'all', 'dateformatall');
163c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  },
164c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  writable: true,
165c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  configurable: true,
166c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  enumerable: false
167c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org});
168c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org%FunctionSetName(Date.prototype.toLocaleString, 'toLocaleString');
169c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org%FunctionRemovePrototype(Date.prototype.toLocaleString);
170c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org%SetNativeFlag(Date.prototype.toLocaleString);
171c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
172c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
173c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org/**
174c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org * Formats a Date object (this) using locale and options values.
175c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org * If locale or options are omitted, defaults are used - only date is present
176c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org * in the output.
177c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org */
178c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.orgObject.defineProperty(Date.prototype, 'toLocaleDateString', {
179c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  value: function() {
180c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    if (%_IsConstructCall()) {
181c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org      throw new TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR);
182c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    }
183c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
184c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    var locales = arguments[0];
185c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    var options = arguments[1];
186c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    return toLocaleDateTime(
187c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org        this, locales, options, 'date', 'date', 'dateformatdate');
188c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  },
189c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  writable: true,
190c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  configurable: true,
191c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  enumerable: false
192c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org});
193c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org%FunctionSetName(Date.prototype.toLocaleDateString, 'toLocaleDateString');
194c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org%FunctionRemovePrototype(Date.prototype.toLocaleDateString);
195c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org%SetNativeFlag(Date.prototype.toLocaleDateString);
196c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
197c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
198c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org/**
199c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org * Formats a Date object (this) using locale and options values.
200c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org * If locale or options are omitted, defaults are used - only time is present
201c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org * in the output.
202c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org */
203c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.orgObject.defineProperty(Date.prototype, 'toLocaleTimeString', {
204c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  value: function() {
205c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    if (%_IsConstructCall()) {
206c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org      throw new TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR);
207c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    }
208c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org
209c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    var locales = arguments[0];
210c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    var options = arguments[1];
211c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org    return toLocaleDateTime(
212c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org        this, locales, options, 'time', 'time', 'dateformattime');
213c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  },
214c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  writable: true,
215c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  configurable: true,
216c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  enumerable: false
217c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org});
218c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org%FunctionSetName(Date.prototype.toLocaleTimeString, 'toLocaleTimeString');
219c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org%FunctionRemovePrototype(Date.prototype.toLocaleTimeString);
220c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org%SetNativeFlag(Date.prototype.toLocaleTimeString);
221