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

Side by Side Diff: src/runtime.js

Issue 1378533002: [es6] Introduce %ToInteger and %ToLength. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 2 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/objects.cc ('k') | src/runtime/runtime.h » ('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 // This files contains runtime support implemented in JavaScript. 5 // This files contains runtime support implemented in JavaScript.
6 6
7 // CAUTION: Some of the functions specified in this file are called 7 // CAUTION: Some of the functions specified in this file are called
8 // directly from compiled code. These are the functions with names in 8 // directly from compiled code. These are the functions with names in
9 // ALL CAPS. The compiled code passes the first argument in 'this'. 9 // ALL CAPS. The compiled code passes the first argument in 'this'.
10 10
11 11
12 // The following declarations are shared with other native JS files. 12 // The following declarations are shared with other native JS files.
13 // They are all declared at this one spot to avoid redeclaration errors. 13 // They are all declared at this one spot to avoid redeclaration errors.
14 var $NaN; 14 var $NaN;
15 var $nonNumberToNumber; 15 var $nonNumberToNumber;
16 var $sameValue; 16 var $sameValue;
17 var $sameValueZero; 17 var $sameValueZero;
18 var $toInteger;
19 var $toLength;
20 var $toNumber; 18 var $toNumber;
21 var $toPositiveInteger; 19 var $toPositiveInteger;
22 20
23 var harmony_tolength = false; 21 var harmony_tolength = false;
24 22
25 (function(global, utils) { 23 (function(global, utils) {
26 24
27 %CheckIsBootstrapping(); 25 %CheckIsBootstrapping();
28 26
29 var GlobalArray = global.Array; 27 var GlobalArray = global.Array;
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 length = args.length; 88 length = args.length;
91 if (%_IsSmi(length) && length >= 0 && length < kSafeArgumentsLength) { 89 if (%_IsSmi(length) && length >= 0 && length < kSafeArgumentsLength) {
92 return length; 90 return length;
93 } 91 }
94 } 92 }
95 93
96 if (!IS_SPEC_OBJECT(args)) { 94 if (!IS_SPEC_OBJECT(args)) {
97 throw %make_type_error(kWrongArgs, "Reflect.apply"); 95 throw %make_type_error(kWrongArgs, "Reflect.apply");
98 } 96 }
99 97
100 length = %to_length_fun(args.length); 98 length = TO_LENGTH(args.length);
101 99
102 // We can handle any number of apply arguments if the stack is 100 // We can handle any number of apply arguments if the stack is
103 // big enough, but sanity check the value to avoid overflow when 101 // big enough, but sanity check the value to avoid overflow when
104 // multiplying with pointer size. 102 // multiplying with pointer size.
105 if (length > kSafeArgumentsLength) throw %make_range_error(kStackOverflow); 103 if (length > kSafeArgumentsLength) throw %make_range_error(kStackOverflow);
106 104
107 // Return the length which is the number of arguments to copy to the 105 // Return the length which is the number of arguments to copy to the
108 // stack. It is guaranteed to be a small integer at this point. 106 // stack. It is guaranteed to be a small integer at this point.
109 return length; 107 return length;
110 } 108 }
(...skipping 29 matching lines...) Expand all
140 throw %make_type_error(kCalledNonCallable, TO_STRING(newTarget)); 138 throw %make_type_error(kCalledNonCallable, TO_STRING(newTarget));
141 } else { 139 } else {
142 throw %make_type_error(kNotConstructor, TO_STRING(newTarget)); 140 throw %make_type_error(kNotConstructor, TO_STRING(newTarget));
143 } 141 }
144 } 142 }
145 143
146 if (!IS_SPEC_OBJECT(args)) { 144 if (!IS_SPEC_OBJECT(args)) {
147 throw %make_type_error(kWrongArgs, "Reflect.construct"); 145 throw %make_type_error(kWrongArgs, "Reflect.construct");
148 } 146 }
149 147
150 length = %to_length_fun(args.length); 148 length = TO_LENGTH(args.length);
151 149
152 // We can handle any number of apply arguments if the stack is 150 // We can handle any number of apply arguments if the stack is
153 // big enough, but sanity check the value to avoid overflow when 151 // big enough, but sanity check the value to avoid overflow when
154 // multiplying with pointer size. 152 // multiplying with pointer size.
155 if (length > kSafeArgumentsLength) throw %make_range_error(kStackOverflow); 153 if (length > kSafeArgumentsLength) throw %make_range_error(kStackOverflow);
156 154
157 // Return the length which is the number of arguments to copy to the 155 // Return the length which is the number of arguments to copy to the
158 // stack. It is guaranteed to be a small integer at this point. 156 // stack. It is guaranteed to be a small integer at this point.
159 return length; 157 return length;
160 } 158 }
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 function ToString(x) { 207 function ToString(x) {
210 if (IS_STRING(x)) return x; 208 if (IS_STRING(x)) return x;
211 if (IS_NUMBER(x)) return %_NumberToString(x); 209 if (IS_NUMBER(x)) return %_NumberToString(x);
212 if (IS_BOOLEAN(x)) return x ? 'true' : 'false'; 210 if (IS_BOOLEAN(x)) return x ? 'true' : 'false';
213 if (IS_UNDEFINED(x)) return 'undefined'; 211 if (IS_UNDEFINED(x)) return 'undefined';
214 // Types that can't be converted to string are caught in DefaultString. 212 // Types that can't be converted to string are caught in DefaultString.
215 return (IS_NULL(x)) ? 'null' : ToString(DefaultString(x)); 213 return (IS_NULL(x)) ? 'null' : ToString(DefaultString(x));
216 } 214 }
217 215
218 216
219 // ECMA-262, section 9.4, page 34.
220 function ToInteger(x) {
221 if (%_IsSmi(x)) return x;
222 return %NumberToInteger(ToNumber(x));
223 }
224
225
226 // ES6, draft 08-24-14, section 7.1.15
227 function ToLength(arg) {
228 arg = ToInteger(arg);
229 if (arg < 0) return 0;
230 return arg < kMaxSafeInteger ? arg : kMaxSafeInteger;
231 }
232
233
234 // ES5, section 9.12 217 // ES5, section 9.12
235 function SameValue(x, y) { 218 function SameValue(x, y) {
236 if (typeof x != typeof y) return false; 219 if (typeof x != typeof y) return false;
237 if (IS_NUMBER(x)) { 220 if (IS_NUMBER(x)) {
238 if (NUMBER_IS_NAN(x) && NUMBER_IS_NAN(y)) return true; 221 if (NUMBER_IS_NAN(x) && NUMBER_IS_NAN(y)) return true;
239 // x is +0 and y is -0 or vice versa. 222 // x is +0 and y is -0 or vice versa.
240 if (x === 0 && y === 0 && %_IsMinusZero(x) != %_IsMinusZero(y)) { 223 if (x === 0 && y === 0 && %_IsMinusZero(x) != %_IsMinusZero(y)) {
241 return false; 224 return false;
242 } 225 }
243 } 226 }
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 // boilerplate gets the right prototype. 324 // boilerplate gets the right prototype.
342 %FunctionSetPrototype(GlobalArray, new GlobalArray(0)); 325 %FunctionSetPrototype(GlobalArray, new GlobalArray(0));
343 326
344 // ---------------------------------------------------------------------------- 327 // ----------------------------------------------------------------------------
345 // Exports 328 // Exports
346 329
347 $NaN = %GetRootNaN(); 330 $NaN = %GetRootNaN();
348 $nonNumberToNumber = NonNumberToNumber; 331 $nonNumberToNumber = NonNumberToNumber;
349 $sameValue = SameValue; 332 $sameValue = SameValue;
350 $sameValueZero = SameValueZero; 333 $sameValueZero = SameValueZero;
351 $toInteger = ToInteger;
352 $toLength = ToLength;
353 $toNumber = ToNumber; 334 $toNumber = ToNumber;
354 $toPositiveInteger = ToPositiveInteger; 335 $toPositiveInteger = ToPositiveInteger;
355 336
356 %InstallToContext([ 337 %InstallToContext([
357 "apply_prepare_builtin", APPLY_PREPARE, 338 "apply_prepare_builtin", APPLY_PREPARE,
358 "concat_iterable_to_array_builtin", CONCAT_ITERABLE_TO_ARRAY, 339 "concat_iterable_to_array_builtin", CONCAT_ITERABLE_TO_ARRAY,
359 "reflect_apply_prepare_builtin", REFLECT_APPLY_PREPARE, 340 "reflect_apply_prepare_builtin", REFLECT_APPLY_PREPARE,
360 "reflect_construct_prepare_builtin", REFLECT_CONSTRUCT_PREPARE, 341 "reflect_construct_prepare_builtin", REFLECT_CONSTRUCT_PREPARE,
361 ]); 342 ]);
362 343
363 %InstallToContext([ 344 %InstallToContext([
364 "concat_iterable_to_array", ConcatIterableToArray, 345 "concat_iterable_to_array", ConcatIterableToArray,
365 "non_number_to_number", NonNumberToNumber, 346 "non_number_to_number", NonNumberToNumber,
366 "to_integer_fun", ToInteger,
367 "to_length_fun", ToLength,
368 "to_number_fun", ToNumber, 347 "to_number_fun", ToNumber,
369 ]); 348 ]);
370 349
371 utils.Export(function(to) { 350 utils.Export(function(to) {
372 to.ToBoolean = ToBoolean; 351 to.ToBoolean = ToBoolean;
373 to.ToLength = ToLength;
374 to.ToNumber = ToNumber; 352 to.ToNumber = ToNumber;
375 to.ToString = ToString; 353 to.ToString = ToString;
376 }); 354 });
377 355
378 }) 356 })
OLDNEW
« no previous file with comments | « src/objects.cc ('k') | src/runtime/runtime.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698