OLD | NEW |
---|---|
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 'use strict'; | 5 'use strict'; |
6 | 6 |
7 // This file relies on the fact that the following declaration has been made | 7 // This file relies on the fact that the following declaration has been made |
8 // in runtime.js: | 8 // in runtime.js: |
9 // var $String = global.String; | 9 // var $String = global.String; |
10 // var $Array = global.Array; | 10 // var $Array = global.Array; |
11 | 11 |
12 // ------------------------------------------------------------------- | 12 // ------------------------------------------------------------------- |
13 | 13 |
14 // ES6 draft 01-20-14, section 21.1.3.13 | 14 // ES6 draft 01-20-14, section 21.1.3.13 |
15 function StringRepeat(count) { | 15 function StringRepeat(count) { |
16 CHECK_OBJECT_COERCIBLE(this, "String.prototype.repeat"); | 16 CHECK_OBJECT_COERCIBLE(this, "String.prototype.repeat"); |
17 | 17 |
18 var s = TO_STRING_INLINE(this); | 18 var s = TO_STRING_INLINE(this); |
19 var n = ToInteger(count); | 19 var n = ToInteger(count); |
20 if (n < 0 || !NUMBER_IS_FINITE(n)) { | 20 // The maximum string length is stored in a smi, so a longer repeat |
21 // must result in a range error. | |
22 if (n < 0 || n > %_MaxSmi()) { | |
21 throw MakeRangeError("invalid_count_value", []); | 23 throw MakeRangeError("invalid_count_value", []); |
22 } | 24 } |
23 | 25 |
24 var elements = new InternalArray(n); | 26 var r = ""; |
25 for (var i = 0; i < n; i++) { | 27 while (n > 0) { |
26 elements[i] = s; | 28 if (n & 1) r += s; |
29 n >>= 1; | |
30 s += s; | |
aandrey
2014/10/15 17:54:43
There will be extra unnecessary concatenation at t
| |
27 } | 31 } |
28 | 32 return r; |
29 return %StringBuilderConcat(elements, n, ""); | |
30 } | 33 } |
31 | 34 |
32 | 35 |
33 // ES6 draft 04-05-14, section 21.1.3.18 | 36 // ES6 draft 04-05-14, section 21.1.3.18 |
34 function StringStartsWith(searchString /* position */) { // length == 1 | 37 function StringStartsWith(searchString /* position */) { // length == 1 |
35 CHECK_OBJECT_COERCIBLE(this, "String.prototype.startsWith"); | 38 CHECK_OBJECT_COERCIBLE(this, "String.prototype.startsWith"); |
36 | 39 |
37 var s = TO_STRING_INLINE(this); | 40 var s = TO_STRING_INLINE(this); |
38 | 41 |
39 if (IS_REGEXP(searchString)) { | 42 if (IS_REGEXP(searchString)) { |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
182 InstallFunctions($String.prototype, DONT_ENUM, $Array( | 185 InstallFunctions($String.prototype, DONT_ENUM, $Array( |
183 "codePointAt", StringCodePointAt, | 186 "codePointAt", StringCodePointAt, |
184 "contains", StringContains, | 187 "contains", StringContains, |
185 "endsWith", StringEndsWith, | 188 "endsWith", StringEndsWith, |
186 "repeat", StringRepeat, | 189 "repeat", StringRepeat, |
187 "startsWith", StringStartsWith | 190 "startsWith", StringStartsWith |
188 )); | 191 )); |
189 } | 192 } |
190 | 193 |
191 ExtendStringPrototype(); | 194 ExtendStringPrototype(); |
OLD | NEW |