annotate dmd/EnumDeclaration.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 90821c10b6a7
children cd48cb899aee
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1 module dmd.EnumDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 96
diff changeset
3 import dmd.common;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4 import dmd.ScopeDsymbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5 import dmd.AddExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6 import dmd.Type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
7 import dmd.CmpExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
8 import dmd.IntegerExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
9 import dmd.EqualExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
10 import dmd.TOK;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
11 import dmd.Id;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
12 import dmd.TY;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
13 import dmd.DsymbolTable;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
14 import dmd.STC;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
15 import dmd.Expression;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
16 import dmd.Identifier;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
17 import dmd.Dsymbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
18 import dmd.Scope;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
19 import dmd.OutBuffer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
20 import dmd.HdrGenState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
21 import dmd.Global;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
22 import dmd.Loc;
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 20
diff changeset
23 import dmd.Module;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
24 import dmd.TypeEnum;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
25 import dmd.EnumMember;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
26 import dmd.DYNCAST;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
27 import dmd.WANT;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
28 import dmd.Id;
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
29 import dmd.Json;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30 import dmd.Lexer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
31
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
32 import dmd.backend.SC;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
33 import dmd.backend.FL;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
34 import dmd.backend.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
35 import dmd.backend.Symbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
36 import dmd.backend.Classsym;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
37 import dmd.backend.SFL;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
38 import dmd.backend.LIST;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
39 import dmd.codegen.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
40
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
41 import std.stdio : writef;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
42
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
43 class EnumDeclaration : ScopeDsymbol
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
44 { /* enum ident : memtype { ... }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
45 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
46 Type type; // the TypeEnum
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
47 Type memtype; // type of the members
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
48
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
49 version (DMDV1)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
50 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
51 ulong maxval;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
52 ulong minval;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
53 ulong defaultval; // default initializer
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
54 }
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
55 else
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
56 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
57 Expression maxval;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
58 Expression minval;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
59 Expression defaultval; // default initializer
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
60 }
138
Trass3r
parents: 114
diff changeset
61 bool isdeprecated = false;
Trass3r
parents: 114
diff changeset
62 bool isdone = false; // 0: not done
Trass3r
parents: 114
diff changeset
63 // 1: semantic() successfully completed
Trass3r
parents: 114
diff changeset
64
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
65 this(Loc loc, Identifier id, Type memtype)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
66 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 138
diff changeset
67 register();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
68 super(id);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
69 this.loc = loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
70 type = new TypeEnum(this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
71 this.memtype = memtype;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
72 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
73
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
74 override Dsymbol syntaxCopy(Dsymbol s)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
75 {
20
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
76 Type t = null;
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
77 if (memtype)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
78 t = memtype.syntaxCopy();
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
79
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
80 EnumDeclaration ed;
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
81 if (s)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
82 { ed = cast(EnumDeclaration)s;
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
83 ed.memtype = t;
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
84 }
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
85 else
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
86 ed = new EnumDeclaration(loc, ident, t);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
87 ScopeDsymbol.syntaxCopy(ed);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
88 return ed;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
89 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
90
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
91 override void semantic(Scope sc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
92 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
93 Type t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
94 Scope sce;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
95
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
96 //writef("EnumDeclaration.semantic(sd = %p, '%s') %s\n", sc.scopesym, sc.scopesym.toChars(), toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
97 //writef("EnumDeclaration.semantic() %s\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
98 if (!members) // enum ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
99 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
100
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
101 if (!memtype && !isAnonymous())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
102 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
103 // Set memtype if we can to reduce fwd reference errors
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
104 memtype = Type.tint32; // case 1) enum ident { ... }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
105 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
106
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
107 if (symtab) // if already done
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
108 {
138
Trass3r
parents: 114
diff changeset
109 if (isdone || !scope_)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
110 return; // semantic() already completed
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
111 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
112 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
113 symtab = new DsymbolTable();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
114
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
115 Scope scx = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
116 if (scope_)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
117 { sc = scope_;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
118 scx = scope_; // save so we don't make redundant copies
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
119 scope_ = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
120 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
121
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
122 if (sc.stc & STC.STCdeprecated)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
123 isdeprecated = true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
124
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
125 parent = sc.parent;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
126
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
127 /* The separate, and distinct, cases are:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
128 * 1. enum { ... }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
129 * 2. enum : memtype { ... }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
130 * 3. enum ident { ... }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
131 * 4. enum ident : memtype { ... }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
132 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
133
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
134 if (memtype)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
135 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
136 memtype = memtype.semantic(loc, sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
137
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
138 /* Check to see if memtype is forward referenced
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
139 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
140 if (memtype.ty == TY.Tenum)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
141 { EnumDeclaration sym = cast(EnumDeclaration)memtype.toDsymbol(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
142 if (!sym.memtype || !sym.members || !sym.symtab || sym.scope_)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
143 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
144 // memtype is forward referenced, so try again later
87
b17640f0e4e8 Fixed a bug with a Scope.this(Scope enclosing) being called instead of Scope.clone() method (as a copy ctor replacement)
korDen
parents: 79
diff changeset
145 scope_ = scx ? scx : sc.clone();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
146 scope_.setNoFree();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
147 scope_.module_.addDeferredSemantic(this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
148 writef("\tdeferring %s\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
149 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
150 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
151 }
138
Trass3r
parents: 114
diff changeset
152 static if (false)
Trass3r
parents: 114
diff changeset
153 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
154 // Decided to abandon this restriction for D 2.0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
155 if (!memtype.isintegral())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
156 { error("base type must be of integral type, not %s", memtype.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
157 memtype = Type.tint32;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
158 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
159 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
160 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
161
138
Trass3r
parents: 114
diff changeset
162 isdone = true;
Trass3r
parents: 114
diff changeset
163
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
164 type = type.semantic(loc, sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
165 if (isAnonymous())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
166 sce = sc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
167 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
168 { sce = sc.push(this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
169 sce.parent = this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
170 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
171 if (members.dim == 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
172 error("enum %s must have at least one member", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
173 int first = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
174 Expression elast = null;
77
ad4792a1cfd6 more D-ification container accessing
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
175 foreach (Dsymbol s; members)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
176 {
77
ad4792a1cfd6 more D-ification container accessing
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
177 EnumMember em = s.isEnumMember();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
178 Expression e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
179
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
180 if (!em)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
181 /* The e.semantic(sce) can insert other symbols, such as
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
182 * template instances and function literals.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
183 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
184 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
185
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
186 //printf(" Enum member '%s'\n",em.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
187 if (em.type)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
188 em.type = em.type.semantic(em.loc, sce);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
189 e = em.value;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
190 if (e)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
191 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
192 assert(e.dyncast() == DYNCAST.DYNCAST_EXPRESSION);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
193 e = e.semantic(sce);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
194 e = e.optimize(WANT.WANTvalue | WANT.WANTinterpret);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
195 if (memtype)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
196 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
197 e = e.implicitCastTo(sce, memtype);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
198 e = e.optimize(WANT.WANTvalue | WANT.WANTinterpret);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
199 if (!isAnonymous())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
200 e = e.castTo(sce, type);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
201 t = memtype;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
202 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
203 else if (em.type)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
204 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
205 e = e.implicitCastTo(sce, em.type);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
206 e = e.optimize(WANT.WANTvalue | WANT.WANTinterpret);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
207 assert(isAnonymous());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
208 t = e.type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
209 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
210 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
211 t = e.type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
212 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
213 else if (first)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
214 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
215 if (memtype)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
216 t = memtype;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
217 else if (em.type)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
218 t = em.type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
219 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
220 t = Type.tint32;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
221 e = new IntegerExp(em.loc, 0, Type.tint32);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
222 e = e.implicitCastTo(sce, t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
223 e = e.optimize(WANT.WANTvalue | WANT.WANTinterpret);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
224 if (!isAnonymous())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
225 e = e.castTo(sce, type);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
226 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
227 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
228 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
229 // Set value to (elast + 1).
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
230 // But first check that (elast != t.max)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
231 assert(elast);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
232 e = new EqualExp(TOK.TOKequal, em.loc, elast, t.getProperty(Loc(0), Id.max));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
233 e = e.semantic(sce);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
234 e = e.optimize(WANT.WANTvalue | WANT.WANTinterpret);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
235 if (e.toInteger())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
236 error("overflow of enum value %s", elast.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
237
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
238 // Now set e to (elast + 1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
239 e = new AddExp(em.loc, elast, new IntegerExp(em.loc, 1, Type.tint32));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
240 e = e.semantic(sce);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
241 e = e.castTo(sce, elast.type);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
242 e = e.optimize(WANT.WANTvalue | WANT.WANTinterpret);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
243 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
244 elast = e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
245 em.value = e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
246
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
247 // Add to symbol table only after evaluating 'value'
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
248 if (isAnonymous())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
249 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
250 /* Anonymous enum members get added to enclosing scope.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
251 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
252 for (Scope scxx = sce; scxx; scxx = scxx.enclosing)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
253 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
254 if (scxx.scopesym)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
255 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
256 if (!scxx.scopesym.symtab)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
257 scxx.scopesym.symtab = new DsymbolTable();
13
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 0
diff changeset
258 em.addMember(sce, scxx.scopesym, true);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
259 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
260 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
261 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
262 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
263 else
13
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 0
diff changeset
264 em.addMember(sc, this, true);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
265
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
266 /* Compute .min, .max and .default values.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
267 * If enum doesn't have a name, we can never identify the enum type,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
268 * so there is no purpose for a .min, .max or .default
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
269 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
270 if (!isAnonymous())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
271 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
272 if (first)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
273 { defaultval = e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
274 minval = e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
275 maxval = e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
276 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
277 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
278 { Expression ec;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
279
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
280 /* In order to work successfully with UDTs,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
281 * build expressions to do the comparisons,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
282 * and let the semantic analyzer and constant
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
283 * folder give us the result.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
284 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
285
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
286 // Compute if(e < minval)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
287 ec = new CmpExp(TOK.TOKlt, em.loc, e, minval);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
288 ec = ec.semantic(sce);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
289 ec = ec.optimize(WANT.WANTvalue | WANT.WANTinterpret);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
290 if (ec.toInteger())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
291 minval = e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
292
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
293 ec = new CmpExp(TOK.TOKgt, em.loc, e, maxval);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
294 ec = ec.semantic(sce);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
295 ec = ec.optimize(WANT.WANTvalue | WANT.WANTinterpret);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
296 if (ec.toInteger())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
297 maxval = e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
298 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
299 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
300 first = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
301 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
302 //printf("defaultval = %lld\n", defaultval);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
303
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
304 //if (defaultval) printf("defaultval: %s %s\n", defaultval.toChars(), defaultval.type.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
305 if (sc != sce)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
306 sce.pop();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
307 //members.print();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
308 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
309
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
310 override bool oneMember(Dsymbol* ps)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
311 {
20
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
312 if (isAnonymous())
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
313 return Dsymbol.oneMembers(members, ps);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
314 return Dsymbol.oneMember(ps);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
315 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
316
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
317 override void toCBuffer(OutBuffer buf, HdrGenState* hgs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
318 {
20
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
319 buf.writestring("enum ");
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
320 if (ident)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
321 { buf.writestring(ident.toChars());
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
322 buf.writeByte(' ');
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
323 }
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
324 if (memtype)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
325 {
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
326 buf.writestring(": ");
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
327 memtype.toCBuffer(buf, null, hgs);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
328 }
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
329 if (!members)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
330 {
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
331 buf.writeByte(';');
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
332 buf.writenl();
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
333 return;
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
334 }
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
335 buf.writenl();
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
336 buf.writeByte('{');
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
337 buf.writenl();
77
ad4792a1cfd6 more D-ification container accessing
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
338 foreach(Dsymbol s; members)
20
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
339 {
77
ad4792a1cfd6 more D-ification container accessing
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
340 EnumMember em = s.isEnumMember();
20
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
341 if (!em)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
342 continue;
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
343 //buf.writestring(" ");
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
344 em.toCBuffer(buf, hgs);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
345 buf.writeByte(',');
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
346 buf.writenl();
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
347 }
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
348 buf.writeByte('}');
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
349 buf.writenl();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
350 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
351
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
352 override Type getType()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
353 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
354 return type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
355 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
356
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
357 override string kind()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
358 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
359 return "enum";
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
360 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
361
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
362 version (DMDV2) {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
363 override Dsymbol search(Loc, Identifier ident, int flags)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
364 {
20
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
365 //printf("%s.EnumDeclaration.search('%s')\n", toChars(), ident.toChars());
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
366 if (scope_)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
367 // Try one last time to resolve this enum
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
368 semantic(scope_);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
369
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
370 if (!members || !symtab || scope_)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
371 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
372 error("is forward referenced when looking for '%s'", ident.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
373 //*(char*)0=0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
374 return null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
375 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
376
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
377 return ScopeDsymbol.search(loc, ident, flags);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
378 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
379 }
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
380 override bool isDeprecated() // is Dsymbol deprecated?
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
381 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
382 return isdeprecated;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
383 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
384
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
385 override void emitComment(Scope sc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
386 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
387 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
388 }
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
389
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
390 override void toJsonBuffer(OutBuffer buf)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
391 {
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
392 //writef("EnumDeclaration.toJsonBuffer()\n");
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
393 if (isAnonymous())
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
394 {
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
395 if (members)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
396 {
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
397 foreach (Dsymbol s; members)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
398 {
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
399 s.toJsonBuffer(buf);
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
400 buf.writestring(",\n");
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
401 }
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
402 JsonRemoveComma(buf);
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
403 }
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
404 return;
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
405 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
406
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
407 buf.writestring("{\n");
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
408
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
409 JsonProperty(buf, Pname, toChars());
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
410 JsonProperty(buf, Pkind, kind());
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
411 if (comment)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
412 JsonProperty(buf, Pcomment, comment);
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
413
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
414 if (loc.linnum)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
415 JsonProperty(buf, Pline, loc.linnum);
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
416
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
417 if (memtype)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
418 JsonProperty(buf, "base", memtype.toChars());
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
419
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
420 JsonString(buf, Pmembers);
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
421 buf.writestring(" : [\n");
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
422 size_t offset = buf.offset;
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
423 foreach (Dsymbol s; members)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
424 {
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
425 if (offset != buf.offset)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
426 {
96
acd69f84627e further work
Trass3r
parents: 89
diff changeset
427 buf.writestring(",\n");
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
428 offset = buf.offset;
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
429 }
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
430 s.toJsonBuffer(buf);
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
431 }
96
acd69f84627e further work
Trass3r
parents: 89
diff changeset
432 JsonRemoveComma(buf);
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
433 buf.writestring("]\n");
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
434
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
435 buf.writestring("}\n");
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
436 }
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
437
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
438 override void toDocBuffer(OutBuffer buf)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
439 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
440 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
441 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
442
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
443 override EnumDeclaration isEnumDeclaration() { return this; }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
444
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
445 override void toObjFile(int multiobj) // compile to .obj file
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
446 {
20
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
447 //printf("EnumDeclaration.toObjFile('%s')\n", toChars());
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
448 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
449 if (isAnonymous())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
450 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
451 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
452
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
453 if (global.params.symdebug)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
454 toDebug();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
455
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
456 type.getTypeInfo(null); // generate TypeInfo
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
457
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
458 TypeEnum tc = cast(TypeEnum)type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
459 if (!tc.sym.defaultval || type.isZeroInit(Loc(0))) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
460 ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
461 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
462 SC scclass = SCglobal;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
463 if (inTemplateInstance())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
464 scclass = SCcomdat;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
465
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
466 // Generate static initializer
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
467 toInitializer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
468 sinit.Sclass = scclass;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
469 sinit.Sfl = FLdata;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
470 version (ELFOBJ) { // Burton
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
471 sinit.Sseg = Segment.CDATA;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
472 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
473 version (MACHOBJ) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
474 sinit.Sseg = Segment.DATA;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
475 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
476 version (DMDV1) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
477 dtnbytes(&sinit.Sdt, tc.size(0), cast(char*)&tc.sym.defaultval);
20
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
478 //sinit.Sdt = tc.sym.init.toDt();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
479 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
480 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
481 tc.sym.defaultval.toDt(&sinit.Sdt);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
482 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
483 outdata(sinit);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
484 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
485 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
486
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
487 void toDebug()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
488 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
489 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
490 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
491
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
492 override int cvMember(ubyte* p)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
493 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
494 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
495 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
496
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
497 Symbol* sinit;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
498
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
499 Symbol* toInitializer()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
500 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
501 Symbol* s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
502 Classsym* stag;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
503
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
504 if (!sinit)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
505 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
506 stag = fake_classsym(Id.ClassInfo);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
507 Identifier ident_save = ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
508 if (!ident)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
509 ident = Lexer.uniqueId("__enum");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
510 s = toSymbolX("__init", SCextern, stag.Stype, "Z");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
511 ident = ident_save;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
512 s.Sfl = FLextern;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
513 s.Sflags |= SFLnodebug;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
514 slist_add(s);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
515 sinit = s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
516 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
517
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
518 return sinit;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
519 }
20
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
520 };