annotate dmd/TypeClass.d @ 114:e28b18c23469

added a module dmd.common for commonly used stuff it currently holds code for consistency checking of predefined versions also added a VisualD project file
author Trass3r
date Wed, 01 Sep 2010 18:21:58 +0200
parents be2ab491772e
children 60bb0fe4563e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1 module dmd.TypeClass;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 84
diff changeset
3 import dmd.common;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4 import dmd.Type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5 import dmd.ClassDeclaration;
64
4290d870944a More fixes
korDen
parents: 56
diff changeset
6 import dmd.TypeInstance;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
7 import dmd.Loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
8 import dmd.Dsymbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
9 import dmd.Scope;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
10 import dmd.OutBuffer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
11 import dmd.HdrGenState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
12 import dmd.Expression;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
13 import dmd.Identifier;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
14 import dmd.MATCH;
64
4290d870944a More fixes
korDen
parents: 56
diff changeset
15 import dmd.DYNCAST;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
16 import dmd.CppMangleState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
17 import dmd.ArrayTypes;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
18 import dmd.TypeInfoDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
19 import dmd.TY;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
20 import dmd.MOD;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
21 import dmd.Global;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
22 import dmd.TypePointer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
23 import dmd.Declaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
24 import dmd.VarDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
25 import dmd.TOK;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
26 import dmd.DotExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
27 import dmd.Id;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
28 import dmd.ScopeExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
29 import dmd.DotVarExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30 import dmd.VarExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
31 import dmd.PtrExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
32 import dmd.AddExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
33 import dmd.IntegerExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
34 import dmd.DotIdExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
35 import dmd.EnumMember;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
36 import dmd.TemplateMixin;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
37 import dmd.TemplateDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
38 import dmd.TemplateInstance;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
39 import dmd.OverloadSet;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
40 import dmd.DotTypeExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
41 import dmd.TupleExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
42 import dmd.ClassInfoDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
43 import dmd.TypeInfoInterfaceDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
44 import dmd.TypeInfoClassDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
45 import dmd.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
46 import dmd.NullExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
47 import dmd.TypeExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
48 import dmd.DotTemplateExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
49 import dmd.ErrorExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
50 import dmd.ThisExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
51 import dmd.CommaExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
52
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
53 import dmd.expression.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
54 import dmd.backend.Symbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
55 import dmd.backend.TYPE;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
56 import dmd.backend.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
57 import dmd.backend.SC;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
58 import dmd.backend.STR;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
59 import dmd.backend.TYM;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
60 import dmd.backend.LIST;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
61 import dmd.backend.Classsym;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
62
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
63 import std.string : toStringz;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
64
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
65 class TypeClass : Type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
66 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
67 ClassDeclaration sym;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
68
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
69 this(ClassDeclaration sym)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
70 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
71 super(TY.Tclass);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
72 this.sym = sym;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
73 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
74
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
75 version (DumbClone) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
76 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
77 Type clone()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
78 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
79 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
80 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
81 }
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
82 override ulong size(Loc loc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
83 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
84 return PTRSIZE;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
85 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
86
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
87 override string toChars()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
88 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
89 if (mod)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
90 return Type.toChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
91 return sym.toPrettyChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
92 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
93
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
94 override Type syntaxCopy()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
95 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
96 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
97 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
98
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
99 override Type semantic(Loc loc, Scope sc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
100 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
101 //printf("TypeClass.semantic(%s)\n", sym.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
102 if (deco)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
103 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
104 //printf("\t%s\n", merge().deco);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
105 return merge();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
106 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
107
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
108 override Dsymbol toDsymbol(Scope sc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
109 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
110 return sym;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
111 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
112
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
113 override void toDecoBuffer(OutBuffer buf, int flag)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
114 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
115 string name = sym.mangle();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
116 //printf("TypeClass.toDecoBuffer('%s' flag=%d mod=%x) = '%s'\n", toChars(), flag, mod, name);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
117 Type.toDecoBuffer(buf, flag);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
118 buf.printf("%s", name);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
119 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
120
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
121 override void toCBuffer2(OutBuffer buf, HdrGenState* hgs, MOD mod)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
122 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
123 if (mod != this.mod)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
124 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
125 toCBuffer3(buf, hgs, mod);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
126 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
127 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
128 buf.writestring(sym.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
129 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
130
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
131 override Expression dotExp(Scope sc, Expression e, Identifier ident)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
132 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
133 uint offset;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
134
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
135 Expression b;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
136 VarDeclaration v;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
137 Dsymbol s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
138
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
139 version (LOGDOTEXP) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
140 printf("TypeClass.dotExp(e='%s', ident='%s')\n", e.toChars(), ident.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
141 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
142
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
143 if (e.op == TOK.TOKdotexp)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
144 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
145 DotExp de = cast(DotExp)e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
146
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
147 if (de.e1.op == TOK.TOKimport)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
148 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
149 ScopeExp se = cast(ScopeExp)de.e1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
150
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
151 s = se.sds.search(e.loc, ident, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
152 e = de.e1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
153 goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
154 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
155 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
156
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
157 if (ident is Id.tupleof_)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
158 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
159 /* Create a TupleExp
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
160 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
161 e = e.semantic(sc); // do this before turning on noaccesscheck
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
162 Expressions exps = new Expressions;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
163 exps.reserve(sym.fields.dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
164 for (size_t i = 0; i < sym.fields.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
165 {
79
43073c7c7769 updated to 2.035
Trass3r
parents: 73
diff changeset
166 VarDeclaration v2 = cast(VarDeclaration)sym.fields[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
167 Expression fe = new DotVarExp(e.loc, e, v2);
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
168 exps.push(fe);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
169 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
170 e = new TupleExp(e.loc, exps);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
171 sc = sc.push();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
172 sc.noaccesscheck = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
173 e = e.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
174 sc.pop();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
175 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
176 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
177
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
178 s = sym.search(e.loc, ident, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
179 L1:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
180 if (!s)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
181 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
182 // See if it's a base class
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
183 ClassDeclaration cbase;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
184 for (cbase = sym.baseClass; cbase; cbase = cbase.baseClass)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
185 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
186 if (cbase.ident.equals(ident))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
187 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
188 e = new DotTypeExp(Loc(0), e, cbase);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
189 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
190 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
191 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
192
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
193 if (ident is Id.classinfo_)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
194 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
195 assert(ClassDeclaration.classinfo);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
196 Type t = ClassDeclaration.classinfo.type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
197 if (e.op == TOK.TOKtype || e.op == TOK.TOKdottype)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
198 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
199 /* For type.classinfo, we know the classinfo
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
200 * at compile time.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
201 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
202 if (!sym.vclassinfo)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
203 sym.vclassinfo = new ClassInfoDeclaration(sym);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
204
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
205 e = new VarExp(e.loc, sym.vclassinfo);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
206 e = e.addressOf(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
207 e.type = t; // do this so we don't get redundant dereference
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
208 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
209 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
210 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
211 /* For class objects, the classinfo reference is the first
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
212 * entry in the vtbl[]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
213 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
214 e = new PtrExp(e.loc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
215 e.type = t.pointerTo();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
216 if (sym.isInterfaceDeclaration())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
217 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
218 if (sym.isCPPinterface())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
219 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
220 /* C++ interface vtbl[]s are different in that the
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
221 * first entry is always pointer to the first virtual
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
222 * function, not classinfo.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
223 * We can't get a .classinfo for it.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
224 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
225 error(e.loc, "no .classinfo for C++ interface objects");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
226 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
227 /* For an interface, the first entry in the vtbl[]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
228 * is actually a pointer to an instance of struct Interface.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
229 * The first member of Interface is the .classinfo,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
230 * so add an extra pointer indirection.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
231 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
232 e.type = e.type.pointerTo();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
233 e = new PtrExp(e.loc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
234 e.type = t.pointerTo();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
235 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
236 e = new PtrExp(e.loc, e, t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
237 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
238 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
239 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
240
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
241 if (ident is Id.__vptr)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
242 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
243 /* The pointer to the vtbl[]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
244 * *cast(invariant(void*)**)e
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
245 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
246 e = e.castTo(sc, tvoidptr.invariantOf().pointerTo().pointerTo());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
247 e = new PtrExp(e.loc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
248 e = e.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
249 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
250 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
251
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
252 if (ident is Id.__monitor)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
253 { /* The handle to the monitor (call it a void*)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
254 * *(cast(void**)e + 1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
255 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
256 e = e.castTo(sc, tvoidptr.pointerTo());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
257 e = new AddExp(e.loc, e, new IntegerExp(1));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
258 e = new PtrExp(e.loc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
259 e = e.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
260 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
261 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
262
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
263 if (ident is Id.typeinfo_)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
264 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
265 if (!global.params.useDeprecated)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
266 error(e.loc, ".typeinfo deprecated, use typeid(type)");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
267
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
268 return getTypeInfo(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
269 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
270 if (ident is Id.outer && sym.vthis)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
271 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
272 s = sym.vthis;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
273 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
274 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
275 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
276 if (ident !is Id.__sizeof &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
277 ident !is Id.alignof_ &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
278 ident !is Id.init_ &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
279 ident !is Id.mangleof_ &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
280 ident !is Id.stringof_ &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
281 ident !is Id.offsetof)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
282 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
283 /* See if we should forward to the alias this.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
284 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
285 if (sym.aliasthis)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
286 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
287 /* Rewrite e.ident as:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
288 * e.aliasthis.ident
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
289 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
290 e = new DotIdExp(e.loc, e, sym.aliasthis.ident);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
291 e = new DotIdExp(e.loc, e, ident);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
292 return e.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
293 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
294
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
295 /* Look for overloaded opDot() to see if we should forward request
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
296 * to it.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
297 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
298 Dsymbol fd = search_function(sym, Id.opDot);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
299 if (fd)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
300 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
301 /* Rewrite e.ident as:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
302 * e.opId().ident
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
303 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
304 e = build_overload(e.loc, sc, e, null, fd.ident);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
305 e = new DotIdExp(e.loc, e, ident);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
306 return e.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
307 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
308 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
309
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
310 return Type.dotExp(sc, e, ident);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
311 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
312 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
313
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
314 if (!s.isFuncDeclaration()) // because of overloading
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
315 s.checkDeprecated(e.loc, sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
316
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
317 s = s.toAlias();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
318 v = s.isVarDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
319
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
320 if (v && !v.isDataseg())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
321 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
322 Expression ei = v.getConstInitializer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
323
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
324 if (ei)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
325 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
326 e = ei.copy(); // need to copy it if it's a StringExp
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
327 e = e.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
328 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
329 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
330 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
331
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
332 if (s.getType())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
333 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
334 // if (e.op == TOKtype)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
335 return new TypeExp(e.loc, s.getType());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
336 // return new DotTypeExp(e.loc, e, s);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
337 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
338
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
339 EnumMember em = s.isEnumMember();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
340 if (em)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
341 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
342 assert(em.value);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
343 return em.value.copy();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
344 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
345
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
346 TemplateMixin tm = s.isTemplateMixin();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
347 if (tm)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
348 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
349 Expression de = new DotExp(e.loc, e, new ScopeExp(e.loc, tm));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
350 de.type = e.type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
351 return de;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
352 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
353
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
354 TemplateDeclaration td = s.isTemplateDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
355 if (td)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
356 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
357 e = new DotTemplateExp(e.loc, e, td);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
358 e.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
359 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
360 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
361
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
362 TemplateInstance ti = s.isTemplateInstance();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
363 if (ti)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
364 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
365 if (!ti.semanticRun)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
366 ti.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
367 s = ti.inst.toAlias();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
368 if (!s.isTemplateInstance())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
369 goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
370 Expression de = new DotExp(e.loc, e, new ScopeExp(e.loc, ti));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
371 de.type = e.type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
372 return de;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
373 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
374
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
375 OverloadSet o = s.isOverloadSet();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
376 if (o)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
377 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
378 /* We really should allow this
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
379 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
380 error(e.loc, "overload set for %s.%s not allowed in struct declaration", e.toChars(), ident.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
381 return new ErrorExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
382 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
383
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
384 Declaration d = s.isDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
385 if (!d)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
386 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
387 e.error("%s.%s is not a declaration", e.toChars(), ident.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
388 return new ErrorExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
389 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
390
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
391 if (e.op == TOK.TOKtype)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
392 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
393 /* It's:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
394 * Class.d
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
395 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
396 if (d.isTupleDeclaration())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
397 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
398 e = new TupleExp(e.loc, d.isTupleDeclaration());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
399 e = e.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
400 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
401 }
73
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
402 else if (d.needThis() && (hasThis(sc) || !(sc.intypeof || d.isFuncDeclaration())))
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
403 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
404 if (sc.func)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
405 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
406 ClassDeclaration thiscd;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
407 thiscd = sc.func.toParent().isClassDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
408
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
409 if (thiscd)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
410 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
411 ClassDeclaration cd = e.type.isClassHandle();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
412
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
413 if (cd is thiscd)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
414 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
415 e = new ThisExp(e.loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
416 e = new DotTypeExp(e.loc, e, cd);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
417 DotVarExp de = new DotVarExp(e.loc, e, d);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
418 e = de.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
419 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
420 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
421 else if ((!cd || !cd.isBaseOf(thiscd, null)) && !d.isFuncDeclaration())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
422 e.error("'this' is required, but %s is not a base class of %s", e.type.toChars(), thiscd.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
423 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
424 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
425
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
426 /* Rewrite as:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
427 * this.d
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
428 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
429 DotVarExp de = new DotVarExp(e.loc, new ThisExp(e.loc), d);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
430 e = de.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
431 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
432 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
433 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
434 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
435 VarExp ve = new VarExp(e.loc, d, 1);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
436 return ve;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
437 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
438 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
439
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
440 if (d.isDataseg())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
441 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
442 // (e, d)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
443 accessCheck(e.loc, sc, e, d);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
444 VarExp ve = new VarExp(e.loc, d);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
445 e = new CommaExp(e.loc, e, ve);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
446 e.type = d.type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
447 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
448 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
449
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
450 if (d.parent && d.toParent().isModule())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
451 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
452 // (e, d)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
453 VarExp ve = new VarExp(e.loc, d, 1);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
454 e = new CommaExp(e.loc, e, ve);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
455 e.type = d.type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
456 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
457 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
458
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
459 DotVarExp de = new DotVarExp(e.loc, e, d);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
460 return de.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
461 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
462
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
463 override ClassDeclaration isClassHandle()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
464 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
465 return sym;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
466 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
467
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
468 override bool isBaseOf(Type t, int* poffset)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
469 {
56
51605de93870 TupleExp.optimize
korDen
parents: 0
diff changeset
470 if (t.ty == Tclass)
51605de93870 TupleExp.optimize
korDen
parents: 0
diff changeset
471 {
51605de93870 TupleExp.optimize
korDen
parents: 0
diff changeset
472 ClassDeclaration cd;
51605de93870 TupleExp.optimize
korDen
parents: 0
diff changeset
473
51605de93870 TupleExp.optimize
korDen
parents: 0
diff changeset
474 cd = (cast(TypeClass)t).sym;
51605de93870 TupleExp.optimize
korDen
parents: 0
diff changeset
475 if (sym.isBaseOf(cd, poffset))
51605de93870 TupleExp.optimize
korDen
parents: 0
diff changeset
476 return true;
51605de93870 TupleExp.optimize
korDen
parents: 0
diff changeset
477 }
51605de93870 TupleExp.optimize
korDen
parents: 0
diff changeset
478
51605de93870 TupleExp.optimize
korDen
parents: 0
diff changeset
479 return false;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
480 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
481
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
482 override MATCH implicitConvTo(Type to)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
483 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
484 //printf("TypeClass.implicitConvTo(to = '%s') %s\n", to.toChars(), toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
485 MATCH m = constConv(to);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
486 if (m != MATCH.MATCHnomatch)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
487 return m;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
488
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
489 ClassDeclaration cdto = to.isClassHandle();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
490 if (cdto && cdto.isBaseOf(sym, null))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
491 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
492 //printf("'to' is base\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
493 return MATCH.MATCHconvert;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
494 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
495
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
496 if (global.params.Dversion == 1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
497 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
498 // Allow conversion to (void *)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
499 if (to.ty == TY.Tpointer && (cast(TypePointer)to).next.ty == TY.Tvoid)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
500 return MATCH.MATCHconvert;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
501 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
502
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
503 m = MATCH.MATCHnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
504 if (sym.aliasthis)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
505 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
506 Declaration d = sym.aliasthis.isDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
507 if (d)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
508 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
509 assert(d.type);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
510 Type t = d.type.addMod(mod);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
511 m = t.implicitConvTo(to);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
512 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
513 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
514
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
515 return m;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
516 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
517
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
518 override Expression defaultInit(Loc loc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
519 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
520 version (LOGDEFAULTINIT) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
521 printf("TypeClass::defaultInit() '%s'\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
522 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
523 Expression e = new NullExp(loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
524 e.type = this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
525 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
526 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
527
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
528 override bool isZeroInit(Loc loc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
529 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
530 return true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
531 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
532
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
533 override MATCH deduceType(Scope sc, Type tparam, TemplateParameters parameters, Objects dedtypes)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
534 {
64
4290d870944a More fixes
korDen
parents: 56
diff changeset
535 //printf("TypeClass.deduceType(this = %s)\n", toChars());
4290d870944a More fixes
korDen
parents: 56
diff changeset
536
4290d870944a More fixes
korDen
parents: 56
diff changeset
537 /* If this class is a template class, and we're matching
4290d870944a More fixes
korDen
parents: 56
diff changeset
538 * it against a template instance, convert the class type
4290d870944a More fixes
korDen
parents: 56
diff changeset
539 * to a template instance, too, and try again.
4290d870944a More fixes
korDen
parents: 56
diff changeset
540 */
4290d870944a More fixes
korDen
parents: 56
diff changeset
541 TemplateInstance ti = sym.parent.isTemplateInstance();
4290d870944a More fixes
korDen
parents: 56
diff changeset
542
4290d870944a More fixes
korDen
parents: 56
diff changeset
543 if (tparam && tparam.ty == Tinstance)
4290d870944a More fixes
korDen
parents: 56
diff changeset
544 {
4290d870944a More fixes
korDen
parents: 56
diff changeset
545 if (ti && ti.toAlias() == sym)
4290d870944a More fixes
korDen
parents: 56
diff changeset
546 {
4290d870944a More fixes
korDen
parents: 56
diff changeset
547 TypeInstance t = new TypeInstance(Loc(0), ti);
4290d870944a More fixes
korDen
parents: 56
diff changeset
548 return t.deduceType(sc, tparam, parameters, dedtypes);
4290d870944a More fixes
korDen
parents: 56
diff changeset
549 }
4290d870944a More fixes
korDen
parents: 56
diff changeset
550
4290d870944a More fixes
korDen
parents: 56
diff changeset
551 /* Match things like:
4290d870944a More fixes
korDen
parents: 56
diff changeset
552 * S!(T).foo
4290d870944a More fixes
korDen
parents: 56
diff changeset
553 */
4290d870944a More fixes
korDen
parents: 56
diff changeset
554 TypeInstance tpi = cast(TypeInstance)tparam;
4290d870944a More fixes
korDen
parents: 56
diff changeset
555 if (tpi.idents.dim)
4290d870944a More fixes
korDen
parents: 56
diff changeset
556 { Identifier id = cast(Identifier)tpi.idents.data[tpi.idents.dim - 1];
4290d870944a More fixes
korDen
parents: 56
diff changeset
557 if (id.dyncast() == DYNCAST.DYNCAST_IDENTIFIER && sym.ident.equals(id))
4290d870944a More fixes
korDen
parents: 56
diff changeset
558 {
4290d870944a More fixes
korDen
parents: 56
diff changeset
559 Type tparent = sym.parent.getType();
4290d870944a More fixes
korDen
parents: 56
diff changeset
560 if (tparent)
4290d870944a More fixes
korDen
parents: 56
diff changeset
561 {
4290d870944a More fixes
korDen
parents: 56
diff changeset
562 /* Slice off the .foo in S!(T).foo
4290d870944a More fixes
korDen
parents: 56
diff changeset
563 */
4290d870944a More fixes
korDen
parents: 56
diff changeset
564 tpi.idents.dim--;
4290d870944a More fixes
korDen
parents: 56
diff changeset
565 MATCH m = tparent.deduceType(sc, tpi, parameters, dedtypes);
4290d870944a More fixes
korDen
parents: 56
diff changeset
566 tpi.idents.dim++;
4290d870944a More fixes
korDen
parents: 56
diff changeset
567 return m;
4290d870944a More fixes
korDen
parents: 56
diff changeset
568 }
4290d870944a More fixes
korDen
parents: 56
diff changeset
569 }
4290d870944a More fixes
korDen
parents: 56
diff changeset
570 }
4290d870944a More fixes
korDen
parents: 56
diff changeset
571 }
4290d870944a More fixes
korDen
parents: 56
diff changeset
572
4290d870944a More fixes
korDen
parents: 56
diff changeset
573 // Extra check
4290d870944a More fixes
korDen
parents: 56
diff changeset
574 if (tparam && tparam.ty == Tclass)
4290d870944a More fixes
korDen
parents: 56
diff changeset
575 {
4290d870944a More fixes
korDen
parents: 56
diff changeset
576 TypeClass tp = cast(TypeClass)tparam;
4290d870944a More fixes
korDen
parents: 56
diff changeset
577
4290d870944a More fixes
korDen
parents: 56
diff changeset
578 //printf("\t%d\n", (MATCH) implicitConvTo(tp));
4290d870944a More fixes
korDen
parents: 56
diff changeset
579 return implicitConvTo(tp);
4290d870944a More fixes
korDen
parents: 56
diff changeset
580 }
4290d870944a More fixes
korDen
parents: 56
diff changeset
581 return Type.deduceType(sc, tparam, parameters, dedtypes);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
582 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
583
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
584 override bool isauto()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
585 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
586 return sym.isauto;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
587 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
588
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
589 override bool checkBoolean()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
590 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
591 return true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
592 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
593
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
594 override TypeInfoDeclaration getTypeInfoDeclaration()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
595 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
596 if (sym.isInterfaceDeclaration())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
597 return new TypeInfoInterfaceDeclaration(this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
598 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
599 return new TypeInfoClassDeclaration(this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
600 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
601
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
602 override bool hasPointers()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
603 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
604 return true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
605 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
606
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
607 override bool builtinTypeInfo()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
608 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
609 /* This is statically put out with the ClassInfo, so
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
610 * claim it is built in so it isn't regenerated by each module.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
611 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
612 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
613 return mod ? false : true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
614 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
615 return true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
616 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
617 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
618
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
619 version (DMDV2) {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
620 override Type toHeadMutable()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
621 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
622 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
623 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
624
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
625 override MATCH constConv(Type to)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
626 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
627 if (equals(to))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
628 return MATCH.MATCHexact;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
629
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
630 if (ty == to.ty && sym == (cast(TypeClass)to).sym && to.mod == MOD.MODconst)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
631 return MATCH.MATCHconst;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
632
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
633 return MATCH.MATCHnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
634 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
635
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
636 version (CPP_MANGLE) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
637 void toCppMangle(OutBuffer buf, CppMangleState* cms)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
638 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
639 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
640 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
641 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
642 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
643
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
644 override type* toCtype()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
645 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
646 type* t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
647 Symbol* s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
648
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
649 //printf("TypeClass.toCtype() %s\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
650 if (ctype)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
651 return ctype;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
652
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
653 /* Need this symbol to do C++ name mangling
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
654 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
655 string name = sym.isCPPinterface() ? sym.ident.toChars() : sym.toPrettyChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
656 s = symbol_calloc(toStringz(name));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
657 s.Sclass = SC.SCstruct;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
658 s.Sstruct = struct_calloc();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
659 s.Sstruct.Sflags |= STR.STRclass;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
660 s.Sstruct.Salignsize = sym.alignsize;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
661 s.Sstruct.Sstructalign = cast(ubyte)sym.structalign;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
662 s.Sstruct.Sstructsize = sym.structsize;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
663
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
664 t = type_alloc(TYM.TYstruct);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
665 t.Ttag = cast(Classsym*)s; // structure tag name
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
666 t.Tcount++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
667 s.Stype = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
668 slist_add(s);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
669
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
670 t = type_allocn(TYM.TYnptr, t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
671
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
672 t.Tcount++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
673 ctype = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
674
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
675 /* Add in fields of the class
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
676 * (after setting ctype to avoid infinite recursion)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
677 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
678 if (global.params.symdebug)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
679 for (int i = 0; i < sym.fields.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
680 {
79
43073c7c7769 updated to 2.035
Trass3r
parents: 73
diff changeset
681 VarDeclaration v = cast(VarDeclaration)sym.fields[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
682
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
683 Symbol* s2 = symbol_name(toStringz(v.ident.toChars()), SC.SCmember, v.type.toCtype());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
684 s2.Smemoff = v.offset;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
685 list_append(&s.Sstruct.Sfldlst, s2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
686 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
687
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
688 return t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
689 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
690
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
691 override Symbol* toSymbol()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
692 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
693 return sym.toSymbol();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
694 }
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
695 }