1/* 2 * Copyright (C) 2013 Apple, Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#ifndef JSMapIterator_h 27#define JSMapIterator_h 28 29#include "JSDestructibleObject.h" 30#include "JSMap.h" 31#include "MapData.h" 32 33namespace JSC { 34enum MapIterationKind : uint32_t { 35 MapIterateKey, 36 MapIterateValue, 37 MapIterateKeyValue, 38}; 39 40class JSMapIterator : public JSDestructibleObject { 41public: 42 typedef JSDestructibleObject Base; 43 44 DECLARE_EXPORT_INFO; 45 46 static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype) 47 { 48 return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info()); 49 } 50 51 static JSMapIterator* create(VM& vm, Structure* structure, JSMap* iteratedObject, MapIterationKind kind) 52 { 53 JSMapIterator* instance = new (NotNull, allocateCell<JSMapIterator>(vm.heap)) JSMapIterator(vm, structure, iteratedObject, kind); 54 instance->finishCreation(vm, iteratedObject); 55 return instance; 56 } 57 58 bool next(CallFrame* callFrame, JSValue& value) 59 { 60 if (!m_iterator.ensureSlot()) 61 return false; 62 63 if (m_kind == MapIterateValue) 64 value = m_iterator.value(); 65 else if (m_kind == MapIterateKey) 66 value = m_iterator.key(); 67 else 68 value = createPair(callFrame, m_iterator.key(), m_iterator.value()); 69 ++m_iterator; 70 return true; 71 } 72 73 void finish() 74 { 75 m_iterator.finish(); 76 } 77 78private: 79 80 static const unsigned StructureFlags = Base::StructureFlags | OverridesVisitChildren; 81 82 JSMapIterator(VM& vm, Structure* structure, JSMap* iteratedObject, MapIterationKind kind) 83 : Base(vm, structure) 84 , m_iterator(iteratedObject->mapData()->begin()) 85 , m_kind(kind) 86 { 87 } 88 89 void finishCreation(VM&, JSMap*); 90 JSValue createPair(CallFrame*, JSValue, JSValue); 91 static void visitChildren(JSCell*, SlotVisitor&); 92 93 WriteBarrier<MapData> m_iteratedObjectData; 94 MapData::const_iterator m_iterator; 95 MapIterationKind m_kind; 96}; 97 98} 99 100#endif // !defined(JSMapIterator_h) 101