// 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_slice {

  extern macro SubString(String, intptr, intptr): String;

  // ES6 #sec-string.prototype.slice ( start, end )
  // https://tc39.github.io/ecma262/#sec-string.prototype.slice
  transitioning javascript builtin StringPrototypeSlice(
      js-implicit context: Context, receiver: Object)(...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: intptr = string.length_intptr;

    // Convert {start} to a relative index.
    const start: intptr = ConvertToRelativeIndex(arguments[0], length);

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

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

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