Exemplo n.º 1
0
        protected void EmitFunction(
            CParser.TypeSpecifierContext typeSpecifier,
            ITerminalNode identifier,
            CParser.ParameterTypeListContext parameters,
            CParser.CompoundStatementContext compoundStatement)
        {
            var functionName = identifier.ToString();

            //CurrentArgs_ = Functions_[CurrentTypeBuilder_.Name][functionName].Args;
            _generatorIL = _functions[functionName].MethodBuilder.GetILGenerator();

            LocalObjectDef.InitGenerator(_generatorIL);

            if (compoundStatement.blockItemList() != null)
            {
                var returnObjectDef = EmitCompoundStatement(compoundStatement);

                returnObjectDef.Load();

                if (_functions[functionName].MethodBuilder.ReturnType == typeof(void))
                {
                    _generatorIL.Emit(OpCodes.Pop);
                }

                _generatorIL.Emit(OpCodes.Ret);

                returnObjectDef.Remove();
            }
            else
            {
                _generatorIL.Emit(OpCodes.Ret);
            }
        }
Exemplo n.º 2
0
        protected ObjectDef EmitCompoundStatement(CParser.CompoundStatementContext compoundStatement)
        {
            ObjectDef returnObjectDef = null;

            var blockItemStack = compoundStatement.blockItemList().RBABlockItemStack();

            while (blockItemStack.Count > 0)
            {
                returnObjectDef = EmitBlockItem(blockItemStack.Pop());
            }

            return(returnObjectDef);
        }
Exemplo n.º 3
0
 public override void ExitCompoundStatement(CParser.CompoundStatementContext context)
 {
     //'{' blockItemList? '}'
     SafeCall(context, () => CStatment.EndCompoundStatement(GetBlockItemTypes(context.blockItemList())));
 }
Exemplo n.º 4
0
 public override void EnterCompoundStatement(CParser.CompoundStatementContext context)
 {
     SafeCall(context, CStatment.BeginCompoundStatement);
 }