diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
commit | 32761a6cee1d0dee366b885b7b9c777e67885688 (patch) | |
tree | d6bec92bebfb216f4126356e55518842c2f476a1 /Source/JavaScriptCore/runtime/StructureRareData.cpp | |
parent | a4e969f4965059196ca948db781e52f7cfebf19e (diff) | |
download | WebKitGtk-tarball-32761a6cee1d0dee366b885b7b9c777e67885688.tar.gz |
webkitgtk-2.4.11webkitgtk-2.4.11
Diffstat (limited to 'Source/JavaScriptCore/runtime/StructureRareData.cpp')
-rw-r--r-- | Source/JavaScriptCore/runtime/StructureRareData.cpp | 179 |
1 files changed, 19 insertions, 160 deletions
diff --git a/Source/JavaScriptCore/runtime/StructureRareData.cpp b/Source/JavaScriptCore/runtime/StructureRareData.cpp index add963ce4..9e7265178 100644 --- a/Source/JavaScriptCore/runtime/StructureRareData.cpp +++ b/Source/JavaScriptCore/runtime/StructureRareData.cpp @@ -26,19 +26,17 @@ #include "config.h" #include "StructureRareData.h" -#include "AdaptiveInferredPropertyValueWatchpointBase.h" -#include "JSPropertyNameEnumerator.h" +#include "JSPropertyNameIterator.h" #include "JSString.h" -#include "JSCInlines.h" -#include "ObjectPropertyConditionSet.h" +#include "Operations.h" namespace JSC { -const ClassInfo StructureRareData::s_info = { "StructureRareData", 0, 0, CREATE_METHOD_TABLE(StructureRareData) }; +const ClassInfo StructureRareData::s_info = { "StructureRareData", 0, 0, 0, CREATE_METHOD_TABLE(StructureRareData) }; Structure* StructureRareData::createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype) { - return Structure::create(vm, globalObject, prototype, TypeInfo(CellType, StructureFlags), info()); + return Structure::create(vm, globalObject, prototype, TypeInfo(CompoundType, StructureFlags), info()); } StructureRareData* StructureRareData::create(VM& vm, Structure* previous) @@ -48,178 +46,39 @@ StructureRareData* StructureRareData::create(VM& vm, Structure* previous) return rareData; } -void StructureRareData::destroy(JSCell* cell) +StructureRareData* StructureRareData::clone(VM& vm, const StructureRareData* other) { - static_cast<StructureRareData*>(cell)->StructureRareData::~StructureRareData(); + StructureRareData* newRareData = new (NotNull, allocateCell<StructureRareData>(vm.heap)) StructureRareData(vm, other); + newRareData->finishCreation(vm); + return newRareData; } StructureRareData::StructureRareData(VM& vm, Structure* previous) : JSCell(vm, vm.structureRareDataStructure.get()) - , m_giveUpOnObjectToStringValueCache(false) { if (previous) m_previous.set(vm, this, previous); } +StructureRareData::StructureRareData(VM& vm, const StructureRareData* other) + : JSCell(vm, other->structure()) +{ + if (other->previousID()) + m_previous.set(vm, this, other->previousID()); + if (other->objectToStringValue()) + m_objectToStringValue.set(vm, this, other->objectToStringValue()); +} + void StructureRareData::visitChildren(JSCell* cell, SlotVisitor& visitor) { StructureRareData* thisObject = jsCast<StructureRareData*>(cell); ASSERT_GC_OBJECT_INHERITS(thisObject, info()); + ASSERT(thisObject->structure()->typeInfo().overridesVisitChildren()); JSCell::visitChildren(thisObject, visitor); visitor.append(&thisObject->m_previous); visitor.append(&thisObject->m_objectToStringValue); - visitor.append(&thisObject->m_cachedPropertyNameEnumerator); -} - -JSPropertyNameEnumerator* StructureRareData::cachedPropertyNameEnumerator() const -{ - return m_cachedPropertyNameEnumerator.get(); -} - -void StructureRareData::setCachedPropertyNameEnumerator(VM& vm, JSPropertyNameEnumerator* enumerator) -{ - m_cachedPropertyNameEnumerator.set(vm, this, enumerator); -} - -// ----------- Object.prototype.toString() helper watchpoint classes ----------- - -class ObjectToStringAdaptiveInferredPropertyValueWatchpoint : public AdaptiveInferredPropertyValueWatchpointBase { -public: - typedef AdaptiveInferredPropertyValueWatchpointBase Base; - ObjectToStringAdaptiveInferredPropertyValueWatchpoint(const ObjectPropertyCondition&, StructureRareData*); - -private: - virtual void handleFire(const FireDetail&) override; - - StructureRareData* m_structureRareData; -}; - -class ObjectToStringAdaptiveStructureWatchpoint : public Watchpoint { -public: - ObjectToStringAdaptiveStructureWatchpoint(const ObjectPropertyCondition&, StructureRareData*); - - void install(); - -protected: - virtual void fireInternal(const FireDetail&) override; - -private: - ObjectPropertyCondition m_key; - StructureRareData* m_structureRareData; -}; - -void StructureRareData::setObjectToStringValue(ExecState* exec, VM& vm, Structure* ownStructure, JSString* value, PropertySlot toStringTagSymbolSlot) -{ - if (m_giveUpOnObjectToStringValueCache) - return; - - ObjectPropertyConditionSet conditionSet; - if (toStringTagSymbolSlot.isValue()) { - // We don't handle the own property case of Symbol.toStringTag because we would never know if a new - // object transitioning to the same structure had the same value stored in Symbol.toStringTag. - // Additionally, this is a super unlikely case anyway. - if (!toStringTagSymbolSlot.isCacheable() || toStringTagSymbolSlot.slotBase()->structure(vm) == ownStructure) - return; - - - // This will not create a condition for the current structure but that is good because we know the Symbol.toStringTag - // is not on the ownStructure so we will transisition if one is added and this cache will no longer be used. - conditionSet = generateConditionsForPrototypePropertyHit(vm, this, exec, ownStructure, toStringTagSymbolSlot.slotBase(), vm.propertyNames->toStringTagSymbol.impl()); - ASSERT(conditionSet.hasOneSlotBaseCondition()); - } else if (toStringTagSymbolSlot.isUnset()) - conditionSet = generateConditionsForPropertyMiss(vm, this, exec, ownStructure, vm.propertyNames->toStringTagSymbol.impl()); - else - return; - - if (!conditionSet.isValid()) { - m_giveUpOnObjectToStringValueCache = true; - return; - } - - ObjectPropertyCondition equivCondition; - for (const ObjectPropertyCondition& condition : conditionSet) { - if (condition.condition().kind() == PropertyCondition::Presence) { - ASSERT(isValidOffset(condition.offset())); - condition.object()->structure(vm)->startWatchingPropertyForReplacements(vm, condition.offset()); - equivCondition = condition.attemptToMakeEquivalenceWithoutBarrier(); - - // The equivalence condition won't be watchable if we have already seen a replacement. - if (!equivCondition.isWatchable()) { - m_giveUpOnObjectToStringValueCache = true; - return; - } - } else if (!condition.isWatchable()) { - m_giveUpOnObjectToStringValueCache = true; - return; - } - } - - ASSERT(conditionSet.structuresEnsureValidity()); - for (ObjectPropertyCondition condition : conditionSet) { - if (condition.condition().kind() == PropertyCondition::Presence) { - m_objectToStringAdaptiveInferredValueWatchpoint = std::make_unique<ObjectToStringAdaptiveInferredPropertyValueWatchpoint>(equivCondition, this); - m_objectToStringAdaptiveInferredValueWatchpoint->install(); - } else - m_objectToStringAdaptiveWatchpointSet.add(condition, this)->install(); - } - - m_objectToStringValue.set(vm, this, value); -} - -inline void StructureRareData::clearObjectToStringValue() -{ - m_objectToStringAdaptiveWatchpointSet.clear(); - m_objectToStringAdaptiveInferredValueWatchpoint.reset(); - m_objectToStringValue.clear(); -} - -// ------------- Methods for Object.prototype.toString() helper watchpoint classes -------------- - -ObjectToStringAdaptiveStructureWatchpoint::ObjectToStringAdaptiveStructureWatchpoint(const ObjectPropertyCondition& key, StructureRareData* structureRareData) - : m_key(key) - , m_structureRareData(structureRareData) -{ - RELEASE_ASSERT(key.watchingRequiresStructureTransitionWatchpoint()); - RELEASE_ASSERT(!key.watchingRequiresReplacementWatchpoint()); -} - -void ObjectToStringAdaptiveStructureWatchpoint::install() -{ - RELEASE_ASSERT(m_key.isWatchable()); - - m_key.object()->structure()->addTransitionWatchpoint(this); -} - -void ObjectToStringAdaptiveStructureWatchpoint::fireInternal(const FireDetail& detail) -{ - if (m_key.isWatchable(PropertyCondition::EnsureWatchability)) { - install(); - return; - } - - StringPrintStream out; - out.print("ObjectToStringValue Adaptation of ", m_key, " failed: ", detail); - - StringFireDetail stringDetail(out.toCString().data()); - - m_structureRareData->clearObjectToStringValue(); -} - -ObjectToStringAdaptiveInferredPropertyValueWatchpoint::ObjectToStringAdaptiveInferredPropertyValueWatchpoint(const ObjectPropertyCondition& key, StructureRareData* structureRareData) - : Base(key) - , m_structureRareData(structureRareData) -{ -} - -void ObjectToStringAdaptiveInferredPropertyValueWatchpoint::handleFire(const FireDetail& detail) -{ - StringPrintStream out; - out.print("Adaptation of ", key(), " failed: ", detail); - - StringFireDetail stringDetail(out.toCString().data()); - - m_structureRareData->clearObjectToStringValue(); + visitor.append(&thisObject->m_enumerationCache); } } // namespace JSC |