summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/bytecode/CallLinkInfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/JavaScriptCore/bytecode/CallLinkInfo.cpp')
-rw-r--r--Source/JavaScriptCore/bytecode/CallLinkInfo.cpp76
1 files changed, 15 insertions, 61 deletions
diff --git a/Source/JavaScriptCore/bytecode/CallLinkInfo.cpp b/Source/JavaScriptCore/bytecode/CallLinkInfo.cpp
index 7292f7364..a4baa6100 100644
--- a/Source/JavaScriptCore/bytecode/CallLinkInfo.cpp
+++ b/Source/JavaScriptCore/bytecode/CallLinkInfo.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012, 2013, 2014 Apple Inc. All rights reserved.
+ * Copyright (C) 2012 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -28,79 +28,33 @@
#include "DFGOperations.h"
#include "DFGThunks.h"
-#include "JSCInlines.h"
-#include "Repatch.h"
#include "RepatchBuffer.h"
-#include <wtf/ListDump.h>
-#include <wtf/NeverDestroyed.h>
#if ENABLE(JIT)
namespace JSC {
-void CallLinkInfo::clearStub()
+void CallLinkInfo::unlink(VM& vm, RepatchBuffer& repatchBuffer)
{
- if (!stub())
- return;
-
- m_stub->clearCallNodesFor(this);
- m_stub = nullptr;
-}
-
-void CallLinkInfo::unlink(RepatchBuffer& repatchBuffer)
-{
- if (!isLinked()) {
- // We could be called even if we're not linked anymore because of how polymorphic calls
- // work. Each callsite within the polymorphic call stub may separately ask us to unlink().
- RELEASE_ASSERT(!isOnList());
- return;
- }
+ ASSERT(isLinked());
- unlinkFor(repatchBuffer, *this);
+ repatchBuffer.revertJumpReplacementToBranchPtrWithPatch(RepatchBuffer::startOfBranchPtrWithPatchOnRegister(hotPathBegin), static_cast<MacroAssembler::RegisterID>(calleeGPR), 0);
+ if (isDFG) {
+#if ENABLE(DFG_JIT)
+ repatchBuffer.relink(callReturnLocation, (callType == Construct ? vm.getCTIStub(linkConstructThunkGenerator) : vm.getCTIStub(linkCallThunkGenerator)).code());
+#else
+ RELEASE_ASSERT_NOT_REACHED();
+#endif
+ } else
+ repatchBuffer.relink(callReturnLocation, callType == Construct ? vm.getCTIStub(linkConstructThunkGenerator).code() : vm.getCTIStub(linkCallThunkGenerator).code());
+ hasSeenShouldRepatch = false;
+ callee.clear();
+ stub.clear();
// It will be on a list if the callee has a code block.
if (isOnList())
remove();
}
-void CallLinkInfo::visitWeak(RepatchBuffer& repatchBuffer)
-{
- auto handleSpecificCallee = [&] (JSFunction* callee) {
- if (Heap::isMarked(callee->executable()))
- m_hasSeenClosure = true;
- else
- m_clearedByGC = true;
- };
-
- if (isLinked()) {
- if (stub()) {
- if (!stub()->visitWeak(repatchBuffer)) {
- if (Options::verboseOSR()) {
- dataLog(
- "Clearing closure call from ", *repatchBuffer.codeBlock(), " to ",
- listDump(stub()->variants()), ", stub routine ", RawPointer(stub()),
- ".\n");
- }
- unlink(repatchBuffer);
- m_clearedByGC = true;
- }
- } else if (!Heap::isMarked(m_callee.get())) {
- if (Options::verboseOSR()) {
- dataLog(
- "Clearing call from ", *repatchBuffer.codeBlock(), " to ",
- RawPointer(m_callee.get()), " (",
- m_callee.get()->executable()->hashFor(specializationKind()),
- ").\n");
- }
- handleSpecificCallee(m_callee.get());
- unlink(repatchBuffer);
- }
- }
- if (haveLastSeenCallee() && !Heap::isMarked(lastSeenCallee())) {
- handleSpecificCallee(lastSeenCallee());
- clearLastSeenCallee();
- }
-}
-
} // namespace JSC
#endif // ENABLE(JIT)