public int VisitDeclaration(Decl decl) { var fndec = decl as FunctionDecl; if (fndec != null) { return(0); } IEnumerable <DeclSpec> declspecs = decl.decl_specs; var isTypedef = false; var scspec = decl.decl_specs[0] as StorageClassSpec; if (scspec != null && scspec.Type == CTokenType.Typedef) { declspecs = decl.decl_specs.Skip(1); isTypedef = true; } var ntde = new NamedDataTypeExtractor(declspecs, this); foreach (var declarator in decl.init_declarator_list) { var nt = ntde.GetNameAndType(declarator.Declarator); var serType = nt.DataType; var sSig = nt.DataType as SerializedSignature; if (sSig != null) { procs.Add(new Procedure_v1 { Name = nt.Name, Signature = sSig, }); } if (isTypedef) { //$REVIEW: should make sure that if the typedef already exists, // then the types match but a real compiler would have validated that. parserState.Typedefs.Add(nt.Name); var typedef = new SerializedTypedef { Name = nt.Name, DataType = serType }; Types.Add(typedef); //$REVIEW: do we really need to check for consistence? NamedTypes[typedef.Name] = serType; } } return(0); }
private IEnumerable <SerializedUnionAlternative> ExpandUnionFields(IEnumerable <StructDecl> decls) { foreach (var decl in decls) { var ndte = new NamedDataTypeExtractor(decl.SpecQualifierList, converter); foreach (var declarator in decl.FieldDeclarators) { var nt = ndte.GetNameAndType(declarator); yield return(new SerializedUnionAlternative { Name = nt.Name, Type = nt.DataType }); } } }
private Argument_v1 ConvertParameter(ParamDecl decl) { if (decl.IsEllipsis) { return(new Argument_v1 { Kind = new StackVariable_v1 { }, Name = "...", }); } else { var ntde = new NamedDataTypeExtractor(decl.DeclSpecs, converter); var nt = ConvertArrayToPointer(ntde.GetNameAndType(decl.Declarator)); return(new Argument_v1 { Name = nt.Name, Type = nt.DataType, }); } }
private IEnumerable <StructField_v1> ExpandStructFields(IEnumerable <StructDecl> decls) { int offset = 0; foreach (var decl in decls) { var ntde = new NamedDataTypeExtractor(decl.SpecQualifierList, converter); foreach (var declarator in decl.FieldDeclarators) { var nt = ntde.GetNameAndType(declarator); var rawSize = nt.DataType.Accept(converter.Sizer); offset = Align(offset, rawSize, 8); //$BUG: disregards temp. alignment changes. (__declspec(align)) yield return(new StructField_v1 { Offset = offset, Name = nt.Name, Type = nt.DataType, }); offset += rawSize; } } }