Changes in / [3873b5a1:f3c1737]


Ignore:
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • doc/proposals/tagged-struct.txt

    r3873b5a1 rf3c1737  
    7171should be possible to do during linking.
    7272
    73 If a generic/polymorphic type is tagged its tagged would then be shared
    74 between all applications of that generic. Internal tags could be used to
    75 seperate these structures again, however it seems in most cases simply using
    76 the existing type parameters should provide the needed information.
    77 
    7873
    7974Traits:
     
    107102To allow for growth each option would have to be a structure itself.
    108103
    109 Which brings us to "tagged struct union", ie. a union of tagged structures
     104Which brings us to "tagget struct union", ie. a union of tagged structures
    110105as opposed to tagging the union itself. This extention acts as a constraint.
    111106If unions are declared tagged instead of creating a new tagged type, all
    112 possible values of the union must be of that tagged type or a child type. If
    113 the tagged type is omitted then they must all be tagged but of any tagged
    114 type.
    115 
    116 As a short cut union_instance->type might get the type object of the loaded
    117 value. It should always be the same operation regardless so it saves
    118 abritarly picking a branch of the union to get the type object.
     107possible values of the union must be of that tagged type or a child type.
    119108
    120109
    121 Type Objects Fields (Extention):
     110Custom Type Objects (Extention):
    122111
    123 Adding fields to the type object allows data to be shared between instances
    124 of the same type. Such behaviour could be mimiced by creating a lookup
    125 function on the type object pointer, but this may be cleaner and more
    126 efficient.
     112Some method to define type objects used within a tree of types. One option is
     113to allow the tree's type object to be specified by the tree root. It would
     114then have to be filled in for each type in the tree, including the root.
    127115
    128 The type object fields follow similar rules to the fields on the tagged
    129 objects themselves, they must be additive. So any fields present on a
    130 type object will be present (and in the same place) on all of its children.
     116The only required field is the parent field, a pointer to the type object's
     117type. (This is also the only required field on the tagged structure itself.)
    131118
    132 This does mean that many type object structure types will have to be auto
    133 generated, and traversing up the tree might get a little wierd. That could
    134 be symplified by only allowing the root type to specify fields on the type
    135 object, so that the type object is consistant throughout that particular tree.
    136 And hence the type_object pointers would also be consistant as the type they
    137 point to would never change.
    138 
    139 struct Example tagged {
    140         tagged char const * const type_name = "Example";
    141         int data;
    142 };
    143 
    144 Creates a tagged structure that has no parent, stores an integer and the type
    145 object also has an extra field that stores a string on the type object.
    146 This can be accessed by using member access on the type object, as a regular
    147 structure.
    148 
    149 Type object fields will have to allow initialization on their declaration,
    150 and declarations of children as well, as they are not assotiated with the
    151 later instances of the tagged structure.
    152 
    153         ...
    154         tagged void (*dtor)(tagged Example * this);
    155         ...
    156 
    157 Sub-Extention, not sure how it would work but some way to have a "dynamic"
    158 field that is considered the type of the current tagged struct might be useful
    159 for things like specifying a deconstructor. In this case, the following code
    160 will clean up any child type of Example:
    161 
    162 Example * ex = get_some_example();
    163 ex->type->dtor(ex);
     119A further extention could allow expanding type objects, so child types could
     120append fields to their parent's feild list. They might need their own type
     121objects at that point, or maybe static checks will be enough to see the
     122minimum field list.
  • src/GenPoly/InstantiateGeneric.cc

    r3873b5a1 rf3c1737  
    171171                Type* postmutate( UnionInstType *inst );
    172172
    173                 void premutate( __attribute__((unused)) FunctionType * ftype ) {
     173                void premutate( FunctionType * ftype ) {
    174174                        GuardValue( inFunctionType );
    175175                        inFunctionType = true;
  • src/InitTweak/GenInit.cc

    r3873b5a1 rf3c1737  
    7171                // that need to be constructed or destructed
    7272                void previsit( StructDecl *aggregateDecl );
    73                 void previsit( __attribute__((unused)) UnionDecl    * aggregateDecl ) { visit_children = false; }
    74                 void previsit( __attribute__((unused)) EnumDecl     * aggregateDecl ) { visit_children = false; }
    75                 void previsit( __attribute__((unused)) TraitDecl    * aggregateDecl ) { visit_children = false; }
    76                 void previsit( __attribute__((unused)) TypeDecl     * typeDecl )      { visit_children = false; }
    77                 void previsit( __attribute__((unused)) TypedefDecl  * typeDecl )      { visit_children = false; }
    78                 void previsit( __attribute__((unused)) FunctionType * funcType )      { visit_children = false; }
     73                void previsit( UnionDecl *aggregateDecl ) { visit_children = false; }
     74                void previsit( EnumDecl *aggregateDecl ) { visit_children = false; }
     75                void previsit( TraitDecl *aggregateDecl ) { visit_children = false; }
     76                void previsit( TypeDecl *typeDecl ) { visit_children = false; }
     77                void previsit( TypedefDecl *typeDecl ) { visit_children = false; }
     78
     79                void previsit( FunctionType *funcType ) { visit_children = false; }
    7980
    8081                void previsit( CompoundStmt * compoundStmt );
     
    335336        }
    336337
    337         void CtorDtor::previsit( __attribute__((unused)) CompoundStmt * compoundStmt ) {
     338        void CtorDtor::previsit( CompoundStmt * compoundStmt ) {
    338339                GuardScope( managedTypes );
    339340        }
  • src/Parser/parser.yy

    r3873b5a1 rf3c1737  
    23322332        | TYPEGENname
    23332333        | CONST
    2334                 { $$ = Token{ new string( "__const__" ), { nullptr, -1 } }; }
     2334                { $$ = Token{ new string( "__const__" ) }; }
    23352335        ;
    23362336
  • src/ResolvExpr/CurrentObject.cc

    r3873b5a1 rf3c1737  
    127127                }
    128128
    129                 virtual void print( std::ostream & out, __attribute__((unused)) Indenter indent ) const {
     129                virtual void print( std::ostream & out, Indenter indent ) const {
    130130                        out << "SimpleIterator(" << type << ")";
    131131                }
Note: See TracChangeset for help on using the changeset viewer.