public void CGFuncDefExp(FuncInfo funcInfo, FuncdefExpNode node, int a) { FuncInfo newFuncInfo = new FuncInfo(); newFuncInfo.NParam = node.ParList.Count; funcInfo.ChildFunc.Add(newFuncInfo); foreach (var param in node.ParList) { newFuncInfo.AddLocalVar(param.name); } CGBlock(newFuncInfo, node.Block); newFuncInfo.ExitScope(); newFuncInfo.EmitReturn(0, 0); int bx = funcInfo.ChildFunc.Count - 1; funcInfo.EmitClosure(a, bx); }
private void CGReturnStat(FuncInfo funcInfo, List <ExpNode> returneExps) { if (returneExps == null) { funcInfo.EmitReturn(0, 0); return; } bool muleRet = IsVarargOrFuncCall(returneExps.Last()); foreach (var exp in returneExps) { int r = funcInfo.AllocReg(); if (r == returneExps.Count - 1 && muleRet) { CGExp(funcInfo, exp, r, -1); } else { CGExp(funcInfo, exp, r, 1); } } funcInfo.FreeRegs(returneExps.Count); }