| // Copyright 2019 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| namespace string { |
| |
| // String.prototype.substr ( start, length ) |
| // ES6 #sec-string.prototype.substr |
| transitioning javascript builtin StringPrototypeSubstr( |
| js-implicit context: NativeContext, receiver: JSAny)(...arguments): String { |
| const methodName: constexpr string = 'String.prototype.substr'; |
| // 1. Let O be ? RequireObjectCoercible(this value). |
| // 2. Let S be ? ToString(O). |
| const string: String = ToThisString(receiver, methodName); |
| |
| // 5. Let size be the number of code units in S. |
| const size: uintptr = string.length_uintptr; |
| |
| // 3. Let intStart be ? ToInteger(start). |
| // 6. If intStart < 0, set intStart to max(size + intStart, 0). |
| const start = arguments[0]; |
| const initStart: uintptr = |
| start != Undefined ? ConvertToRelativeIndex(start, size) : 0; |
| |
| // 4. If length is undefined, |
| // let end be +∞; otherwise let end be ? ToInteger(length). |
| // 7. Let resultLength be min(max(end, 0), size - intStart). |
| const length = arguments[1]; |
| const lengthLimit = size - initStart; |
| assert(lengthLimit <= size); |
| const resultLength: uintptr = length != Undefined ? |
| ClampToIndexRange(length, lengthLimit) : |
| lengthLimit; |
| |
| // 8. If resultLength ≤ 0, return the empty String "". |
| if (resultLength == 0) return EmptyStringConstant(); |
| |
| // 9. Return the String value containing resultLength consecutive code units |
| // from S beginning with the code unit at index intStart. |
| return SubString(string, initStart, initStart + resultLength); |
| } |
| } |