private int PrepFuncCall(FuncInfo funcInfo, FuncCallExpNode node, int a) { int nArgs = node.Args.Count; bool lastVarIsVarargOrFuncCall = false; CGExp(funcInfo, node.PreExp, a, 1); if (node.NameExp.ExpType != ConstExpNode.ConstExpType.NilExp) { int c = 0x100 + funcInfo.IndexOfConstVar(node.NameExp.name); funcInfo.EmitSelf(a, a, c); } int i = 0; foreach (var arg in node.Args) { int r = funcInfo.AllocReg(); if (i == nArgs - 1 && IsVarargOrFuncCall(arg)) { lastVarIsVarargOrFuncCall = true; CGExp(funcInfo, arg, r, -1); } else { CGExp(funcInfo, arg, r, 1); } i++; } funcInfo.FreeRegs(nArgs); if (node.NameExp.ExpType != ConstExpNode.ConstExpType.NilExp) { nArgs++; } if (lastVarIsVarargOrFuncCall) { nArgs--; } return(nArgs); }