diff options
Diffstat (limited to 'Source/JavaScriptCore/bytecode/CallLinkInfo.cpp')
-rw-r--r-- | Source/JavaScriptCore/bytecode/CallLinkInfo.cpp | 102 |
1 files changed, 16 insertions, 86 deletions
diff --git a/Source/JavaScriptCore/bytecode/CallLinkInfo.cpp b/Source/JavaScriptCore/bytecode/CallLinkInfo.cpp index 0579d4250..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 @@ -26,105 +26,35 @@ #include "config.h" #include "CallLinkInfo.h" -#include "CallFrameShuffleData.h" #include "DFGOperations.h" #include "DFGThunks.h" -#include "JSCInlines.h" -#include "Repatch.h" -#include <wtf/ListDump.h> -#include <wtf/NeverDestroyed.h> +#include "RepatchBuffer.h" #if ENABLE(JIT) namespace JSC { -CallLinkInfo::CallLinkInfo() - : m_hasSeenShouldRepatch(false) - , m_hasSeenClosure(false) - , m_clearedByGC(false) - , m_allowStubs(true) - , m_callType(None) - , m_maxNumArguments(0) - , m_slowPathCount(0) +void CallLinkInfo::unlink(VM& vm, RepatchBuffer& repatchBuffer) { -} - -CallLinkInfo::~CallLinkInfo() -{ - clearStub(); - - if (isOnList()) - remove(); -} - -void CallLinkInfo::clearStub() -{ - if (!stub()) - return; - - m_stub->clearCallNodesFor(this); - m_stub = nullptr; -} - -void CallLinkInfo::unlink(VM& vm) -{ - 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(vm, *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(VM& vm) -{ - auto handleSpecificCallee = [&] (JSFunction* callee) { - if (Heap::isMarked(callee->executable())) - m_hasSeenClosure = true; - else - m_clearedByGC = true; - }; - - if (isLinked()) { - if (stub()) { - if (!stub()->visitWeak(vm)) { - if (Options::verboseOSR()) { - dataLog( - "Clearing closure call to ", - listDump(stub()->variants()), ", stub routine ", RawPointer(stub()), - ".\n"); - } - unlink(vm); - m_clearedByGC = true; - } - } else if (!Heap::isMarked(m_callee.get())) { - if (Options::verboseOSR()) { - dataLog( - "Clearing call to ", - RawPointer(m_callee.get()), " (", - m_callee.get()->executable()->hashFor(specializationKind()), - ").\n"); - } - handleSpecificCallee(m_callee.get()); - unlink(vm); - } - } - if (haveLastSeenCallee() && !Heap::isMarked(lastSeenCallee())) { - handleSpecificCallee(lastSeenCallee()); - clearLastSeenCallee(); - } -} - -void CallLinkInfo::setFrameShuffleData(const CallFrameShuffleData& shuffleData) -{ - m_frameShuffleData = std::make_unique<CallFrameShuffleData>(shuffleData); -} - } // namespace JSC #endif // ENABLE(JIT) |