static void dispatch(CCallHelpers& jit, FTL::State* state, const B3::StackmapGenerationParams& params, DFG::Node* node, Box<CCallHelpers::JumpList> exceptions, CCallHelpers::JumpList from, OperationType operation, ResultType result, Arguments arguments, std::index_sequence<ArgumentsIndex...>) { CCallHelpers::Label done = jit.label(); params.addLatePath([=] (CCallHelpers& jit) { AllowMacroScratchRegisterUsage allowScratch(jit); from.link(&jit); callOperation( *state, params.unavailableRegisters(), jit, node->origin.semantic, exceptions.get(), operation, extractResult(result), std::get<ArgumentsIndex>(arguments)...); jit.jump().linkTo(done, &jit); }); }
void PatchpointExceptionHandle::scheduleExitCreationForUnwind( const B3::StackmapGenerationParams& params, CallSiteIndex callSiteIndex) { if (!m_descriptor) return; RefPtr<OSRExitHandle> handle = createHandle(GenericUnwind, params); handle->exit.m_exceptionHandlerCallSiteIndex = callSiteIndex; HandlerInfo handler = m_handler; params.addLatePath( [handle, handler, callSiteIndex] (CCallHelpers& jit) { CodeBlock* codeBlock = jit.codeBlock(); jit.addLinkTask( [=] (LinkBuffer& linkBuffer) { HandlerInfo newHandler = handler; newHandler.start = callSiteIndex.bits(); newHandler.end = callSiteIndex.bits() + 1; newHandler.nativeCode = linkBuffer.locationOf(handle->label); codeBlock->appendExceptionHandler(newHandler); }); }); }