/// <summary> /// <list type="number"> /// <item>Set output type of PrologueI.</item> /// <item>Load parameters</item> /// </list> /// </summary> void Builder::SetUpMethodBody(Function& fun, MethodDef& method_def) { auto const pPrologueI = fun.GetStartBB()->GetFirstI(); auto const pRefI = pPrologueI->GetNext(); auto const pBB = pPrologueI->GetBBlock(); auto& v1 = *pPrologueI->GetVd(); ValuesTypeBuilder tybuilder( method_def.IsStatic() ? method_def.CountParams() : method_def.CountParams() + 1); auto nth = 0; // "this" parameter. if (!method_def.IsStatic()) { tybuilder.Append(method_def.owner_class_def().GetClass()); nth++; } foreach (MethodDef::EnumParam, oEnum, method_def) { auto const pParamDef = oEnum.Get(); auto& var = pParamDef->GetVariable(); auto& varty = var.GetTy(); tybuilder.Append(varty); DEBUG_FORMAT("%s %s", varty, var); auto& cell_class = Ty_ClosedCell->Construct(varty); //auto& r2 = *NewOutput(varty).StaticCast<Register>(); auto& r2 = *NewOutput(varty).StaticCast<Register>(); r2.SetVariable(var); auto const pSelectI = new(zone()) SelectI(varty, r2, v1, nth); pSelectI->SetSourceInfo(pParamDef->GetSourceInfo()); pBB->InsertBeforeI(*pSelectI, pRefI); auto& r3 = NewRegister(); auto& vardef_inst = *new(zone()) VarDefI(cell_class, r3, var, r2); vardef_inst.set_source_info(pParamDef->source_info()); pBB->InsertBeforeI(vardef_inst, pRefI); ++nth; }