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

Side by Side Diff: src/date.js

Issue 1346893003: [es6] Use the correct ToPrimitive in the Date Constructor. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 3 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
« no previous file with comments | « src/contexts.h ('k') | src/macros.py » ('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 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2006-2008 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 var $createDate; 5 var $createDate;
6 6
7 // ------------------------------------------------------------------- 7 // -------------------------------------------------------------------
8 8
9 (function(global, utils) { 9 (function(global, utils) {
10 10
11 "use strict"; 11 "use strict";
12 12
13 %CheckIsBootstrapping(); 13 %CheckIsBootstrapping();
14 14
15 // ------------------------------------------------------------------- 15 // -------------------------------------------------------------------
16 // Imports 16 // Imports
17 17
18 var GlobalDate = global.Date; 18 var GlobalDate = global.Date;
19 var GlobalObject = global.Object; 19 var GlobalObject = global.Object;
20 var InternalArray = utils.InternalArray; 20 var InternalArray = utils.InternalArray;
21 var IsFinite; 21 var IsFinite;
22 var MathAbs; 22 var MathAbs;
23 var MathFloor; 23 var MathFloor;
24 var ToNumber; 24 var ToNumber;
25 var toPrimitiveSymbol = utils.ImportNow("to_primitive_symbol");
26 var ToString; 25 var ToString;
27 26
28 utils.Import(function(from) { 27 utils.Import(function(from) {
29 IsFinite = from.IsFinite; 28 IsFinite = from.IsFinite;
30 MathAbs = from.MathAbs; 29 MathAbs = from.MathAbs;
31 MathFloor = from.MathFloor; 30 MathFloor = from.MathFloor;
32 ToNumber = from.ToNumber; 31 ToNumber = from.ToNumber;
33 ToString = from.ToString; 32 ToString = from.ToString;
34 }); 33 });
35 34
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 142
144 // ECMA 262 - 15.9.3 143 // ECMA 262 - 15.9.3
145 var argc = %_ArgumentsLength(); 144 var argc = %_ArgumentsLength();
146 var value; 145 var value;
147 if (argc == 0) { 146 if (argc == 0) {
148 value = %DateCurrentTime(); 147 value = %DateCurrentTime();
149 SET_UTC_DATE_VALUE(this, value); 148 SET_UTC_DATE_VALUE(this, value);
150 } else if (argc == 1) { 149 } else if (argc == 1) {
151 if (IS_NUMBER(year)) { 150 if (IS_NUMBER(year)) {
152 value = year; 151 value = year;
152
153 } else if (IS_STRING(year)) { 153 } else if (IS_STRING(year)) {
154 // Probe the Date cache. If we already have a time value for the 154 // Probe the Date cache. If we already have a time value for the
155 // given time, we re-use that instead of parsing the string again. 155 // given time, we re-use that instead of parsing the string again.
156 CheckDateCacheCurrent(); 156 CheckDateCacheCurrent();
157 var cache = Date_cache; 157 var cache = Date_cache;
158 if (cache.string === year) { 158 if (cache.string === year) {
159 value = cache.time; 159 value = cache.time;
160 } else { 160 } else {
161 value = DateParse(year); 161 value = DateParse(year);
162 if (!NUMBER_IS_NAN(value)) { 162 if (!NUMBER_IS_NAN(value)) {
163 cache.time = value; 163 cache.time = value;
164 cache.string = year; 164 cache.string = year;
165 } 165 }
166 } 166 }
167 167
168 } else if (IS_DATE(year)) {
169 value = UTC_DATE_VALUE(year);
170
168 } else { 171 } else {
169 // According to ECMA 262, no hint should be given for this 172 var time = TO_PRIMITIVE(year);
170 // conversion. However, ToPrimitive defaults to STRING_HINT for
171 // Date objects which will lose precision when the Date
172 // constructor is called with another Date object as its
173 // argument. We therefore use NUMBER_HINT for the conversion,
174 // which is the default for everything else than Date objects.
175 // This makes us behave like KJS and SpiderMonkey.
176 var time = $toPrimitive(year, NUMBER_HINT);
177 value = IS_STRING(time) ? DateParse(time) : ToNumber(time); 173 value = IS_STRING(time) ? DateParse(time) : ToNumber(time);
178 } 174 }
179 SET_UTC_DATE_VALUE(this, value); 175 SET_UTC_DATE_VALUE(this, value);
180 } else { 176 } else {
181 year = ToNumber(year); 177 year = ToNumber(year);
182 month = ToNumber(month); 178 month = ToNumber(month);
183 date = argc > 2 ? ToNumber(date) : 1; 179 date = argc > 2 ? ToNumber(date) : 1;
184 hours = argc > 3 ? ToNumber(hours) : 0; 180 hours = argc > 3 ? ToNumber(hours) : 0;
185 minutes = argc > 4 ? ToNumber(minutes) : 0; 181 minutes = argc > 4 ? ToNumber(minutes) : 0;
186 seconds = argc > 5 ? ToNumber(seconds) : 0; 182 seconds = argc > 5 ? ToNumber(seconds) : 0;
(...skipping 695 matching lines...) Expand 10 before | Expand all | Expand 10 after
882 "toUTCString", DateToUTCString, 878 "toUTCString", DateToUTCString,
883 "getYear", DateGetYear, 879 "getYear", DateGetYear,
884 "setYear", DateSetYear, 880 "setYear", DateSetYear,
885 "toISOString", DateToISOString, 881 "toISOString", DateToISOString,
886 "toJSON", DateToJSON 882 "toJSON", DateToJSON
887 ]); 883 ]);
888 884
889 %InstallToContext(["create_date_fun", CreateDate]); 885 %InstallToContext(["create_date_fun", CreateDate]);
890 886
891 }) 887 })
OLDNEW
« no previous file with comments | « src/contexts.h ('k') | src/macros.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698