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