Changes in / [3873b5a1:f3c1737]
- Files:
-
- 5 edited
-
doc/proposals/tagged-struct.txt (modified) (2 diffs)
-
src/GenPoly/InstantiateGeneric.cc (modified) (1 diff)
-
src/InitTweak/GenInit.cc (modified) (2 diffs)
-
src/Parser/parser.yy (modified) (1 diff)
-
src/ResolvExpr/CurrentObject.cc (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
doc/proposals/tagged-struct.txt
r3873b5a1 rf3c1737 71 71 should be possible to do during linking. 72 72 73 If a generic/polymorphic type is tagged its tagged would then be shared74 between all applications of that generic. Internal tags could be used to75 seperate these structures again, however it seems in most cases simply using76 the existing type parameters should provide the needed information.77 78 73 79 74 Traits: … … 107 102 To allow for growth each option would have to be a structure itself. 108 103 109 Which brings us to "tagge dstruct union", ie. a union of tagged structures104 Which brings us to "tagget struct union", ie. a union of tagged structures 110 105 as opposed to tagging the union itself. This extention acts as a constraint. 111 106 If 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. 107 possible values of the union must be of that tagged type or a child type. 119 108 120 109 121 Type Objects Fields (Extention):110 Custom Type Objects (Extention): 122 111 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. 112 Some method to define type objects used within a tree of types. One option is 113 to allow the tree's type object to be specified by the tree root. It would 114 then have to be filled in for each type in the tree, including the root. 127 115 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. 116 The only required field is the parent field, a pointer to the type object's 117 type. (This is also the only required field on the tagged structure itself.) 131 118 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); 119 A further extention could allow expanding type objects, so child types could 120 append fields to their parent's feild list. They might need their own type 121 objects at that point, or maybe static checks will be enough to see the 122 minimum field list. -
src/GenPoly/InstantiateGeneric.cc
r3873b5a1 rf3c1737 171 171 Type* postmutate( UnionInstType *inst ); 172 172 173 void premutate( __attribute__((unused))FunctionType * ftype ) {173 void premutate( FunctionType * ftype ) { 174 174 GuardValue( inFunctionType ); 175 175 inFunctionType = true; -
src/InitTweak/GenInit.cc
r3873b5a1 rf3c1737 71 71 // that need to be constructed or destructed 72 72 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; } 79 80 80 81 void previsit( CompoundStmt * compoundStmt ); … … 335 336 } 336 337 337 void CtorDtor::previsit( __attribute__((unused))CompoundStmt * compoundStmt ) {338 void CtorDtor::previsit( CompoundStmt * compoundStmt ) { 338 339 GuardScope( managedTypes ); 339 340 } -
src/Parser/parser.yy
r3873b5a1 rf3c1737 2332 2332 | TYPEGENname 2333 2333 | CONST 2334 { $$ = Token{ new string( "__const__" ) , { nullptr, -1 }}; }2334 { $$ = Token{ new string( "__const__" ) }; } 2335 2335 ; 2336 2336 -
src/ResolvExpr/CurrentObject.cc
r3873b5a1 rf3c1737 127 127 } 128 128 129 virtual void print( std::ostream & out, __attribute__((unused))Indenter indent ) const {129 virtual void print( std::ostream & out, Indenter indent ) const { 130 130 out << "SimpleIterator(" << type << ")"; 131 131 }
Note:
See TracChangeset
for help on using the changeset viewer.