summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/runtime/StructureRareData.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
commit32761a6cee1d0dee366b885b7b9c777e67885688 (patch)
treed6bec92bebfb216f4126356e55518842c2f476a1 /Source/JavaScriptCore/runtime/StructureRareData.cpp
parenta4e969f4965059196ca948db781e52f7cfebf19e (diff)
downloadWebKitGtk-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.cpp179
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