void JITCompiler::linkOSRExits() { ASSERT(m_jitCode->osrExit.size() == m_exitCompilationInfo.size()); if (m_graph.compilation()) { for (unsigned i = 0; i < m_jitCode->osrExit.size(); ++i) { OSRExitCompilationInfo& info = m_exitCompilationInfo[i]; Vector<Label> labels; if (!info.m_failureJumps.empty()) { for (unsigned j = 0; j < info.m_failureJumps.jumps().size(); ++j) labels.append(info.m_failureJumps.jumps()[j].label()); } else labels.append(info.m_replacementSource); m_exitSiteLabels.append(labels); } } for (unsigned i = 0; i < m_jitCode->osrExit.size(); ++i) { OSRExit& exit = m_jitCode->osrExit[i]; OSRExitCompilationInfo& info = m_exitCompilationInfo[i]; JumpList& failureJumps = info.m_failureJumps; if (!failureJumps.empty()) failureJumps.link(this); else info.m_replacementDestination = label(); jitAssertHasValidCallFrame(); store32(TrustedImm32(i), &vm()->osrExitIndex); exit.setPatchableCodeOffset(patchableJump()); } }
AssemblyHelpers::Jump AssemblyHelpers::emitExceptionCheck(ExceptionCheckKind kind, ExceptionJumpWidth width) { callExceptionFuzz(); if (width == FarJumpWidth) kind = (kind == NormalExceptionCheck ? InvertedExceptionCheck : NormalExceptionCheck); Jump result; #if USE(JSVALUE64) result = branchTest64(kind == NormalExceptionCheck ? NonZero : Zero, AbsoluteAddress(vm()->addressOfException())); #elif USE(JSVALUE32_64) result = branch32(kind == NormalExceptionCheck ? NotEqual : Equal, AbsoluteAddress(vm()->addressOfException()), TrustedImm32(0)); #endif if (width == NormalJumpWidth) return result; PatchableJump realJump = patchableJump(); result.link(this); return realJump.m_jump; }