summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/dfg/DFGCommonData.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/JavaScriptCore/dfg/DFGCommonData.cpp
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c.tar.gz
Diffstat (limited to 'Source/JavaScriptCore/dfg/DFGCommonData.cpp')
-rw-r--r--Source/JavaScriptCore/dfg/DFGCommonData.cpp60
1 files changed, 53 insertions, 7 deletions
diff --git a/Source/JavaScriptCore/dfg/DFGCommonData.cpp b/Source/JavaScriptCore/dfg/DFGCommonData.cpp
index 7b7ed0e40..42dd3813a 100644
--- a/Source/JavaScriptCore/dfg/DFGCommonData.cpp
+++ b/Source/JavaScriptCore/dfg/DFGCommonData.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013 Apple Inc. All rights reserved.
+ * Copyright (C) 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
@@ -31,7 +31,9 @@
#include "CodeBlock.h"
#include "DFGNode.h"
#include "DFGPlan.h"
-#include "Operations.h"
+#include "InlineCallFrame.h"
+#include "JSCInlines.h"
+#include "TrackedReferences.h"
#include "VM.h"
namespace JSC { namespace DFG {
@@ -40,19 +42,42 @@ void CommonData::notifyCompilingStructureTransition(Plan& plan, CodeBlock* codeB
{
plan.transitions.addLazily(
codeBlock,
- node->codeOrigin.codeOriginOwner(),
- node->structureTransitionData().previousStructure,
- node->structureTransitionData().newStructure);
+ node->origin.semantic.codeOriginOwner(),
+ node->transition()->previous.get(),
+ node->transition()->next.get());
}
-unsigned CommonData::addCodeOrigin(CodeOrigin codeOrigin)
+CallSiteIndex CommonData::addCodeOrigin(CodeOrigin codeOrigin)
{
if (codeOrigins.isEmpty()
|| codeOrigins.last() != codeOrigin)
codeOrigins.append(codeOrigin);
unsigned index = codeOrigins.size() - 1;
ASSERT(codeOrigins[index] == codeOrigin);
- return index;
+ return CallSiteIndex(index);
+}
+
+CallSiteIndex CommonData::addUniqueCallSiteIndex(CodeOrigin codeOrigin)
+{
+ if (callSiteIndexFreeList.size())
+ return CallSiteIndex(callSiteIndexFreeList.takeAny());
+
+ codeOrigins.append(codeOrigin);
+ unsigned index = codeOrigins.size() - 1;
+ ASSERT(codeOrigins[index] == codeOrigin);
+ return CallSiteIndex(index);
+}
+
+CallSiteIndex CommonData::lastCallSite() const
+{
+ RELEASE_ASSERT(codeOrigins.size());
+ return CallSiteIndex(codeOrigins.size() - 1);
+}
+
+void CommonData::removeCallSiteIndex(CallSiteIndex callSite)
+{
+ RELEASE_ASSERT(callSite.bits() < codeOrigins.size());
+ callSiteIndexFreeList.add(callSite.bits());
}
void CommonData::shrinkToFit()
@@ -72,6 +97,27 @@ bool CommonData::invalidate()
return true;
}
+void CommonData::validateReferences(const TrackedReferences& trackedReferences)
+{
+ if (InlineCallFrameSet* set = inlineCallFrames.get()) {
+ for (InlineCallFrame* inlineCallFrame : *set) {
+ for (ValueRecovery& recovery : inlineCallFrame->arguments) {
+ if (recovery.isConstant())
+ trackedReferences.check(recovery.constant());
+ }
+
+ if (CodeBlock* baselineCodeBlock = inlineCallFrame->baselineCodeBlock.get())
+ trackedReferences.check(baselineCodeBlock);
+
+ if (inlineCallFrame->calleeRecovery.isConstant())
+ trackedReferences.check(inlineCallFrame->calleeRecovery.constant());
+ }
+ }
+
+ for (AdaptiveStructureWatchpoint* watchpoint : adaptiveStructureWatchpoints)
+ watchpoint->key().validateReferences(trackedReferences);
+}
+
} } // namespace JSC::DFG
#endif // ENABLE(DFG_JIT)