summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/bytecode/StructureStubClearingWatchpoint.cpp
diff options
context:
space:
mode:
authorKonstantin Tokarev <annulen@yandex.ru>2016-08-25 19:20:41 +0300
committerKonstantin Tokarev <annulen@yandex.ru>2017-02-02 12:30:55 +0000
commit6882a04fb36642862b11efe514251d32070c3d65 (patch)
treeb7959826000b061fd5ccc7512035c7478742f7b0 /Source/JavaScriptCore/bytecode/StructureStubClearingWatchpoint.cpp
parentab6df191029eeeb0b0f16f127d553265659f739e (diff)
downloadqtwebkit-6882a04fb36642862b11efe514251d32070c3d65.tar.gz
Imported QtWebKit TP3 (git b57bc6801f1876c3220d5a4bfea33d620d477443)
Change-Id: I3b1d8a2808782c9f34d50240000e20cb38d3680f Reviewed-by: Konstantin Tokarev <annulen@yandex.ru>
Diffstat (limited to 'Source/JavaScriptCore/bytecode/StructureStubClearingWatchpoint.cpp')
-rw-r--r--Source/JavaScriptCore/bytecode/StructureStubClearingWatchpoint.cpp43
1 files changed, 29 insertions, 14 deletions
diff --git a/Source/JavaScriptCore/bytecode/StructureStubClearingWatchpoint.cpp b/Source/JavaScriptCore/bytecode/StructureStubClearingWatchpoint.cpp
index 5cfb3d1e8..d2bdd6a5a 100644
--- a/Source/JavaScriptCore/bytecode/StructureStubClearingWatchpoint.cpp
+++ b/Source/JavaScriptCore/bytecode/StructureStubClearingWatchpoint.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012 Apple Inc. All rights reserved.
+ * Copyright (C) 2012, 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
@@ -29,6 +29,7 @@
#if ENABLE(JIT)
#include "CodeBlock.h"
+#include "JSCInlines.h"
#include "StructureStubInfo.h"
namespace JSC {
@@ -36,42 +37,56 @@ namespace JSC {
StructureStubClearingWatchpoint::~StructureStubClearingWatchpoint() { }
StructureStubClearingWatchpoint* StructureStubClearingWatchpoint::push(
+ const ObjectPropertyCondition& key,
WatchpointsOnStructureStubInfo& holder,
- OwnPtr<StructureStubClearingWatchpoint>& head)
+ std::unique_ptr<StructureStubClearingWatchpoint>& head)
{
- head = adoptPtr(new StructureStubClearingWatchpoint(holder, head.release()));
+ head = std::make_unique<StructureStubClearingWatchpoint>(key, holder, WTFMove(head));
return head.get();
}
-void StructureStubClearingWatchpoint::fireInternal()
+void StructureStubClearingWatchpoint::fireInternal(const FireDetail&)
{
- // This will implicitly cause my own demise: stub reset removes all watchpoints.
- // That works, because deleting a watchpoint removes it from the set's list, and
- // the set's list traversal for firing is robust against the set changing.
- m_holder.codeBlock()->resetStub(*m_holder.stubInfo());
+ if (!m_key || !m_key.isWatchable(PropertyCondition::EnsureWatchability)) {
+ // This will implicitly cause my own demise: stub reset removes all watchpoints.
+ // That works, because deleting a watchpoint removes it from the set's list, and
+ // the set's list traversal for firing is robust against the set changing.
+ ConcurrentJITLocker locker(m_holder.codeBlock()->m_lock);
+ m_holder.stubInfo()->reset(m_holder.codeBlock());
+ return;
+ }
+
+ if (m_key.kind() == PropertyCondition::Presence) {
+ // If this was a presence condition, let's watch the property for replacements. This is profitable
+ // for the DFG, which will want the replacement set to be valid in order to do constant folding.
+ VM& vm = *Heap::heap(m_key.object())->vm();
+ m_key.object()->structure()->startWatchingPropertyForReplacements(vm, m_key.offset());
+ }
+
+ m_key.object()->structure()->addTransitionWatchpoint(this);
}
WatchpointsOnStructureStubInfo::~WatchpointsOnStructureStubInfo()
{
}
-StructureStubClearingWatchpoint* WatchpointsOnStructureStubInfo::addWatchpoint()
+StructureStubClearingWatchpoint* WatchpointsOnStructureStubInfo::addWatchpoint(const ObjectPropertyCondition& key)
{
- return StructureStubClearingWatchpoint::push(*this, m_head);
+ return StructureStubClearingWatchpoint::push(key, *this, m_head);
}
StructureStubClearingWatchpoint* WatchpointsOnStructureStubInfo::ensureReferenceAndAddWatchpoint(
- RefPtr<WatchpointsOnStructureStubInfo>& holderRef, CodeBlock* codeBlock,
- StructureStubInfo* stubInfo)
+ std::unique_ptr<WatchpointsOnStructureStubInfo>& holderRef, CodeBlock* codeBlock,
+ StructureStubInfo* stubInfo, const ObjectPropertyCondition& key)
{
if (!holderRef)
- holderRef = adoptRef(new WatchpointsOnStructureStubInfo(codeBlock, stubInfo));
+ holderRef = std::make_unique<WatchpointsOnStructureStubInfo>(codeBlock, stubInfo);
else {
ASSERT(holderRef->m_codeBlock == codeBlock);
ASSERT(holderRef->m_stubInfo == stubInfo);
}
- return holderRef->addWatchpoint();
+ return holderRef->addWatchpoint(key);
}
} // namespace JSC