示例#1
0
        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);
        }
示例#2
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
             });
         }
     }
 }
示例#3
0
 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,
         });
     }
 }
示例#4
0
        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;
                }
            }
        }