annotate dmd/AnonDeclaration.d @ 0:10317f0c89a5

Initial commit
author korDen
date Sat, 24 Oct 2009 08:42:06 +0400
parents
children a8b50ff7f201
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1 module dmd.AnonDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3 import dmd.OutBuffer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4 import dmd.Loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5 import dmd.Scope;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6 import dmd.Array;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
7 import dmd.AttribDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
8 import dmd.HdrGenState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
9 import dmd.Dsymbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
10 import dmd.AggregateDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
11 import dmd.AnonymousAggregateDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
12 import dmd.STC;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
13 import dmd.Module;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
14 import dmd.VarDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
15
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
16 class AnonDeclaration : AttribDeclaration
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
17 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
18 int isunion;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
19 int sem = 0; // 1 if successful semantic()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
20
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
21 this(Loc loc, int isunion, Array decl)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
22 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
23 super(decl);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
24 this.loc = loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
25 this.isunion = isunion;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
26 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
27
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
28 Dsymbol syntaxCopy(Dsymbol s)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
29 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
31 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
32
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
33 void semantic(Scope sc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
34 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
35 //printf("\tAnonDeclaration::semantic %s %p\n", isunion ? "union" : "struct", this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
36
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
37 Scope scx = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
38 if (scope_)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
39 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
40 sc = scope_;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
41 scx = scope_;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
42 scope_ = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
43 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
44
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
45 assert(sc.parent);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
46
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
47 Dsymbol parent = sc.parent.pastMixin();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
48 AggregateDeclaration ad = parent.isAggregateDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
49
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
50 if (!ad || (!ad.isStructDeclaration() && !ad.isClassDeclaration()))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
51 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
52 error("can only be a part of an aggregate");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
53 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
54 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
55
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
56 if (decl)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
57 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
58 AnonymousAggregateDeclaration aad = new AnonymousAggregateDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
59 int adisunion;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
60
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
61 if (sc.anonAgg)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
62 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
63 ad = sc.anonAgg;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
64 adisunion = sc.inunion;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
65 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
66 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
67 adisunion = ad.isUnionDeclaration() !is null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
68
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
69 // printf("\tsc.anonAgg = %p\n", sc.anonAgg);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
70 // printf("\tad = %p\n", ad);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
71 // printf("\taad = %p\n", &aad);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
72
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
73 sc = sc.push();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
74 sc.anonAgg = aad;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
75 sc.stc &= ~(STCauto | STCscope | STCstatic | STCtls | STCgshared);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
76 sc.inunion = isunion;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
77 sc.offset = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
78 sc.flags = cast(SCOPE)0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
79 aad.structalign = sc.structalign;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
80 aad.parent = ad;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
81
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
82 for (uint i = 0; i < decl.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
83 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
84 Dsymbol s = cast(Dsymbol)decl.data[i];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
85
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
86 s.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
87 if (isunion)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
88 sc.offset = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
89 if (aad.sizeok == 2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
90 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
91 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
92 sc = sc.pop();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
93
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
94 // If failed due to forward references, unwind and try again later
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
95 if (aad.sizeok == 2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
96 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
97 ad.sizeok = 2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
98 //printf("\tsetting ad.sizeok %p to 2\n", ad);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
99 if (!sc.anonAgg)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
100 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
101 scope_ = scx ? scx : new Scope(sc); ///<
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
102 scope_.setNoFree();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
103 scope_.module_.addDeferredSemantic(this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
104 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
105 //printf("\tforward reference %p\n", this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
106 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
107 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
108 if (sem == 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
109 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
110 Module.dprogress++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
111 sem = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
112 //printf("\tcompleted %p\n", this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
113 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
114 else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
115 ;//printf("\talready completed %p\n", this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
116 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
117
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
118 // 0 sized structs are set to 1 byte
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
119 if (aad.structsize == 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
120 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
121 aad.structsize = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
122 aad.alignsize = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
123 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
124
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
125 // Align size of anonymous aggregate
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
126 //printf("aad.structalign = %d, aad.alignsize = %d, sc.offset = %d\n", aad.structalign, aad.alignsize, sc.offset);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
127 ad.alignmember(aad.structalign, aad.alignsize, &sc.offset);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
128 //ad.structsize = sc.offset;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
129 //printf("sc.offset = %d\n", sc.offset);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
130
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
131 // Add members of aad to ad
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
132 //printf("\tadding members of aad to '%s'\n", ad.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
133 for (uint i = 0; i < aad.fields.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
134 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
135 VarDeclaration v = cast(VarDeclaration)aad.fields.data[i];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
136
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
137 v.offset += sc.offset;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
138 ad.fields.push(cast(void*)v);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
139 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
140
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
141 // Add size of aad to ad
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
142 if (adisunion)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
143 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
144 if (aad.structsize > ad.structsize)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
145 ad.structsize = aad.structsize;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
146 sc.offset = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
147 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
148 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
149 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
150 ad.structsize = sc.offset + aad.structsize;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
151 sc.offset = ad.structsize;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
152 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
153
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
154 if (ad.alignsize < aad.alignsize)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
155 ad.alignsize = aad.alignsize;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
156 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
157 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
158
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
159 void toCBuffer(OutBuffer buf, HdrGenState* hgs)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
160 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
161 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
162 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
163
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
164 string kind()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
165 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
166 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
167 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
168 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
169