%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/set-union.tq

// Copyright 2023 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 collections {

// https://tc39.es/proposal-set-methods/#sec-set.prototype.union
transitioning javascript builtin SetPrototypeUnion(
    js-implicit context: NativeContext, receiver: JSAny)(other: JSAny): JSSet {
  const methodName: constexpr string = 'Set.prototype.union';
  const fastIteratorResultMap = GetIteratorResultMap();

  // 1. Let O be the this value.
  // 2. Perform ? RequireInternalSlot(O, [[SetData]]).
  const o = Cast<JSSet>(receiver) otherwise
  ThrowTypeError(
      MessageTemplate::kIncompatibleMethodReceiver, methodName, receiver);

  // 3. Let otherRec be ? GetSetRecord(other).
  let otherRec = GetSetRecord(other, methodName);

  const table = Cast<OrderedHashSet>(o.table) otherwise unreachable;

  // 5. Let resultSetData be a copy of O.[[SetData]].
  let resultSetData = Cast<OrderedHashSet>(CloneFixedArray(
      table, ExtractFixedArrayFlag::kFixedArrays)) otherwise unreachable;

  try {
    typeswitch (other) {
      case (otherSet: JSSetWithNoCustomIteration): {
        CheckSetRecordHasJSSetMethods(otherRec) otherwise SlowPath;

        const otherTable =
            Cast<OrderedHashSet>(otherSet.table) otherwise unreachable;

        let otherIterator =
            collections::NewUnmodifiedOrderedHashSetIterator(otherTable);

        while (true) {
          const nextValue = otherIterator.Next() otherwise Done;
          resultSetData = AddToSetTable(resultSetData, nextValue, methodName);
        }
      }
      case (otherMap: JSMapWithNoCustomIteration): {
        CheckSetRecordHasJSMapMethods(otherRec) otherwise SlowPath;

        const otherTable =
            Cast<OrderedHashMap>(otherMap.table) otherwise unreachable;

        let otherIterator =
            collections::NewUnmodifiedOrderedHashMapIterator(otherTable);

        while (true) {
          const nextValue = otherIterator.Next() otherwise Done;
          resultSetData =
              AddToSetTable(resultSetData, nextValue.key, methodName);
        }
      }
      case (JSAny): {
        goto SlowPath;
      }
    }
  } label SlowPath {
    // 4. Let keysIter be ? GetKeysIterator(otherRec).
    let keysIter =
        GetKeysIterator(otherRec.object, UnsafeCast<Callable>(otherRec.keys));

    // 6. Let next be true.
    let nextRecord: JSReceiver;
    // 7. Repeat, while next is not false,
    while (true) {
      //  a. Set next to ? IteratorStep(keysIter).
      nextRecord = iterator::IteratorStep(keysIter, fastIteratorResultMap)
          otherwise Done;

      //  b. If next is not false, then
      //      i. Let nextValue be ? IteratorValue(next).
      const nextValue =
          iterator::IteratorValue(nextRecord, fastIteratorResultMap);

      //      ii. If nextValue is -0𝔽, set nextValue to +0𝔽.
      //      iii. If SetDataHas(resultSetData, nextValue) is false, then
      //          1. Append nextValue to resultSetData.
      resultSetData = AddToSetTable(resultSetData, nextValue, methodName);
    }
  } label Done {
    // 8. Let result be
    // OrdinaryObjectCreate(%Set.prototype%, « [[SetData]]»).
    // 9. Set result.[[SetData]] to resultSetData.
    // 10. Return result.
    return new JSSet{
      map: *NativeContextSlot(ContextSlot::JS_SET_MAP_INDEX),
      properties_or_hash: kEmptyFixedArray,
      elements: kEmptyFixedArray,
      table: resultSetData
    };
  }
  unreachable;
}
}

Zerion Mini Shell 1.0