diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/JavaScriptCore/runtime/JSSetIterator.h | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/JavaScriptCore/runtime/JSSetIterator.h')
-rw-r--r-- | Source/JavaScriptCore/runtime/JSSetIterator.h | 84 |
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 |