%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/builtins/
Upload File :
Create Path :
Current File : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/builtins/array-to-spliced.tq

// Copyright 2022 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 array {
// Makes a copy of the source array for toSpliced without inserting the new
// items.
macro CopyFastPackedArrayForToSpliced(
    implicit context: Context)(kind: constexpr ElementsKind, array: JSArray,
    newLenSmi: Smi, actualStartSmi: Smi, insertCountSmi: Smi,
    actualDeleteCountSmi: Smi): JSArray {
  const newLen: intptr = Convert<intptr>(newLenSmi);
  const actualStart: intptr = Convert<intptr>(actualStartSmi);
  const insertCount: intptr = Convert<intptr>(insertCountSmi);
  const actualDeleteCount: intptr = Convert<intptr>(actualDeleteCountSmi);

  const copy: FixedArrayBase = AllocateFixedArray(kind, newLen);

  if (actualStart > 0) {
    // Copy the part before the inserted items.
    CopyElements(kind, copy, 0, array.elements, 0, actualStart);
  }

  // Initialize elements that will hold the inserted items because the
  // NewJSArray below may allocate. Leave the actual insertion for later since
  // it could transition the ElementsKind.
  if (insertCount > 0) {
    if constexpr (kind == ElementsKind::PACKED_DOUBLE_ELEMENTS) {
      FillFixedDoubleArrayWithZero(
          UnsafeCast<FixedDoubleArray>(copy), actualStart, insertCount);
    } else {
      FillFixedArrayWithSmiZero(
          kind, UnsafeCast<FixedArray>(copy), actualStart, insertCount);
    }
  }

  // Copy the part after the inserted items.
  const secondPartStart: intptr = actualStart + insertCount;
  const secondPartLen: intptr = newLen - secondPartStart;
  if (secondPartLen > 0) {
    const r: intptr = actualStart + actualDeleteCount;
    dcheck(Convert<Smi>(r + secondPartLen) <= array.length);
    CopyElements(kind, copy, secondPartStart, array.elements, r, secondPartLen);
  }

  const map: Map = LoadJSArrayElementsMap(kind, LoadNativeContext(context));
  return NewJSArray(map, copy);
}

transitioning macro TryFastArrayToSpliced(
    implicit context: Context)(args: Arguments, o: JSReceiver,
    originalLenNumber: Number, newLenNumber: Number, actualStartNumber: Number,
    insertCount: Smi, actualDeleteCountNumber: Number): JSArray labels Slow {
  const newLen: Smi = Cast<Smi>(newLenNumber) otherwise Slow;
  const actualStart: Smi = Cast<Smi>(actualStartNumber) otherwise Slow;
  const actualDeleteCount: Smi =
      Cast<Smi>(actualDeleteCountNumber) otherwise Slow;

  const array: FastJSArray = Cast<FastJSArray>(o) otherwise Slow;

  // If any argument coercion shrunk the source array, go to the slow case.
  const originalLen: Smi = Cast<Smi>(originalLenNumber) otherwise Slow;
  if (originalLen > array.length) goto Slow;

  // Array#toSpliced does not preserve holes and always creates packed Arrays.
  // Holes in the source array-like are treated like any other element and the
  // value is computed with Get. So, there are only fast paths for packed
  // elements.
  let elementsKind: ElementsKind = array.map.elements_kind;
  if (!IsFastPackedElementsKind(elementsKind)) goto Slow;

  // Make a copy before inserting the new items, as doing so can transition the
  // ElementsKind.
  let copy: JSArray;
  if (elementsKind == ElementsKind::PACKED_SMI_ELEMENTS) {
    copy = CopyFastPackedArrayForToSpliced(
        ElementsKind::PACKED_SMI_ELEMENTS, array, newLen, actualStart,
        insertCount, actualDeleteCount);
  } else if (elementsKind == ElementsKind::PACKED_ELEMENTS) {
    copy = CopyFastPackedArrayForToSpliced(
        ElementsKind::PACKED_ELEMENTS, array, newLen, actualStart, insertCount,
        actualDeleteCount);
  } else {
    dcheck(elementsKind == ElementsKind::PACKED_DOUBLE_ELEMENTS);
    copy = CopyFastPackedArrayForToSpliced(
        ElementsKind::PACKED_DOUBLE_ELEMENTS, array, newLen, actualStart,
        insertCount, actualDeleteCount);
  }

  // Array#toSpliced's parameters are (start, deleteCount, ...items), so the
  // first item to insert is at index 2.
  const kArgsStart = 2;
  elementsKind = TransitionElementsKindForInsertionIfNeeded(
      context, copy, elementsKind, args, kArgsStart);

  // Insert the items.
  dcheck(IsFastPackedElementsKind(elementsKind));
  if (IsFastSmiOrTaggedElementsKind(elementsKind)) {
    InsertArgumentsIntoFastPackedArray<FixedArray, JSAny>(
        copy, actualStart, args, kArgsStart, insertCount);
  } else {
    InsertArgumentsIntoFastPackedArray<FixedDoubleArray, Number>(
        copy, actualStart, args, kArgsStart, insertCount);
  }

  return copy;
}

