summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/runtime/JSMapIterator.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/JavaScriptCore/runtime/JSMapIterator.h')
-rw-r--r--Source/JavaScriptCore/runtime/JSMapIterator.h46
1 files changed, 32 insertions, 14 deletions
diff --git a/Source/JavaScriptCore/runtime/JSMapIterator.h b/Source/JavaScriptCore/runtime/JSMapIterator.h
index 5fc965ebc..377d656c8 100644
--- a/Source/JavaScriptCore/runtime/JSMapIterator.h
+++ b/Source/JavaScriptCore/runtime/JSMapIterator.h
@@ -26,8 +26,8 @@
#ifndef JSMapIterator_h
#define JSMapIterator_h
-#include "JSDestructibleObject.h"
#include "JSMap.h"
+#include "JSObject.h"
#include "MapData.h"
namespace JSC {
@@ -37,9 +37,9 @@ enum MapIterationKind : uint32_t {
MapIterateKeyValue,
};
-class JSMapIterator : public JSDestructibleObject {
+class JSMapIterator : public JSNonFinalObject {
public:
- typedef JSDestructibleObject Base;
+ typedef JSNonFinalObject Base;
DECLARE_EXPORT_INFO;
@@ -57,16 +57,27 @@ public:
bool next(CallFrame* callFrame, JSValue& value)
{
- if (!m_iterator.ensureSlot())
+ WTF::KeyValuePair<JSValue, JSValue> pair;
+ if (!m_iterator.next(pair))
return false;
if (m_kind == MapIterateValue)
- value = m_iterator.value();
+ value = pair.value;
else if (m_kind == MapIterateKey)
- value = m_iterator.key();
+ value = pair.key;
else
- value = createPair(callFrame, m_iterator.key(), m_iterator.value());
- ++m_iterator;
+ value = createPair(callFrame, pair.key, pair.value);
+ return true;
+ }
+
+ bool nextKeyValue(JSValue& key, JSValue& value)
+ {
+ WTF::KeyValuePair<JSValue, JSValue> pair;
+ if (!m_iterator.next(pair))
+ return false;
+
+ key = pair.key;
+ value = pair.value;
return true;
}
@@ -75,25 +86,32 @@ public:
m_iterator.finish();
}
-private:
+ MapIterationKind kind() const { return m_kind; }
+ JSValue iteratedValue() const { return m_map.get(); }
+ JSMapIterator* clone(ExecState*);
- static const unsigned StructureFlags = Base::StructureFlags | OverridesVisitChildren;
+ JSMap::MapData::IteratorData* iteratorData()
+ {
+ return &m_iterator;
+ }
+private:
JSMapIterator(VM& vm, Structure* structure, JSMap* iteratedObject, MapIterationKind kind)
: Base(vm, structure)
- , m_iterator(iteratedObject->mapData()->begin())
+ , m_iterator(iteratedObject->m_mapData.createIteratorData(this))
, m_kind(kind)
{
}
- void finishCreation(VM&, JSMap*);
+ JS_EXPORT_PRIVATE void finishCreation(VM&, JSMap*);
JSValue createPair(CallFrame*, JSValue, JSValue);
static void visitChildren(JSCell*, SlotVisitor&);
- WriteBarrier<MapData> m_iteratedObjectData;
- MapData::const_iterator m_iterator;
+ WriteBarrier<JSMap> m_map;
+ JSMap::MapData::IteratorData m_iterator;
MapIterationKind m_kind;
};
+STATIC_ASSERT_IS_TRIVIALLY_DESTRUCTIBLE(JSMapIterator);
}