summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/bytecode/StructureSet.h
diff options
context:
space:
mode:
authorOswald Buddenhagen <oswald.buddenhagen@qt.io>2017-05-30 12:48:17 +0200
committerOswald Buddenhagen <oswald.buddenhagen@qt.io>2017-05-30 12:48:17 +0200
commit881da28418d380042aa95a97f0cbd42560a64f7c (patch)
treea794dff3274695e99c651902dde93d934ea7a5af /Source/JavaScriptCore/bytecode/StructureSet.h
parent7e104c57a70fdf551bb3d22a5d637cdcbc69dbea (diff)
parent0fcedcd17cc00d3dd44c718b3cb36c1033319671 (diff)
downloadqtwebkit-881da28418d380042aa95a97f0cbd42560a64f7c.tar.gz
Merge 'wip/next' into dev
Change-Id: Iff9ee5e23bb326c4371ec8ed81d56f2f05d680e9
Diffstat (limited to 'Source/JavaScriptCore/bytecode/StructureSet.h')
-rw-r--r--Source/JavaScriptCore/bytecode/StructureSet.h153
1 files changed, 29 insertions, 124 deletions
diff --git a/Source/JavaScriptCore/bytecode/StructureSet.h b/Source/JavaScriptCore/bytecode/StructureSet.h
index c95d3047b..df19ec538 100644
--- a/Source/JavaScriptCore/bytecode/StructureSet.h
+++ b/Source/JavaScriptCore/bytecode/StructureSet.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011 Apple Inc. All rights reserved.
+ * Copyright (C) 2011, 2013-2015 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -27,155 +27,60 @@
#define StructureSet_h
#include "ArrayProfile.h"
+#include "DumpContext.h"
#include "SpeculatedType.h"
#include "Structure.h"
-#include <stdio.h>
-#include <wtf/Vector.h>
+#include <wtf/TinyPtrSet.h>
namespace JSC {
+class TrackedReferences;
+
namespace DFG {
class StructureAbstractValue;
+struct AbstractValue;
}
-class StructureSet {
+class StructureSet : public TinyPtrSet<Structure*> {
public:
- StructureSet() { }
-
- StructureSet(Structure* structure)
- {
- m_structures.append(structure);
- }
-
- void clear()
- {
- m_structures.clear();
- }
-
- void add(Structure* structure)
- {
- ASSERT(!contains(structure));
- m_structures.append(structure);
- }
-
- bool addAll(const StructureSet& other)
- {
- bool changed = false;
- for (size_t i = 0; i < other.size(); ++i) {
- if (contains(other[i]))
- continue;
- add(other[i]);
- changed = true;
- }
- return changed;
- }
+ // I really want to do this:
+ // using TinyPtrSet::TinyPtrSet;
+ //
+ // But I can't because Windows.
- void remove(Structure* structure)
+ StructureSet()
{
- for (size_t i = 0; i < m_structures.size(); ++i) {
- if (m_structures[i] != structure)
- continue;
-
- m_structures[i] = m_structures.last();
- m_structures.removeLast();
- return;
- }
}
- bool contains(Structure* structure) const
- {
- for (size_t i = 0; i < m_structures.size(); ++i) {
- if (m_structures[i] == structure)
- return true;
- }
- return false;
- }
-
- bool containsOnly(Structure* structure) const
- {
- if (size() != 1)
- return false;
- return singletonStructure() == structure;
- }
-
- bool isSubsetOf(const StructureSet& other) const
- {
- for (size_t i = 0; i < m_structures.size(); ++i) {
- if (!other.contains(m_structures[i]))
- return false;
- }
- return true;
- }
-
- bool isSupersetOf(const StructureSet& other) const
- {
- return other.isSubsetOf(*this);
- }
-
- size_t size() const { return m_structures.size(); }
-
- // Call this if you know that the structure set must consist of exactly
- // one structure.
- Structure* singletonStructure() const
+ StructureSet(Structure* structure)
+ : TinyPtrSet(structure)
{
- ASSERT(m_structures.size() == 1);
- return m_structures[0];
}
- Structure* at(size_t i) const { return m_structures.at(i); }
-
- Structure* operator[](size_t i) const { return at(i); }
-
- Structure* last() const { return m_structures.last(); }
-
- SpeculatedType speculationFromStructures() const
+ ALWAYS_INLINE StructureSet(const StructureSet& other)
+ : TinyPtrSet(other)
{
- SpeculatedType result = SpecNone;
-
- for (size_t i = 0; i < m_structures.size(); ++i)
- mergeSpeculation(result, speculationFromStructure(m_structures[i]));
-
- return result;
}
- ArrayModes arrayModesFromStructures() const
+ Structure* onlyStructure() const
{
- ArrayModes result = 0;
-
- for (size_t i = 0; i < m_structures.size(); ++i)
- mergeArrayModes(result, asArrayModes(m_structures[i]->indexingType()));
-
- return result;
+ return onlyEntry();
}
- bool operator==(const StructureSet& other) const
- {
- if (m_structures.size() != other.m_structures.size())
- return false;
-
- for (size_t i = 0; i < m_structures.size(); ++i) {
- if (!other.contains(m_structures[i]))
- return false;
- }
-
- return true;
- }
+#if ENABLE(DFG_JIT)
+ void filter(const DFG::StructureAbstractValue&);
+ void filter(SpeculatedType);
+ void filterArrayModes(ArrayModes);
+ void filter(const DFG::AbstractValue&);
+#endif // ENABLE(DFG_JIT)
- void dump(FILE* out)
- {
- fprintf(out, "[");
- for (size_t i = 0; i < m_structures.size(); ++i) {
- if (i)
- fprintf(out, ", ");
- fprintf(out, "%p", m_structures[i]);
- }
- fprintf(out, "]");
- }
+ SpeculatedType speculationFromStructures() const;
+ ArrayModes arrayModesFromStructures() const;
-private:
- friend class DFG::StructureAbstractValue;
+ void dumpInContext(PrintStream&, DumpContext*) const;
+ void dump(PrintStream&) const;
- Vector<Structure*, 2> m_structures;
+ void validateReferences(const TrackedReferences&) const;
};
} // namespace JSC