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); } }
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()); } }
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); }
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)); }
public override void EnterTypeSpecifier([NotNull] CParser.TypeSpecifierContext context) { base.EnterTypeSpecifier(context); typeList.Add(context.GetText()); }