X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/81345200c95645a1b0d2635520f96ad55dfde63f..ed1e77d3adeb83d26fd1dfb16dd84cabdcefd250:/bytecode/PutByIdVariant.h diff --git a/bytecode/PutByIdVariant.h b/bytecode/PutByIdVariant.h index eba95e8..9dfedbd 100644 --- a/bytecode/PutByIdVariant.h +++ b/bytecode/PutByIdVariant.h @@ -28,74 +28,81 @@ #include "IntendedStructureChain.h" #include "PropertyOffset.h" +#include "StructureSet.h" namespace JSC { +class CallLinkStatus; + class PutByIdVariant { public: enum Kind { NotSet, Replace, - Transition + Transition, + Setter }; PutByIdVariant() : m_kind(NotSet) - , m_oldStructure(0) - , m_newStructure(0) + , m_newStructure(nullptr) + , m_alternateBase(nullptr) , m_offset(invalidOffset) { } - static PutByIdVariant replace(Structure* structure, PropertyOffset offset) - { - PutByIdVariant result; - result.m_kind = Replace; - result.m_oldStructure = structure; - result.m_offset = offset; - return result; - } + PutByIdVariant(const PutByIdVariant&); + PutByIdVariant& operator=(const PutByIdVariant&); + + static PutByIdVariant replace( + const StructureSet& structure, PropertyOffset offset); static PutByIdVariant transition( - Structure* oldStructure, Structure* newStructure, - PassRefPtr structureChain, PropertyOffset offset) - { - PutByIdVariant result; - result.m_kind = Transition; - result.m_oldStructure = oldStructure; - result.m_newStructure = newStructure; - result.m_structureChain = structureChain; - result.m_offset = offset; - return result; - } + const StructureSet& oldStructure, Structure* newStructure, + const IntendedStructureChain* structureChain, PropertyOffset offset); + + static PutByIdVariant setter( + const StructureSet& structure, PropertyOffset offset, + IntendedStructureChain* chain, std::unique_ptr callLinkStatus); Kind kind() const { return m_kind; } bool isSet() const { return kind() != NotSet; } bool operator!() const { return !isSet(); } - Structure* structure() const + const StructureSet& structure() const + { + ASSERT(kind() == Replace || kind() == Setter); + return m_oldStructure; + } + + const StructureSet& oldStructure() const { - ASSERT(kind() == Replace); + ASSERT(kind() == Transition || kind() == Replace || kind() == Setter); return m_oldStructure; } - Structure* oldStructure() const + StructureSet& oldStructure() { - ASSERT(kind() == Transition || kind() == Replace); + ASSERT(kind() == Transition || kind() == Replace || kind() == Setter); return m_oldStructure; } + Structure* oldStructureForTransition() const; + Structure* newStructure() const { ASSERT(kind() == Transition); return m_newStructure; } + + bool writesStructures() const; + bool reallocatesStorage() const; + bool makesCalls() const; - IntendedStructureChain* structureChain() const + const ConstantStructureCheckVector& constantChecks() const { - ASSERT(kind() == Transition); - return m_structureChain.get(); + return m_constantChecks; } PropertyOffset offset() const @@ -104,15 +111,35 @@ public: return m_offset; } + JSObject* alternateBase() const + { + ASSERT(kind() == Setter); + return m_alternateBase; + } + + StructureSet baseStructure() const; + + CallLinkStatus* callLinkStatus() const + { + ASSERT(kind() == Setter); + return m_callLinkStatus.get(); + } + + bool attemptToMerge(const PutByIdVariant& other); + void dump(PrintStream&) const; void dumpInContext(PrintStream&, DumpContext*) const; private: + bool attemptToMergeTransitionWithReplace(const PutByIdVariant& replace); + Kind m_kind; - Structure* m_oldStructure; + StructureSet m_oldStructure; Structure* m_newStructure; - RefPtr m_structureChain; + ConstantStructureCheckVector m_constantChecks; + JSObject* m_alternateBase; PropertyOffset m_offset; + std::unique_ptr m_callLinkStatus; }; } // namespace JSC