transitioning macro GenericArrayToSpliced(
    implicit context: Context)(args: Arguments, o: JSReceiver, newLen: Number,
    actualStart: Number, actualDeleteCount: Number): JSArray {
  // 13. Let A be ? ArrayCreate(𝔽(newLen)).
  const copy = ArrayCreate(newLen);

  // 14. Let i be 0.
  let i: Number = 0;

  // 15. Let r be actualStart + actualDeleteCount.
  let r: Number = actualStart + actualDeleteCount;

  // 16. Repeat, while i < actualStart,
  while (i < actualStart) {
    // a. Let Pi be ! ToString(𝔽(i)).
    // b. Let iValue be ? Get(O, Pi).
    const iValue = GetProperty(o, i);

    // c. Perform ! CreateDataPropertyOrThrow(A, Pi, iValue).
    FastCreateDataProperty(copy, i, iValue);

    // d. Set i to i + 1.
    ++i;
  }

  if (args.length > 2) {
    // 17. For each element E of items, do
    for (let k: intptr = 2; k < args.length; ++k) {
      const e = args[k];

      // a. Let Pi be ! ToString(𝔽(i)).
      // b. Perform ! CreateDataPropertyOrThrow(A, Pi, E).
      FastCreateDataProperty(copy, i, e);

      // c. Set i to i + 1.
      ++i;
    }
  }

  // 18. Repeat, while i < newLen,
  while (i < newLen) {
    // a. Let Pi be ! ToString(𝔽(i)).
    // b. Let from be ! ToString(𝔽(r)).
    // c. Let fromValue be ? Get(O, from).
    const fromValue = GetProperty(o, r);

    // d. Perform ! CreateDataPropertyOrThrow(A, Pi, fromValue).
    FastCreateDataProperty(copy, i, fromValue);

    // e. Set i to i + 1.
    ++i;

    // f. Set r to r + 1.
    ++r;
  }

  // 19. Return A.
  return copy;
}

// https://tc39.es/proposal-change-array-by-copy/#sec-array.prototype.toSpliced
transitioning javascript builtin ArrayPrototypeToSpliced(
    js-implicit context: NativeContext, receiver: JSAny)(...arguments): JSAny {
  const start = arguments[0];
  const deleteCount = arguments[1];

  // 1. Let O be ? ToObject(this value).
  const o: JSReceiver = ToObject(context, receiver);

  // 2. Let len be ? LengthOfArrayLike(O).
  const len: Number = GetLengthProperty(o);

  // 3. Let relativeStart be ? ToIntegerOrInfinity(start).
  const relativeStart: Number = ToInteger_Inline(start);

  // 4. If relativeStart is -∞, let actualStart be 0.
  // 5. Else if relativeStart < 0, let actualStart be max(len + relativeStart,
  // 0).
  // 6. Else, let actualStart be min(relativeStart, len).
  //
  // TODO(syg): Support Number length values in ConvertAndClampRelativeIndex.
  const actualStart = relativeStart < 0 ? Max((len + relativeStart), 0) :
                                          Min(relativeStart, len);

  let insertCount: Smi;
  let actualDeleteCount: Number;
  if (arguments.length == 0) {
    // 7. Let insertCount be the number of elements in items.
    insertCount = 0;

    // 8. If start is not present, then
    //   a. Let actualDeleteCount be 0.
    actualDeleteCount = 0;
  } else if (arguments.length == 1) {
    // 7. Let insertCount be the number of elements in items.
    insertCount = 0;

    // 9. Else if deleteCount is not present, then
    //   a. Let actualDeleteCount be len - actualStart.
    actualDeleteCount = len - actualStart;
  } else {
    // 7. Let insertCount be the number of elements in items.
    insertCount = Convert<Smi>(arguments.length) - 2;

    // 10. Else,
    //  a. Let dc be ? ToIntegerOrInfinity(deleteCount).
    //  b. Let actualDeleteCount be the result of clamping dc between 0 and len
    //  - actualStart.
    const dc = ToInteger_Inline(deleteCount);
    actualDeleteCount = Min(Max(0, dc), len - actualStart);
  }

  // 11. Let newLen be len + insertCount - actualDeleteCount.
  const newLen = len + insertCount - actualDeleteCount;

  // 12. If newLen > 2^53 - 1, throw a TypeError exception.
  if (newLen > kMaxSafeInteger) {
    ThrowTypeError(MessageTemplate::kInvalidArrayLength, newLen);
  }

  if (newLen == 0) return ArrayCreate(0);

  try {
    if (newLen > kMaxFastArrayLength) goto Slow;
    return TryFastArrayToSpliced(
        arguments, o, len, newLen, actualStart, insertCount, actualDeleteCount)
        otherwise Slow;
  } label Slow {
    return GenericArrayToSpliced(
        arguments, o, newLen, actualStart, actualDeleteCount);
  }
}
}

Zerion Mini Shell 1.0