Chromium Code Reviews| 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 |