Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }