예제 #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);
            }
        }
예제 #2
0
        public override void ExitTypeSpecifier(CParser.TypeSpecifierContext context)
        {
            //atomicTypeSpecifier
            if (context.atomicTypeSpecifier() != null)
            {
                SematicError(context, "atomic types not supported");
            }
            //structOrUnionSpecifier
            else if (context.structOrUnionSpecifier() != null)
            {
                if (context.structOrUnionSpecifier().structOrUnion().GetText() == "union")
                {
                    SematicError(context, "unions not supported");
                }
                else if (context.structOrUnionSpecifier().structDeclarationList() != null)
                {
                    string idstring = context.structOrUnionSpecifier().Identifier() != null?context.structOrUnionSpecifier().Identifier().GetText() : null;

                    CDeclaration.EndStructDefinition(idstring);
                }
                else
                {
                    CDeclaration.PushStructDeclaration(context.structOrUnionSpecifier().Identifier().GetText());
                }
            }
            //enumSpecifier
            else if (context.enumSpecifier() != null)
            {
                if (context.enumSpecifier().enumeratorList() != null)
                {
                    string idString = context.enumSpecifier().Identifier() != null?context.enumSpecifier().Identifier().GetText() : null;

                    CDeclaration.EnumDefinition(idString, GetEnumeratorListCount(context.enumSpecifier().enumeratorList()));
                }
                else
                {
                    CDeclaration.PushEnumDeclaration(context.enumSpecifier().Identifier().GetText());
                }
            }
            //'__typeof__' '(' constantExpression ')' --- GCC extension not supported
            else if (context.constantExpression() != null)
            {
                SematicError(context, "gcc typeof not supported");
            }
            //else, a fundamental type
            else if (context.typedefName() != null)
            {
                CDeclaration.PushTypeDefName(context.GetText());
            }
            else
            {
                CDeclaration.PushTypeSpecifier(context.GetText());
            }
        }
예제 #3
0
 public override void EnterTypeSpecifier(CParser.TypeSpecifierContext context)
 {
     //beginstructdef
     if (context.structOrUnionSpecifier() != null)
     {
         if (context.structOrUnionSpecifier().structDeclarationList() != null)
         {
             CDeclaration.BeginStructDefinition();
         }
     }
 }
        public static Type RBAType(
            this CParser.TypeSpecifierContext typeSpecifier, ModuleBuilder moduleBuilder)
        {
            Type result;

            if (typeSpecifier.Void() != null)
            {
                result = typeof(void);
            }
            else if (typeSpecifier.Char() != null)
            {
                result = typeof(char);
            }
            else if (typeSpecifier.Short() != null)
            {
                result = typeof(short);
            }
            else if (typeSpecifier.Int() != null)
            {
                result = typeof(int);
            }
            else if (typeSpecifier.Float() != null)
            {
                result = typeof(float);
            }
            else if (typeSpecifier.Double() != null)
            {
                result = typeof(double);
            }
            else if (typeSpecifier.Bool() != null)
            {
                result = typeof(bool);
            }
            else if (typeSpecifier.enumSpecifier() != null)
            {
                result = moduleBuilder.GetType(typeSpecifier.enumSpecifier().ToString());
            }
            else if (typeSpecifier.structOrUnionSpecifier()?.structOrUnion()?.Struct() != null)
            {
                result = moduleBuilder.GetType(typeSpecifier
                                               .structOrUnionSpecifier()
                                               .structOrUnion()
                                               .Struct()
                                               .ToString());
            }
            else
            {
                result = null;
            }

            return(result);
        }
예제 #5
0
        protected void DefineFunction(
            CParser.TypeSpecifierContext typeSpecifier,
            ITerminalNode identifier,
            CParser.ParameterTypeListContext parameters)
        {
            Type[] inputTypes = Type.EmptyTypes;

            var functionName       = identifier.ToString();
            var functionReturnType = typeSpecifier.RBAType(_moduleBuilder);
            var args = new Dictionary <string, MethodArgDef>
            {
                { "this", new MethodArgDef(_programClass, 0, "this") }
            };

            if (parameters != null)
            {
                //var parametersStack
                //= new Stack<CParser.ExternalDeclarationContext>();

                //parameters.
                //var functionListNode = treeNode.GetChild(3);
                //inputTypes = new Type[functionListNode.ChildCount];
                //for (int k = 0; k < functionListNode.ChildCount; k++)
                //{
                //    inputTypes[k] = GetType(functionListNode.GetChild(k).GetChild(1).Text);
                //    var argName = functionListNode.GetChild(k).GetChild(0).Text;
                //    args.Add(argName, new ArgObjectDef(inputTypes[k], k + 1, argName));
                //}
            }
            else
            {
                inputTypes = Type.EmptyTypes;
            }

            MethodBuilder methodBuilder;

            if (functionName == "main")
            {
                methodBuilder = _programClass.DefineMethod(functionName,
                                                           MethodAttributes.Private | MethodAttributes.Static | MethodAttributes.HideBySig, typeof(void), Type.EmptyTypes);
                methodBuilder.SetCustomAttribute(new CustomAttributeBuilder(
                                                     typeof(STAThreadAttribute).GetConstructor(Type.EmptyTypes), new object[] { }));
                _assemblyBuilder.SetEntryPoint(methodBuilder);
                _entryPoint = methodBuilder;
            }
            else
            {
                methodBuilder = _programClass.DefineMethod(functionName, MethodAttributes.Public | MethodAttributes.HideBySig, functionReturnType, inputTypes);
            }

            _functions.Add(functionName, new MethodDef(functionName, args, methodBuilder));
        }
예제 #6
0
 public override void EnterTypeSpecifier([NotNull] CParser.TypeSpecifierContext context)
 {
     base.EnterTypeSpecifier(context);
     typeList.Add(context.GetText());
 }