/* * Copyright (c) 2020, Matthew Olsson * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include namespace JS { class ArrayIterator final : public Object , public BuiltinIterator { JS_OBJECT(ArrayIterator, Object); GC_DECLARE_ALLOCATOR(ArrayIterator); public: static GC::Ref create(Realm&, Value array, Object::PropertyKind iteration_kind); virtual ~ArrayIterator() override = default; BuiltinIterator* as_builtin_iterator() override { return this; } ThrowCompletionOr next(VM&, bool& done, Value& value) override; private: ArrayIterator(Value array, Object::PropertyKind iteration_kind, Object& prototype); virtual bool is_array_iterator() const override { return true; } virtual void visit_edges(Cell::Visitor&) override; Value m_array; Object::PropertyKind m_iteration_kind; size_t m_index { 0 }; }; template<> inline bool Object::fast_is() const { return is_array_iterator(); } }