dmd.aggregate

Defines a Dsymbol representing an aggregate, which is a struct, union or class.

Specification: Structs, Unions, Class.

Authors

Walter Bright

Source: aggregate.d

  • Declaration

    enum ClassKind: ubyte;

    The ClassKind enum is used in AggregateDeclaration AST nodes to specify the linkage type of the struct/class/interface or if it is an anonymous class. If the class is anonymous it is also considered to be a D class.

    • d

      Declaration

      d

      the aggregate is a d(efault) class

    • cpp

      Declaration

      cpp

      the aggregate is a C++ struct/class/interface

    • Declaration

      objc

      the aggregate is an Objective-C class/interface

    • c

      Declaration

      c

      the aggregate is a C struct

  • Declaration

    @safe const(char)* toChars(ClassKind c);

    Give a nice string for a class kind for error messages

    Parameters

    ClassKind c

    class kind

    Return Value

    0-terminated string for c

  • Declaration

    struct MangleOverride;

    If an aggregate has a pargma(mangle, ...) this holds the information to mangle.

  • Declaration

    abstract class AggregateDeclaration: dmd.dsymbol.ScopeDsymbol;

    Abstract aggregate as a common ancestor for Class- and StructDeclaration.

    • Declaration

      Type type;

    • Declaration

      StorageClass storage_class;

    • Declaration

      uint structsize;

      size of struct

    • Declaration

      uint alignsize;

      size of struct for alignment purposes

    • Declaration

      VarDeclarations fields;

      VarDeclaration fields

    • Declaration

      Dsymbol deferred;

      any deferred semantic2() or semantic3() symbol

    • Declaration

      ClassKind classKind;

      specifies whether this is a D, C++, Objective-C or anonymous struct/class/interface

    • Declaration

      CPPMANGLE cppmangle;

      Specify whether to mangle the aggregate as a class or a struct This information is used by the MSVC mangler Only valid for class and struct. TODO: Merge with ClassKind ?

    • Declaration

      MangleOverride* pMangleOverride;

      overridden symbol with pragma(mangle, "...") if not null

    • Declaration

      Dsymbol enclosing;

      !=null if is nested pointing to the dsymbol that directly enclosing it.

      1. The function that enclosing it (nested struct and class)
      2. The class that enclosing it (nested class only)
      3. If enclosing aggregate is template, its enclosing dsymbol.

      Discussion

      See AggregateDeclaraton::makeNested for the details.

    • Declaration

      VarDeclaration vthis;

      'this' parameter if this aggregate is nested

    • Declaration

      VarDeclaration vthis2;

      'this' parameter if this aggregate is a template and is nested

    • Declaration

      FuncDeclarations invs;

      Array of invariants

    • inv

      Declaration

      FuncDeclaration inv;

      Merged invariant calling all members of invs

    • Declaration

      Dsymbol ctor;

      CtorDeclaration or TemplateDeclaration

    • Declaration

      CtorDeclaration defaultCtor;

      default constructor - should have no arguments, because it would be stored in TypeInfo_Class.defaultConstructor

    • Declaration

      AliasThis aliasthis;

      forward unresolved lookups to aliasthis

    • Declaration

      DtorDeclarations userDtors;

      user-defined destructors (~this()) - mixins can yield multiple ones

    • Declaration

      DtorDeclaration aggrDtor;

      aggregate destructor calling userDtors and fieldDtor (and base class aggregate dtor for C++ classes)

    • Declaration

      DtorDeclaration dtor;

      the aggregate destructor exposed as __xdtor alias

    • Declaration

      DtorDeclaration tidtor;

      (same as aggrDtor, except for C++ classes with virtual dtor on Windows)

      Discussion

      aggregate destructor used in TypeInfo (must have extern(D) ABI)

    • Declaration

      DtorDeclaration fieldDtor;

      function destructing (non-inherited) fields

    • Declaration

      Expression getRTInfo;

      pointer to GC info generated by object.RTInfo(this)

    • Declaration

      Visibility visibility;

    • Declaration

      bool noDefaultCtor;

      no default construction

    • Declaration

      bool disableNew;

      disallow allocations using new

    • Declaration

      Sizeok sizeok;

      set when structsize contains valid data

    • Declaration

      Scope* newScope(Scope* sc);

      Create a new scope from sc. semantic, semantic2 and semantic3 will use this for aggregate members.

    • Declaration

      final size_t nonHiddenFields();

      Return Value

      The total number of fields minus the number of hidden fields.

    • Declaration

      final bool determineSize(const ref Loc loc);

      Collect all instance fields, then determine instance size.

      Return Value

      false if failed to determine the size.

    • Declaration

      final bool checkOverlappedFields();

      Calculate field[i].overlapped and overlapUnsafe, and check that all of explicit field initializers have unique memory space on instance.

      Return Value

      true if any errors happen.

    • Declaration

      final bool fill(const ref Loc loc, ref Expressions elements, bool ctorinit);

      Fill out remainder of elements[] with default initializers for fields[].

      Parameters

      Loc loc

      location

      Expressions elements

      explicit arguments which given to construct object.

      bool ctorinit

      true if the elements will be used for default initialization.

      Return Value

      false if any errors occur. Otherwise, returns true and the missing arguments will be pushed in elements[].

    • Declaration

      final void setDeprecated();

      Flag this aggregate as deprecated

    • Declaration

      final const bool isNested();

      Returns true if there's an extra member which is the 'this' pointer to the enclosing context (enclosing aggregate or function)

    • Declaration

      final Dsymbol searchCtor();

      Look for constructor declaration.

    • Declaration

      void* sinit;

      initializer symbol

  • Declaration

    int apply(Dsymbol symbol, int function(Dsymbol, void*) fp, void* ctx);

    Iterate this dsymbol or members of this scoped dsymbol, then call fp with the found symbol and params.

    Parameters

    Dsymbol symbol

    the dsymbol or parent of members to call fp on

    int function(Dsymbol, void*) fp

    function pointer to process the iterated symbol. If it returns nonzero, the iteration will be aborted.

    void* ctx

    context parameter passed to fp.

    Return Value

    nonzero if the iteration is aborted by the return value of fp, or 0 if it's completed.

  • Declaration

    pure nothrow @safe uint alignmember(structalign_t alignment, uint memalignsize, uint offset);

    Do byte or word alignment as necessary. Align sizes of 0, as we may not know array sizes yet.

    Parameters

    structalign_t alignment

    struct alignment that is in effect

    uint memalignsize

    natural alignment of field

    uint offset

    offset to be aligned

    Return Value

    aligned offset

  • Declaration

    pure nothrow @safe uint placeField(ref uint nextoffset, uint memsize, uint memalignsize, structalign_t alignment, ref uint aggsize, ref uint aggalignsize, bool isunion);

    Place a field (mem) into an aggregate (agg), which can be a struct, union or class

    Parameters

    uint nextoffset

    location just past the end of the previous field in the aggregate. Updated to be just past the end of this field to be placed, i.e. the future nextoffset

    uint memsize

    size of field

    uint memalignsize

    natural alignment of field

    structalign_t alignment

    alignment in effect for this field

    uint aggsize

    size of aggregate (updated)

    uint aggalignsize

    alignment of aggregate (updated)

    bool isunion

    the aggregate is a union

    Return Value

    aligned offset to place field at