// Copyright 2018 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.

#include 'src/builtins/builtins-iterator-gen.h'

namespace iterator {
  // Returned from IteratorBuiltinsAssembler::GetIterator().
  struct IteratorRecord {
    // iteratorRecord.[[Iterator]]
    object: JSReceiver;

    // iteratorRecord.[[NextMethod]]
    next: Object;
  }

  extern macro IteratorBuiltinsAssembler::GetIteratorMethod(
      implicit context: Context)(Object): Object;
  extern macro IteratorBuiltinsAssembler::GetIterator(
      implicit context: Context)(Object): IteratorRecord;

  extern macro IteratorBuiltinsAssembler::IteratorStep(
      implicit context: Context)(IteratorRecord): JSReceiver
      labels Done;
  extern macro IteratorBuiltinsAssembler::IteratorStep(
      implicit context: Context)(IteratorRecord, Map): JSReceiver
      labels Done;

  extern macro IteratorBuiltinsAssembler::IteratorValue(
      implicit context: Context)(JSReceiver): Object;
  extern macro IteratorBuiltinsAssembler::IteratorValue(
      implicit context: Context)(JSReceiver, Map): Object;

  extern macro IteratorBuiltinsAssembler::IteratorCloseOnException(
      implicit context: Context)(IteratorRecord, Object): never;

  extern macro IteratorBuiltinsAssembler::IterableToList(
      implicit context: Context)(Object, Object): JSArray;

  extern builtin IterableToListMayPreserveHoles(implicit context:
                                                    Context)(Object, Object);
  extern builtin IterableToListWithSymbolLookup(implicit context:
                                                    Context)(Object);
}
