// 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 {
  // ES6 #sec-string.prototype.slice ( start, end )
  // https://tc39.github.io/ecma262/#sec-string.prototype.slice
  transitioning javascript builtin StringPrototypeSlice(
      js-implicit context: NativeContext,
      receiver: JSAny)(...arguments): String {
    // 1. Let O be ? RequireObjectCoercible(this value).
    // 2. Let S be ? ToString(O).
    const string: String = ToThisString(receiver, 'String.prototype.slice');

    // 3. Let len be the number of elements in S.
    const length: uintptr = string.length_uintptr;

    // Convert {start} to a relative index.
    const arg0 = arguments[0];
    const start: uintptr =
        arg0 != Undefined ? ConvertToRelativeIndex(arg0, length) : 0;

    // 5. If end is undefined, let intEnd be len;
    // else Convert {end} to a relative index.
    const arg1 = arguments[1];
    const end: uintptr =
        arg1 != Undefined ? ConvertToRelativeIndex(arg1, length) : length;

    if (end <= start) {
      return kEmptyString;
    }

    return SubString(string, start, end);
  }
}