Exemple #1
0
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;
}
Exemple #3
0
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;
}