annotate dmd/TypeClass.d @ 178:e3afd1303184

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