summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/runtime/JSSetIterator.h
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/JavaScriptCore/runtime/JSSetIterator.h
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/JavaScriptCore/runtime/JSSetIterator.h')
-rw-r--r--Source/JavaScriptCore/runtime/JSSetIterator.h84
1 files changed, 47 insertions, 37 deletions
diff --git a/Source/JavaScriptCore/runtime/JSSetIterator.h b/Source/JavaScriptCore/runtime/JSSetIterator.h
index edf3bfbf9..a6fb1b62b 100644
--- a/Source/JavaScriptCore/runtime/JSSetIterator.h
+++ b/Source/JavaScriptCore/runtime/JSSetIterator.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013 Apple, Inc. All rights reserved.
+ * Copyright (C) 2013, 2016 Apple, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -23,24 +23,18 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef JSSetIterator_h
-#define JSSetIterator_h
+#pragma once
-#include "JSDestructibleObject.h"
+#include "IterationKind.h"
+#include "JSObject.h"
#include "JSSet.h"
-#include "MapData.h"
-
namespace JSC {
-enum SetIterationKind : uint32_t {
- SetIterateKey,
- SetIterateValue,
- SetIterateKeyValue,
-};
-class JSSetIterator : public JSDestructibleObject {
+class JSSetIterator : public JSNonFinalObject {
+ typedef HashMapBucket<HashMapBucketDataKey> HashMapBucketType;
public:
- typedef JSDestructibleObject Base;
+ typedef JSNonFinalObject Base;
DECLARE_EXPORT_INFO;
@@ -49,50 +43,66 @@ public:
return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info());
}
- static JSSetIterator* create(VM& vm, Structure* structure, JSSet* iteratedObject, SetIterationKind kind)
+ static JSSetIterator* create(VM& vm, Structure* structure, JSSet* iteratedObject, IterationKind kind)
{
JSSetIterator* instance = new (NotNull, allocateCell<JSSetIterator>(vm.heap)) JSSetIterator(vm, structure, iteratedObject, kind);
instance->finishCreation(vm, iteratedObject);
return instance;
}
- bool next(CallFrame* callFrame, JSValue& value)
+ ALWAYS_INLINE HashMapBucketType* advanceIter(ExecState* exec)
{
- if (!m_iterator.ensureSlot())
+ HashMapBucketType* prev = m_iter.get();
+ if (!prev)
+ return nullptr;
+ HashMapBucketType* bucket = m_iter->next();
+ while (bucket && bucket->deleted())
+ bucket = bucket->next();
+ if (!bucket) {
+ setIterator(exec->vm(), nullptr);
+ return nullptr;
+ }
+ setIterator(exec->vm(), bucket); // We keep m_iter on the last value since the first thing we do in this function is call next().
+ return bucket;
+ }
+
+ bool next(ExecState* exec, JSValue& value)
+ {
+ HashMapBucketType* bucket = advanceIter(exec);
+ if (!bucket)
return false;
- if (m_kind == SetIterateValue || m_kind == SetIterateKey)
- value = m_iterator.key();
+
+ if (m_kind == IterateValue || m_kind == IterateKey)
+ value = bucket->key();
else
- value = createPair(callFrame, m_iterator.key(), m_iterator.key());
- ++m_iterator;
+ value = createPair(exec, bucket->key(), bucket->key());
return true;
}
- void finish()
- {
- m_iterator.finish();
- }
+ IterationKind kind() const { return m_kind; }
+ JSValue iteratedValue() const { return m_set.get(); }
+ JSSetIterator* clone(ExecState*);
private:
-
- static const unsigned StructureFlags = Base::StructureFlags | OverridesVisitChildren;
-
- JSSetIterator(VM& vm, Structure* structure, JSSet* iteratedObject, SetIterationKind kind)
+ JSSetIterator(VM& vm, Structure* structure, JSSet*, IterationKind kind)
: Base(vm, structure)
- , m_iterator(iteratedObject->mapData()->begin())
, m_kind(kind)
{
}
- void finishCreation(VM&, JSSet*);
- JSValue createPair(CallFrame*, JSValue, JSValue);
+ void setIterator(VM& vm, HashMapBucketType* bucket)
+ {
+ m_iter.setMayBeNull(vm, this, bucket);
+ }
+
+ JS_EXPORT_PRIVATE void finishCreation(VM&, JSSet*);
+ JS_EXPORT_PRIVATE JSValue createPair(CallFrame*, JSValue, JSValue);
static void visitChildren(JSCell*, SlotVisitor&);
- WriteBarrier<MapData> m_iteratedObjectData;
- MapData::const_iterator m_iterator;
- SetIterationKind m_kind;
+ WriteBarrier<JSSet> m_set;
+ WriteBarrier<HashMapBucketType> m_iter;
+ IterationKind m_kind;
};
+STATIC_ASSERT_IS_TRIVIALLY_DESTRUCTIBLE(JSSetIterator);
-}
-
-#endif // !defined(JSSetIterator_h)
+} // namespace JSC