annotate dmd/StructDeclaration.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 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.StructDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 103
diff changeset
3 import dmd.common;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4 import dmd.AggregateDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5 import dmd.FuncDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6 import dmd.DeclarationExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
7 import dmd.VoidInitializer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
8 import dmd.Initializer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
9 import dmd.ExpInitializer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
10 import dmd.TOK;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
11 import dmd.Statement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
12 import dmd.VarExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
13 import dmd.CompoundStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
14 import dmd.AssignExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
15 import dmd.DotVarExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
16 import dmd.AddrExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
17 import dmd.CastExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
18 import dmd.PostBlitDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
19 import dmd.Lexer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
20 import dmd.ExpStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
21 import dmd.DotIdExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
22 import dmd.TypeSArray;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
23 import dmd.ThisExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
24 import dmd.ThisDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
25 import dmd.TypeFunction;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
26 import dmd.Parameter;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
27 import dmd.Id;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
28 import dmd.TY;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
29 import dmd.LINK;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30 import dmd.Type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
31 import dmd.DsymbolTable;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
32 import dmd.ArrayTypes;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
33 import dmd.Loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
34 import dmd.STC;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
35 import dmd.Identifier;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
36 import dmd.TemplateInstance;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
37 import dmd.Dsymbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
38 import dmd.Scope;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
39 import dmd.OutBuffer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
40 import dmd.HdrGenState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
41 import dmd.PROT;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
42 import dmd.TypeStruct;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
43 import dmd.expression.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
44 import dmd.Expression;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
45 import dmd.IdentifierExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
46 import dmd.PtrExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
47 import dmd.CallExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
48 import dmd.ReturnStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
49 import dmd.ScopeDsymbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
50 import dmd.Module;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
51 import dmd.VarDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
52 import dmd.InvariantDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
53 import dmd.NewDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
54 import dmd.DeleteDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
55 import dmd.Global;
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
56 import dmd.MOD;
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
57 import dmd.IntegerExp;
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
58 import dmd.EqualExp;
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
59 import dmd.AndAndExp;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
60
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
61 import dmd.backend.dt_t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
62 import dmd.backend.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
63 import dmd.backend.SC;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
64 import dmd.backend.DT;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
65 import dmd.backend.FL;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
66 import dmd.backend.glue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
67
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
68 import std.stdio;
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
69
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
70 class StructDeclaration : AggregateDeclaration
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
71 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
72 bool zeroInit; // true if initialize with 0 fill
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 169
diff changeset
73
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
74 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
75 int hasIdentityAssign; // !=0 if has identity opAssign
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
76 FuncDeclaration cpctor; // generated copy-constructor, if any
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
77 FuncDeclaration eq; // bool opEquals(ref const T), if any
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
78
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
79 FuncDeclarations postblits; // Array of postblit functions
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
80 FuncDeclaration postblit; // aggregate postblit
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
81 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
82
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
83 this(Loc loc, Identifier id)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
84 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 176
diff changeset
85 register();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
86 super(loc, id);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
87
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
88 // For forward references
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
89 type = new TypeStruct(this);
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 169
diff changeset
90
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
91 postblits = new FuncDeclarations(); ///
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
92 }
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 169
diff changeset
93
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 49
diff changeset
94 override Dsymbol syntaxCopy(Dsymbol s)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
95 {
49
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 13
diff changeset
96 StructDeclaration sd;
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 13
diff changeset
97
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 13
diff changeset
98 if (s)
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 13
diff changeset
99 sd = cast(StructDeclaration)s;
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 13
diff changeset
100 else
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 13
diff changeset
101 sd = new StructDeclaration(loc, ident);
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 13
diff changeset
102 ScopeDsymbol.syntaxCopy(sd);
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 13
diff changeset
103 return sd;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
104 }
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 169
diff changeset
105
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 49
diff changeset
106 override void semantic(Scope sc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
107 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
108 Scope sc2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
109
138
Trass3r
parents: 135
diff changeset
110 //writef("+StructDeclaration.semantic(this=%p, '%s', sizeok = %d)\n", this, toChars(), sizeok);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
111
138
Trass3r
parents: 135
diff changeset
112 //static int count; if (++count == 20) halt();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
113
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
114 assert(type);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
115 if (!members) // if forward reference
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
116 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
117
138
Trass3r
parents: 135
diff changeset
118 if (sizeok == 1 || symtab)
Trass3r
parents: 135
diff changeset
119 {
Trass3r
parents: 135
diff changeset
120 if (!scope_)
Trass3r
parents: 135
diff changeset
121 {
Trass3r
parents: 135
diff changeset
122 // writef("already completed\n");
Trass3r
parents: 135
diff changeset
123 scope_ = null;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
124 return; // semantic() already completed
138
Trass3r
parents: 135
diff changeset
125 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
126 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
127 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
128 symtab = new DsymbolTable();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
129
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
130 Scope scx = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
131 if (scope_)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
132 { sc = scope_;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
133 scx = scope_; // save so we don't make redundant copies
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
134 scope_ = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
135 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
136
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
137 parent = sc.parent;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
138 type = type.semantic(loc, sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
139 version (STRUCTTHISREF) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
140 handle = type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
141 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
142 handle = type.pointerTo();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
143 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
144 structalign = sc.structalign;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
145 protection = sc.protection;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
146 storage_class |= sc.stc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
147 if (sc.stc & STC.STCdeprecated)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
148 isdeprecated = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
149 assert(!isAnonymous());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
150 if (sc.stc & STC.STCabstract)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
151 error("structs, unions cannot be abstract");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
152 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
153 if (storage_class & STC.STCimmutable)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
154 type = type.invariantOf();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
155 else if (storage_class & STC.STCconst)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
156 type = type.constOf();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
157 else if (storage_class & STC.STCshared)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
158 type = type.sharedOf();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
159 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
160
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
161 if (sizeok == 0) // if not already done the addMember step
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
162 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
163 int hasfunctions = 0;
77
ad4792a1cfd6 more D-ification container accessing
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 74
diff changeset
164 foreach(Dsymbol s; members)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
165 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
166 //printf("adding member '%s' to '%s'\n", s.toChars(), this.toChars());
13
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 0
diff changeset
167 s.addMember(sc, this, true);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
168 if (s.isFuncDeclaration())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
169 hasfunctions = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
170 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
171
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
172 // If nested struct, add in hidden 'this' pointer to outer scope
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
173 if (hasfunctions && !(storage_class & STC.STCstatic))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
174 { Dsymbol s = toParent2();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
175 if (s)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
176 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
177 AggregateDeclaration ad = s.isAggregateDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
178 FuncDeclaration fd = s.isFuncDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
179
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
180 TemplateInstance ti;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
181 if (ad && (ti = ad.parent.isTemplateInstance()) !is null && ti.isnested || fd)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
182 { isnested = true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
183 Type t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
184 if (ad)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
185 t = ad.handle;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
186 else if (fd)
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 169
diff changeset
187 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
188 AggregateDeclaration add = fd.isMember2();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
189 if (add)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
190 t = add.handle;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
191 else
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 169
diff changeset
192 t = global.tvoidptr;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
193 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
194 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
195 assert(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
196 if (t.ty == TY.Tstruct)
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 169
diff changeset
197 t = global.tvoidptr; // t should not be a ref type
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
198 assert(!vthis);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
199 vthis = new ThisDeclaration(loc, t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
200 //vthis.storage_class |= STC.STCref;
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
201 members.push(vthis);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
202 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
203 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
204 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
205 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
206
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
207 sizeok = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
208 sc2 = sc.push(this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
209 sc2.stc &= storage_class & STC.STC_TYPECTOR;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
210 sc2.parent = this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
211 if (isUnionDeclaration())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
212 sc2.inunion = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
213 sc2.protection = PROT.PROTpublic;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
214 sc2.explicitProtection = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
215
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
216
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
217 /* Set scope so if there are forward references, we still might be able to
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
218 * resolve individual members like enums.
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
219 */
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
220 foreach (s; members)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
221 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
222 /* There are problems doing this in the general case because
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
223 * Scope keeps track of things like 'offset'
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
224 */
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
225 if (s.isEnumDeclaration() || (s.isAggregateDeclaration() && s.ident))
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
226 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
227 //printf("setScope %s %s\n", s->kind(), s->toChars());
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
228 s.setScope(sc2);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
229 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
230 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
231
77
ad4792a1cfd6 more D-ification container accessing
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 74
diff changeset
232 foreach(Dsymbol s; members)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
233 {
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
234 s.semantic(sc2);
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
235 if (isUnionDeclaration())
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
236 sc2.offset = 0;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
237 static if (false) {
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
238 if (sizeok == 2)
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
239 { //printf("forward reference\n");
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
240 break;
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
241 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
242 }
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
243 if (auto d = s.isDeclaration())
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 169
diff changeset
244 {
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
245 if (auto t = d.type) {
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
246 if (t.toBasetype().ty == TY.Tstruct) {
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
247 auto ad = t.toDsymbol(sc).isThis();
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
248 /*
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
249 StructDeclaration sd = cast(StructDeclaration)foo;
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
250 if (foo && !sd) {
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
251 writeln(t.classin);
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
252 writeln(foo.classinfo.name);
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
253 assert(false);
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
254 }
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
255 */
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
256 if (ad && ad.isnested)
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
257 error("inner struct %s cannot be a field", ad.toChars());
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
258 }
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
259 }
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
260 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
261 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
262
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
263 version(DMDV1) {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
264 /* This doesn't work for DMDV2 because (ref S) and (S) parameter
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
265 * lists will overload the same.
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
266 */
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
267 /* The TypeInfo_Struct is expecting an opEquals and opCmp with
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
268 * a parameter that is a pointer to the struct. But if there
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
269 * isn't one, but is an opEquals or opCmp with a value, write
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
270 * another that is a shell around the value:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
271 * int opCmp(struct *p) { return opCmp(*p); }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
272 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
273
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
274 TypeFunction tfeqptr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
275 {
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
276 auto arguments = new Parameters;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
277 auto arg = new Parameter(STC.STCin, handle, Id.p, null);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
278
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
279 arguments.push(arg);
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
280 tfeqptr = new TypeFunction(arguments, Type.tint32, 0, LINK.LINKd);
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
281 tfeqptr = cast(TypeFunction)tfeqptr.semantic(Loc(0), sc);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
282 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
283
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
284 TypeFunction tfeq;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
285 {
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
286 auto arguments = new Parameters;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
287 auto arg = new Parameter(STC.STCin, type, null, null);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
288
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
289 arguments.push(arg);
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
290 tfeq = new TypeFunction(arguments, Type.tint32, 0, LINK.LINKd);
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
291 tfeq = cast(TypeFunction)tfeq.semantic(Loc(0), sc);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
292 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
293
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
294 Identifier id = Id.eq;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
295 for (int j = 0; j < 2; j++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
296 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
297 Dsymbol s = search_function(this, id);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
298 FuncDeclaration fdx = s ? s.isFuncDeclaration() : null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
299 if (fdx)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
300 { FuncDeclaration fd = fdx.overloadExactMatch(tfeqptr);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
301 if (!fd)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
302 { fd = fdx.overloadExactMatch(tfeq);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
303 if (fd)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
304 { // Create the thunk, fdptr
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
305 FuncDeclaration fdptr = new FuncDeclaration(loc, loc, fdx.ident, STC.STCundefined, tfeqptr);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
306 Expression e = new IdentifierExp(loc, Id.p);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
307 e = new PtrExp(loc, e);
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
308 auto args = new Expressions();
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
309 args.push(e);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
310 e = new IdentifierExp(loc, id);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
311 e = new CallExp(loc, e, args);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
312 fdptr.fbody = new ReturnStatement(loc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
313 ScopeDsymbol ss = fdx.parent.isScopeDsymbol();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
314 assert(ss);
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
315 ss.members.push(fdptr);
13
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 0
diff changeset
316 fdptr.addMember(sc, ss, true);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
317 fdptr.semantic(sc2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
318 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
319 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
320 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
321
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
322 id = Id.cmp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
323 }
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
324 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
325 version (DMDV2) {
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
326 /* Try to find the opEquals function. Build it if necessary.
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
327 */
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
328 TypeFunction tfeqptr;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
329 { // bool opEquals(const T*) const;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
330 auto parameters = new Parameters;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
331 version(STRUCTTHISREF) {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
332 // bool opEquals(ref const T) const;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
333 auto param = new Parameter(STC.STCref, type.constOf(), null, null);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
334 } else {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
335 // bool opEquals(const T*) const;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
336 auto param = new Parameter(STC.STCin, type.pointerTo(), null, null);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
337 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
338
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
339 parameters.push(param);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
340 tfeqptr = new TypeFunction(parameters, Type.tbool, 0, LINK.LINKd);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
341 tfeqptr.mod = MOD.MODconst;
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
342 tfeqptr = cast(TypeFunction)(tfeqptr.semantic(Loc(0), sc2));
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
343
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
344 Dsymbol s = search_function(this, Id.eq);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
345 FuncDeclaration fdx = s ? s.isFuncDeclaration() : null;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
346 if (fdx)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
347 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
348 eq = fdx.overloadExactMatch(tfeqptr);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
349 if (!eq)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
350 fdx.error("type signature should be %s not %s", tfeqptr.toChars(), fdx.type.toChars());
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
351 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
352
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
353 if (!eq)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
354 eq = buildOpEquals(sc2);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
355 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
356
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
357 dtor = buildDtor(sc2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
358 postblit = buildPostBlit(sc2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
359 cpctor = buildCpCtor(sc2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
360 buildOpAssign(sc2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
361 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
362
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
363 sc2.pop();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
364
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
365 if (sizeok == 2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
366 { // semantic() failed because of forward references.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
367 // Unwind what we did, and defer it for later
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
368 fields.setDim(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
369 structsize = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
370 alignsize = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
371 structalign = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
372
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
373 scope_ = scx ? scx : sc.clone();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
374 scope_.setNoFree();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
375 scope_.module_.addDeferredSemantic(this);
138
Trass3r
parents: 135
diff changeset
376 writef("\tdeferring %s\n", toChars());
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
377 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
378 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
379
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
380 // 0 sized struct's are set to 1 byte
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
381 if (structsize == 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
382 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
383 structsize = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
384 alignsize = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
385 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
386
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
387 // Round struct size up to next alignsize boundary.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
388 // This will ensure that arrays of structs will get their internals
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
389 // aligned properly.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
390 structsize = (structsize + alignsize - 1) & ~(alignsize - 1);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
391
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
392 sizeok = 1;
169
e7769d53e750 Moves static variables from Module to Global
korDen
parents: 154
diff changeset
393 global.dprogress++;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
394
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
395 //printf("-StructDeclaration.semantic(this=%p, '%s')\n", this, toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
396
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
397 // Determine if struct is all zeros or not
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
398 zeroInit = true;
85
8e69d041a99d Previous commit didn't compile. Fixed.
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
399 foreach (VarDeclaration vd; fields)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
400 {
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
401 if (vd && !vd.isDataseg())
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
402 {
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
403 if (vd.init)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
404 {
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
405 // Should examine init to see if it is really all 0's
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
406 zeroInit = false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
407 break;
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
408 }
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
409 else
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
410 {
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
411 if (!vd.type.isZeroInit(loc))
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
412 {
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
413 zeroInit = false;
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
414 break;
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
415 }
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
416 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
417 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
418 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
419
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
420 /* Look for special member functions.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
421 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
422 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
423 ctor = search(Loc(0), Id.ctor, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
424 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
425 inv = cast(InvariantDeclaration)search(Loc(0), Id.classInvariant, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
426 aggNew = cast(NewDeclaration)search(Loc(0), Id.classNew, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
427 aggDelete = cast(DeleteDeclaration)search(Loc(0), Id.classDelete, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
428
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
429 if (sc.func)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
430 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
431 semantic2(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
432 semantic3(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
433 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
434 }
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 169
diff changeset
435
154
14feb7ae01a6 * changed the build system to build a release version if the debug one compiles
trass3r
parents: 139
diff changeset
436 override Dsymbol search(Loc loc, Identifier ident, int flags)
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
437 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
438 //printf("%s.StructDeclaration::search('%s')\n", toChars(), ident->toChars());
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
439
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
440 if (scope_)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
441 semantic(scope_);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
442
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
443 if (!members || !symtab)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
444 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
445 error("is forward referenced when looking for '%s'", ident.toChars());
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
446 return null;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
447 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
448
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
449 return ScopeDsymbol.search(loc, ident, flags);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
450 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
451
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 49
diff changeset
452 override void toCBuffer(OutBuffer buf, HdrGenState* hgs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
453 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
454 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
455 }
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 169
diff changeset
456
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 49
diff changeset
457 override string mangle()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
458 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
459 //printf("StructDeclaration.mangle() '%s'\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
460 return Dsymbol.mangle();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
461 }
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 169
diff changeset
462
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 49
diff changeset
463 override string kind()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
464 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
465 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
466 }
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
467
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
468 version(DMDV1)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
469 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
470 Expression cloneMembers()
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
471 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
472 assert(false);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
473 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
474 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
475
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
476 version(DMDV2)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
477 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
478 /*******************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
479 * We need an opAssign for the struct if
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
480 * it has a destructor or a postblit.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
481 * We need to generate one if a user-specified one does not exist.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
482 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
483 bool needOpAssign()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
484 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
485 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
486 printf("StructDeclaration.needOpAssign() %s\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
487 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
488 if (hasIdentityAssign)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
489 goto Ldontneed;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
490
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
491 if (dtor || postblit)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
492 goto Lneed;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
493
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
494 /* If any of the fields need an opAssign, then we
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
495 * need it too.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
496 */
85
8e69d041a99d Previous commit didn't compile. Fixed.
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
497 foreach (VarDeclaration v; fields)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
498 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
499 assert(v && v.storage_class & STC.STCfield);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
500 if (v.storage_class & STC.STCref)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
501 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
502 Type tv = v.type.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
503 while (tv.ty == TY.Tsarray)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
504 { TypeSArray ta = cast(TypeSArray)tv;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
505 tv = tv.nextOf().toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
506 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
507 if (tv.ty == TY.Tstruct)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
508 { TypeStruct ts = cast(TypeStruct)tv;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
509 StructDeclaration sd = ts.sym;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
510 if (sd.needOpAssign())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
511 goto Lneed;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
512 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
513 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
514 Ldontneed:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
515 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
516 printf("\tdontneed\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
517 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
518 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
519
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
520 Lneed:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
521 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
522 printf("\tneed\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
523 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
524 return true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
525 }
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 169
diff changeset
526
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
527 /*******************************************
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
528 * We need an opEquals for the struct if
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
529 * any fields has an opEquals.
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
530 * Generate one if a user-specified one does not exist.
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
531 */
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
532 bool needOpEquals()
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
533 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
534 enum X = 0;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
535 static if (X) printf("StructDeclaration::needOpEquals() %s\n", toChars());
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
536
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
537 /* If any of the fields has an opEquals, then we
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
538 * need it too.
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
539 */
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
540 foreach (s; fields)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
541 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
542 VarDeclaration v = s.isVarDeclaration();
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
543 assert(v && v.storage_class & STC.STCfield);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
544 if (v.storage_class & STC.STCref)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
545 continue;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
546 Type tv = v.type.toBasetype();
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
547 while (tv.ty == Tsarray)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
548 { auto ta = cast(TypeSArray)tv;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
549 tv = tv.nextOf().toBasetype();
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
550 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
551 if (tv.ty == Tstruct)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
552 { auto ts = cast(TypeStruct)tv;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
553 StructDeclaration sd = ts.sym;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
554 if (sd.eq)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
555 goto Lneed;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
556 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
557 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
558 Ldontneed:
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
559 static if (X) printf("\tdontneed\n");
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
560 return false;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
561
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
562 Lneed:
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
563 static if (X) printf("\tneed\n");
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
564 return true;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
565 }
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 169
diff changeset
566
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
567 /******************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
568 * Build opAssign for struct.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
569 * S* opAssign(S s) { ... }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
570 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
571 FuncDeclaration buildOpAssign(Scope sc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
572 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
573 if (!needOpAssign())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
574 return null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
575
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
576 //printf("StructDeclaration.buildOpAssign() %s\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
577
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
578 FuncDeclaration fop = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
579
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
580 auto param = new Parameter(STC.STCnodtor, type, Id.p, null);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
581 auto fparams = new Parameters;
126
1765f3ef917d ClassDeclarations, Arguments -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
582 fparams.push(param);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
583 Type ftype = new TypeFunction(fparams, handle, false, LINK.LINKd);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
584 version (STRUCTTHISREF) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
585 (cast(TypeFunction)ftype).isref = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
586 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
587
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
588 fop = new FuncDeclaration(Loc(0), Loc(0), Id.assign, STC.STCundefined, ftype);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
589
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
590 Expression e = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
591 if (postblit)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
592 { /* Swap:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
593 * tmp = *this; *this = s; tmp.dtor();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
594 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
595 //printf("\tswap copy\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
596 Identifier idtmp = Lexer.uniqueId("__tmp");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
597 VarDeclaration tmp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
598 AssignExp ec = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
599 if (dtor)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
600 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
601 tmp = new VarDeclaration(Loc(0), type, idtmp, new VoidInitializer(Loc(0)));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
602 tmp.noauto = true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
603 e = new DeclarationExp(Loc(0), tmp);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
604
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
605 Expression e2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
606 version (STRUCTTHISREF) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
607 e2 = new ThisExp(Loc(0));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
608 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
609 e2 = new PtrExp(Loc(0), new ThisExp(Loc(0)));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
610 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
611 ec = new AssignExp(Loc(0), new VarExp(Loc(0), tmp), e2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
612 ec.op = TOK.TOKblit;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
613 e = Expression.combine(e, ec);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
614 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
615 Expression e2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
616 version (STRUCTTHISREF) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
617 e2 = new ThisExp(Loc(0));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
618 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
619 e2 = new PtrExp(Loc(0), new ThisExp(Loc(0)));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
620 }
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 169
diff changeset
621
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
622 ec = new AssignExp(Loc(0), e2, new IdentifierExp(Loc(0), Id.p));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
623 ec.op = TOK.TOKblit;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
624 e = Expression.combine(e, ec);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
625 if (dtor)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
626 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
627 /* Instead of running the destructor on s, run it
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
628 * on tmp. This avoids needing to copy tmp back in to s.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
629 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
630 Expression ecc = new DotVarExp(Loc(0), new VarExp(Loc(0), tmp), dtor, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
631 ecc = new CallExp(Loc(0), ecc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
632 e = Expression.combine(e, ecc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
633 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
634 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
635 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
636 { /* Do memberwise copy
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
637 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
638 //printf("\tmemberwise copy\n");
85
8e69d041a99d Previous commit didn't compile. Fixed.
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
639 foreach (VarDeclaration v; fields)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
640 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
641 assert(v && v.storage_class & STC.STCfield);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
642 // this.v = s.v;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
643 AssignExp ec = new AssignExp(Loc(0), new DotVarExp(Loc(0), new ThisExp(Loc(0)), v, 0), new DotVarExp(Loc(0), new IdentifierExp(Loc(0), Id.p), v, 0));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
644 ec.op = TOK.TOKblit;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
645 e = Expression.combine(e, ec);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
646 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
647 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
648 Statement s1 = new ExpStatement(Loc(0), e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
649
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
650 /* Add:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
651 * return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
652 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
653 e = new ThisExp(Loc(0));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
654 Statement s2 = new ReturnStatement(Loc(0), e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
655
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
656 fop.fbody = new CompoundStatement(Loc(0), s1, s2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
657
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
658 members.push(fop);
13
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 0
diff changeset
659 fop.addMember(sc, this, true);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
660
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
661 sc = sc.push();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
662 sc.stc = STC.STCundefined;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
663 sc.linkage = LINK.LINKd;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
664
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
665 fop.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
666
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
667 sc.pop();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
668
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
669 //printf("-StructDeclaration.buildOpAssign() %s\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
670
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
671 return fop;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
672 }
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 169
diff changeset
673
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
674 /******************************************
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
675 * Build opEquals for struct.
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
676 * const bool opEquals(const ref S s) { ... }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
677 */
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
678 FuncDeclaration buildOpEquals(Scope sc)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
679 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
680 if (!needOpEquals())
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
681 return null;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
682 //printf("StructDeclaration::buildOpEquals() %s\n", toChars());
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
683 Loc loc = this.loc;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
684
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
685 auto parameters = new Parameters;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
686 version (STRUCTTHISREF) {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
687 // bool opEquals(ref const T) const;
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
688 auto param = new Parameter(STC.STCref, type.constOf(), Id.p, null);
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
689 } else {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
690 // bool opEquals(const T*) const;
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
691 auto param = new Parameter(STC.STCin, type.pointerTo(), Id.p, null);
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
692 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
693
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
694 parameters.push(param);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
695 auto ftype = new TypeFunction(parameters, Type.tbool, 0, LINKd);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
696 ftype.mod = MOD.MODconst;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
697 ftype = cast(TypeFunction)ftype.semantic(loc, sc);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
698
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
699 auto fop = new FuncDeclaration(loc, Loc(0), Id.eq, STC.STCundefined, ftype);
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
700
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
701 Expression e = null;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
702 /* Do memberwise compare
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
703 */
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
704 //printf("\tmemberwise compare\n");
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
705 foreach (s; fields)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
706 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
707 VarDeclaration v = s.isVarDeclaration();
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
708 assert(v && v.storage_class & STC.STCfield);
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
709 if (v.storage_class & STC.STCref)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
710 assert(0); // what should we do with this?
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
711 // this.v == s.v;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
712 auto ec = new EqualExp(TOKequal, loc,
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
713 new DotVarExp(loc, new ThisExp(loc), v, 0),
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
714 new DotVarExp(loc, new IdentifierExp(loc, Id.p), v, 0));
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
715 if (e)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
716 e = new AndAndExp(loc, e, ec);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
717 else
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
718 e = ec;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
719 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
720 if (!e)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
721 e = new IntegerExp(loc, 1, Type.tbool);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
722 fop.fbody = new ReturnStatement(loc, e);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
723
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
724 members.push(fop);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
725 fop.addMember(sc, this, 1);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
726
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
727 sc = sc.push();
139
bc45b1c53019 made StorageClass type-safe
Trass3r
parents: 138
diff changeset
728 sc.stc = STCundefined;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
729 sc.linkage = LINK.LINKd;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
730
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
731 fop.semantic(sc);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
732
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
733 sc.pop();
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
734
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
735 //printf("-StructDeclaration::buildOpEquals() %s\n", toChars());
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
736
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
737 return fop;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
738 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
739
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
740 /*****************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
741 * Create inclusive postblit for struct by aggregating
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
742 * all the postblits in postblits[] with the postblits for
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
743 * all the members.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
744 * Note the close similarity with AggregateDeclaration.buildDtor(),
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
745 * and the ordering changes (runs forward instead of backwards).
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
746 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
747
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
748 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
749 FuncDeclaration buildPostBlit(Scope sc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
750 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
751 //printf("StructDeclaration.buildPostBlit() %s\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
752 Expression e = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
753
85
8e69d041a99d Previous commit didn't compile. Fixed.
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
754 foreach (VarDeclaration v; fields)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
755 {
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
756 assert(v && v.storage_class & STC.STCfield);
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
757 if (v.storage_class & STC.STCref)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
758 continue;
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
759 Type tv = v.type.toBasetype();
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
760 size_t dim = 1;
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
761 while (tv.ty == TY.Tsarray)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
762 { TypeSArray ta = cast(TypeSArray)tv;
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
763 dim *= (cast(TypeSArray)tv).dim.toInteger();
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
764 tv = tv.nextOf().toBasetype();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
765 }
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
766 if (tv.ty == TY.Tstruct)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
767 { TypeStruct ts = cast(TypeStruct)tv;
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
768 StructDeclaration sd = ts.sym;
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
769 if (sd.postblit)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
770 { Expression ex;
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 169
diff changeset
771
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
772 // this.v
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
773 ex = new ThisExp(Loc(0));
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
774 ex = new DotVarExp(Loc(0), ex, v, 0);
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 169
diff changeset
775
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
776 if (dim == 1)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
777 { // this.v.postblit()
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
778 ex = new DotVarExp(Loc(0), ex, sd.postblit, 0);
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
779 ex = new CallExp(Loc(0), ex);
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
780 }
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
781 else
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
782 {
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
783 // Typeinfo.postblit(cast(void*)&this.v);
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
784 Expression ea = new AddrExp(Loc(0), ex);
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
785 ea = new CastExp(Loc(0), ea, Type.tvoid.pointerTo());
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 169
diff changeset
786
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
787 Expression et = v.type.getTypeInfo(sc);
103
e6090d1aea7c fixed dmd.Id + some small fixups
Trass3r
parents: 95
diff changeset
788 et = new DotIdExp(Loc(0), et, Id._postblit);
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 169
diff changeset
789
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
790 ex = new CallExp(Loc(0), et, ea);
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
791 }
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
792 e = Expression.combine(e, ex); // combine in forward order
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
793 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
794 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
795 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
796
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
797 /* Build our own "postblit" which executes e
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
798 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
799 if (e)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
800 { //printf("Building __fieldPostBlit()\n");
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
801 auto dd = new PostBlitDeclaration(Loc(0), Loc(0), Lexer.idPool("__fieldPostBlit"));
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
802 dd.fbody = new ExpStatement(Loc(0), e);
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
803 postblits.shift(dd);
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
804 members.push(dd);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
805 dd.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
806 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
807
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
808 switch (postblits.dim)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
809 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
810 case 0:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
811 return null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
812
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
813 case 1:
77
ad4792a1cfd6 more D-ification container accessing
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 74
diff changeset
814 return cast(FuncDeclaration)postblits[0];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
815
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
816 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
817 e = null;
77
ad4792a1cfd6 more D-ification container accessing
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 74
diff changeset
818 foreach(FuncDeclaration fd; postblits)
ad4792a1cfd6 more D-ification container accessing
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 74
diff changeset
819 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
820 Expression ex = new ThisExp(Loc(0));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
821 ex = new DotVarExp(Loc(0), ex, fd, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
822 ex = new CallExp(Loc(0), ex);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
823 e = Expression.combine(e, ex);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
824 }
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
825 auto dd = new PostBlitDeclaration(Loc(0), Loc(0), Lexer.idPool("__aggrPostBlit"));
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
826 dd.fbody = new ExpStatement(Loc(0), e);
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
827 members.push(dd);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
828 dd.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
829 return dd;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
830 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
831 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
832 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
833
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
834 /*******************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
835 * Build copy constructor for struct.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
836 * Copy constructors are compiler generated only, and are only
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
837 * callable from the compiler. They are not user accessible.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
838 * A copy constructor is:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
839 * void cpctpr(ref S s)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
840 * {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
841 * *this = s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
842 * this.postBlit();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
843 * }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
844 * This is done so:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
845 * - postBlit() never sees uninitialized data
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
846 * - memcpy can be much more efficient than memberwise copy
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
847 * - no fields are overlooked
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
848 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
849 FuncDeclaration buildCpCtor(Scope sc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
850 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
851 //printf("StructDeclaration.buildCpCtor() %s\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
852 FuncDeclaration fcp = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
853
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
854 /* Copy constructor is only necessary if there is a postblit function,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
855 * otherwise the code generator will just do a bit copy.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
856 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
857 if (postblit)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
858 {
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
859 //printf("generating cpctor\n");
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
860
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
861 auto param = new Parameter(STC.STCref, type, Id.p, null);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
862 auto fparams = new Parameters;
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
863 fparams.push(param);
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
864 Type ftype = new TypeFunction(fparams, Type.tvoid, false, LINK.LINKd);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
865
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
866 fcp = new FuncDeclaration(Loc(0), Loc(0), Id.cpctor, STC.STCundefined, ftype);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
867
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
868 // Build *this = p;
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
869 Expression e = new ThisExp(Loc(0));
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
870 version (STRUCTTHISREF) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
871 } else {
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
872 e = new PtrExp(Loc(0), e);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
873 }
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
874 AssignExp ea = new AssignExp(Loc(0), e, new IdentifierExp(Loc(0), Id.p));
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
875 ea.op = TOK.TOKblit;
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
876 Statement s = new ExpStatement(Loc(0), ea);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
877
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
878 // Build postBlit();
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
879 e = new VarExp(Loc(0), postblit, 0);
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
880 e = new CallExp(Loc(0), e);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
881
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
882 s = new CompoundStatement(Loc(0), s, new ExpStatement(Loc(0), e));
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
883 fcp.fbody = s;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
884
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
885 members.push(fcp);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
886
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
887 sc = sc.push();
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
888 sc.stc = STC.STCundefined;
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
889 sc.linkage = LINK.LINKd;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
890
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
891 fcp.semantic(sc);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
892
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 126
diff changeset
893 sc.pop();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
894 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
895
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
896 return fcp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
897 }
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
898 }
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 49
diff changeset
899 override void toDocBuffer(OutBuffer buf)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
900 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
901 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
902 }
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 169
diff changeset
903
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 49
diff changeset
904 override PROT getAccess(Dsymbol smember) // determine access to smember
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
905 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
906 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
907 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
908
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 49
diff changeset
909 override void toObjFile(int multiobj) // compile to .obj file
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
910 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
911 //printf("StructDeclaration.toObjFile('%s')\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
912
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
913 if (multiobj)
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 169
diff changeset
914 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
915 obj_append(this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
916 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
917 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
918
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
919 // Anonymous structs/unions only exist as part of others,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
920 // do not output forward referenced structs's
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
921 if (!isAnonymous() && members)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
922 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
923 if (global.params.symdebug) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
924 toDebug();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
925 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
926
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
927 type.getTypeInfo(null); // generate TypeInfo
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
928
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
929 if (true)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
930 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
931 // Generate static initializer
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
932 toInitializer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
933
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
934 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
935 sinit.Sclass = SC.SCcomdat;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
936 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
937 if (inTemplateInstance())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
938 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
939 sinit.Sclass = SC.SCcomdat;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
940 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
941 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
942 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
943 sinit.Sclass = SC.SCglobal;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
944 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
945 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
946 sinit.Sfl = FL.FLdata;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
947
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
948 toDt(&sinit.Sdt);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
949
95
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 89
diff changeset
950 version (OMFOBJ)
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 89
diff changeset
951 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
952 /* For OMF, common blocks aren't pulled in from the library.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
953 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
954 /* ELF comdef's generate multiple
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
955 * definition errors for them from the gnu linker.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
956 * Need to figure out how to generate proper comdef's for ELF.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
957 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
958 // See if we can convert a comdat to a comdef,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
959 // which saves on exe file space.
95
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 89
diff changeset
960 if (0 && // causes multiple def problems with COMMON in one file and COMDAT in library
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 89
diff changeset
961 sinit.Sclass == SCcomdat &&
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
962 sinit.Sdt &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
963 sinit.Sdt.dt == DT.DT_azeros &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
964 sinit.Sdt.DTnext == null &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
965 !global.params.multiobj)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
966 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
967 sinit.Sclass = SC.SCglobal;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
968 sinit.Sdt.dt = DT.DT_common;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
969 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
970 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
971
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
972 version (ELFOBJ) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
973 sinit.Sseg = Segment.CDATA;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
974 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
975 version (MACHOBJ) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
976 sinit.Sseg = Segment.DATA;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
977 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
978 outdata(sinit);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
979 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
980
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
981 // Put out the members
77
ad4792a1cfd6 more D-ification container accessing
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 74
diff changeset
982 foreach(Dsymbol member; members)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
983 member.toObjFile(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
984 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
985 }
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 169
diff changeset
986
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
987 void toDt(dt_t** pdt)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
988 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
989 uint offset;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
990 dt_t* dt;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
991
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
992 //printf("StructDeclaration.toDt(), this='%s'\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
993 offset = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
994
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
995 // Note equivalence of this loop to class's
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
996 for (uint i = 0; i < fields.dim; i++)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
997 {
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
998 VarDeclaration v = cast(VarDeclaration)fields[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
999 //printf("\tfield '%s' voffset %d, offset = %d\n", v.toChars(), v.offset, offset);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1000 dt = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1001 int sz;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1002
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1003 if (v.storage_class & STC.STCref)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1004 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1005 sz = PTRSIZE;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1006 if (v.offset >= offset)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1007 dtnzeros(&dt, sz);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1008 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1009 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1010 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1011 sz = cast(uint)v.type.size();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1012 Initializer init = v.init;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1013 if (init)
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 169
diff changeset
1014 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1015 //printf("\t\thas initializer %s\n", init.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1016 ExpInitializer ei = init.isExpInitializer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1017 Type tb = v.type.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1018 if (ei && tb.ty == TY.Tsarray)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1019 (cast(TypeSArray)tb).toDtElem(&dt, ei.exp);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1020 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1021 dt = init.toDt();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1022 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1023 else if (v.offset >= offset)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1024 v.type.toDt(&dt);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1025 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1026 if (dt)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1027 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1028 if (v.offset < offset)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1029 error("overlapping initialization for struct %s.%s", toChars(), v.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1030 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1031 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1032 if (offset < v.offset)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1033 dtnzeros(pdt, v.offset - offset);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1034 dtcat(pdt, dt);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1035 offset = v.offset + sz;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1036 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1037 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1038 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1039
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1040 if (offset < structsize)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1041 dtnzeros(pdt, structsize - offset);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1042
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1043 dt_optimize(*pdt);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1044 }
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 169
diff changeset
1045
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1046 void toDebug() // to symbolic debug info
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1047 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1048 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1049 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1050
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 49
diff changeset
1051 override StructDeclaration isStructDeclaration() { return this; }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 49
diff changeset
1052 }