public override void AddDeclarationToBlock(BlockContext context) { var fdef = this; var block = context.Block; if (context.MakeCType(fdef.Specifiers, fdef.Declarator, null, block) is CFunctionType ftype) { var name = fdef.Declarator.DeclaredIdentifier; var f = new CompiledFunction(name, ftype, fdef.Body); block.Functions.Add(f); } }
public override void AddDeclarationToBlock(BlockContext context) { var multi = this; var block = context.Block; if (multi.InitDeclarators != null) { foreach (var idecl in multi.InitDeclarators) { if ((multi.Specifiers.StorageClassSpecifier & StorageClassSpecifier.Typedef) != 0) { var name = idecl.Declarator.DeclaredIdentifier; var ttype = context.MakeCType(multi.Specifiers, idecl.Declarator, idecl.Initializer, block); block.Typedefs[name] = ttype; } else { CType ctype = context.MakeCType(multi.Specifiers, idecl.Declarator, idecl.Initializer, block); var name = idecl.Declarator.DeclaredIdentifier; if (ctype is CFunctionType ftype && !HasStronglyBoundPointer(idecl.Declarator)) { var nameContext = (idecl.Declarator.InnerDeclarator is IdentifierDeclarator ndecl && ndecl.Context.Count > 0) ? string.Join("::", ndecl.Context) : ""; var f = new CompiledFunction(name, nameContext, ftype); block.Functions.Add(f); } else { if ((ctype is CArrayType atype) && (atype.Length == null) && (idecl.Initializer != null)) { if (idecl.Initializer is StructuredInitializer structInit) { var len = 0; foreach (var i in structInit.Initializers) { if (i.Designation == null) { len++; } else { foreach (var de in i.Designation.Designators) { // TODO: Pay attention to designators len++; } } } atype = new CArrayType(atype.ElementType, len); } else { //Report.Error(); } } //var init = GetInitExpression(idecl.Initializer); block.AddVariable(name, ctype ?? CBasicType.SignedInt); } if (idecl.Initializer != null) { var varExpr = new VariableExpression(name, Location.Null, Location.Null); var initExpr = GetInitializerExpression(idecl.Initializer); block.InitStatements.Add(new ExpressionStatement(new AssignExpression(varExpr, initExpr))); } }