DVFuncletsVec Func::getDVFunclets() const { DVFuncletsVec dvs; int nParams = numParams(); for (int i = 0; i < nParams; ++i) { const ParamInfo& pi = params()[i]; if (pi.hasDefaultValue()) { dvs.push_back(std::make_pair(i, pi.funcletOff)); } } return dvs; }
TCA emitCallArrayPrologue(Func* func, DVFuncletsVec& dvs) { auto& mainCode = mcg->code.main(); auto& stubsCode = mcg->code.stubs(); Asm a { mainCode }; TCA start = mainCode.frontier(); if (dvs.size() == 1) { a. cmpl (dvs[0].first, rVmFp[AROFF(m_numArgsAndGenCtorFlags)]); emitBindJcc(mainCode, stubsCode, CC_LE, SrcKey(func, dvs[0].second, false)); emitBindJmp(mainCode, stubsCode, SrcKey(func, func->base(), false)); } else { a. loadl (rVmFp[AROFF(m_numArgsAndGenCtorFlags)], reg::eax); for (unsigned i = 0; i < dvs.size(); i++) { a. cmpl (dvs[i].first, reg::eax); emitBindJcc(mainCode, stubsCode, CC_LE, SrcKey(func, dvs[i].second, false)); } emitBindJmp(mainCode, stubsCode, SrcKey(func, func->base(), false)); } return start; }
TCA emitCallArrayPrologue(Func* func, DVFuncletsVec& dvs) { auto& mainCode = mcg->code.main(); auto& frozenCode = mcg->code.frozen(); vixl::MacroAssembler a { mainCode }; vixl::MacroAssembler afrozen { frozenCode }; TCA start = mainCode.frontier(); a. Ldr (rAsm.W(), rVmFp[AROFF(m_numArgsAndFlags)]); for (auto i = 0; i < dvs.size(); ++i) { a. Cmp (rAsm.W(), dvs[i].first); emitBindJ(mainCode, frozenCode, CC_LE, SrcKey(func, dvs[i].second, false)); } emitBindJ(mainCode, frozenCode, CC_None, SrcKey(func, func->base(), false)); mcg->cgFixups().process(nullptr); return start; }