Mercurial > projects > ddmd
comparison dmd/InterfaceDeclaration.d @ 125:767a01c2a272
BaseClasses -> Vector
author | Eldar Insafutdinov <e.insafutdinov@gmail.com> |
---|---|
date | Fri, 03 Sep 2010 22:17:54 +0100 |
parents | 9e39c7de8438 |
children | 60bb0fe4563e |
comparison
equal
deleted
inserted
replaced
124:731ab26f07bf | 125:767a01c2a272 |
---|---|
102 } | 102 } |
103 | 103 |
104 // Expand any tuples in baseclasses[] | 104 // Expand any tuples in baseclasses[] |
105 for (size_t i = 0; i < baseclasses.dim; ) | 105 for (size_t i = 0; i < baseclasses.dim; ) |
106 { | 106 { |
107 BaseClass b = cast(BaseClass)baseclasses.data[0]; | 107 auto b = baseclasses[0]; |
108 b.type = b.type.semantic(loc, sc); | 108 b.type = b.type.semantic(loc, sc); |
109 Type tb = b.type.toBasetype(); | 109 Type tb = b.type.toBasetype(); |
110 | 110 |
111 if (tb.ty == TY.Ttuple) | 111 if (tb.ty == TY.Ttuple) |
112 { TypeTuple tup = cast(TypeTuple)tb; | 112 { TypeTuple tup = cast(TypeTuple)tb; |
114 baseclasses.remove(i); | 114 baseclasses.remove(i); |
115 size_t dim = Argument.dim(tup.arguments); | 115 size_t dim = Argument.dim(tup.arguments); |
116 for (size_t j = 0; j < dim; j++) | 116 for (size_t j = 0; j < dim; j++) |
117 { Argument arg = Argument.getNth(tup.arguments, j); | 117 { Argument arg = Argument.getNth(tup.arguments, j); |
118 b = new BaseClass(arg.type, protection); | 118 b = new BaseClass(arg.type, protection); |
119 baseclasses.insert(i + j, cast(void*)b); | 119 baseclasses.insert(i + j, b); |
120 } | 120 } |
121 } | 121 } |
122 else | 122 else |
123 i++; | 123 i++; |
124 } | 124 } |
131 { | 131 { |
132 TypeClass tc; | 132 TypeClass tc; |
133 BaseClass b; | 133 BaseClass b; |
134 Type tb; | 134 Type tb; |
135 | 135 |
136 b = cast(BaseClass)baseclasses.data[i]; | 136 b = baseclasses[i]; |
137 b.type = b.type.semantic(loc, sc); | 137 b.type = b.type.semantic(loc, sc); |
138 tb = b.type.toBasetype(); | 138 tb = b.type.toBasetype(); |
139 if (tb.ty == TY.Tclass) | 139 if (tb.ty == TY.Tclass) |
140 tc = cast(TypeClass)tb; | 140 tc = cast(TypeClass)tb; |
141 else | 141 else |
149 else | 149 else |
150 { | 150 { |
151 // Check for duplicate interfaces | 151 // Check for duplicate interfaces |
152 for (size_t j = 0; j < i; j++) | 152 for (size_t j = 0; j < i; j++) |
153 { | 153 { |
154 BaseClass b2 = cast(BaseClass)baseclasses.data[j]; | 154 auto b2 = baseclasses[j]; |
155 if (b2.base is tc.sym) | 155 if (b2.base is tc.sym) |
156 error("inherits from duplicate interface %s", b2.base.toChars()); | 156 error("inherits from duplicate interface %s", b2.base.toChars()); |
157 } | 157 } |
158 | 158 |
159 b.base = tc.sym; | 159 b.base = tc.sym; |
186 } | 186 } |
187 i++; | 187 i++; |
188 } | 188 } |
189 | 189 |
190 interfaces_dim = baseclasses.dim; | 190 interfaces_dim = baseclasses.dim; |
191 interfaces = cast(BaseClass*)baseclasses.data; | 191 interfaces = baseclasses.ptr; |
192 | 192 |
193 interfaceSemantic(sc); | 193 interfaceSemantic(sc); |
194 | 194 |
195 if (vtblOffset()) | 195 if (vtblOffset()) |
196 vtbl.push(cast(void*)this); // leave room at vtbl[0] for classinfo | 196 vtbl.push(cast(void*)this); // leave room at vtbl[0] for classinfo |
478 | 478 |
479 // Put out vtblInterfaces.data[]. Must immediately follow csym, because | 479 // Put out vtblInterfaces.data[]. Must immediately follow csym, because |
480 // of the fixup (*) | 480 // of the fixup (*) |
481 | 481 |
482 offset += vtblInterfaces.dim * (4 * PTRSIZE); | 482 offset += vtblInterfaces.dim * (4 * PTRSIZE); |
483 for (size_t i = 0; i < vtblInterfaces.dim; i++) | 483 foreach (b; vtblInterfaces) |
484 { | 484 { |
485 BaseClass b = cast(BaseClass)vtblInterfaces.data[i]; | |
486 ClassDeclaration id = b.base; | 485 ClassDeclaration id = b.base; |
487 | 486 |
488 // ClassInfo | 487 // ClassInfo |
489 dtxoff(&dt, id.toSymbol(), 0, TYnptr); | 488 dtxoff(&dt, id.toSymbol(), 0, TYnptr); |
490 | 489 |