annotate dmd/InterfaceDeclaration.d @ 178:e3afd1303184

Many small bugs fixed Made all classes derive from TObject to detect memory leaks (functionality is disabled for now) Began work on overriding backend memory allocations (to avoid memory leaks)
author korDen
date Sun, 17 Oct 2010 07:42:00 +0400
parents fa9a71a9f5a8
children b0d41ff5e0df
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1 module dmd.InterfaceDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 89
diff changeset
3 import dmd.common;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4 import dmd.ClassDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5 import dmd.Loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6 import dmd.DsymbolTable;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
7 import dmd.STC;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
8 import dmd.Type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
9 import dmd.TY;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
10 import dmd.LINK;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 125
diff changeset
11 import dmd.Parameter;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
12 import dmd.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
13 import dmd.TypeTuple;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
14 import dmd.PROT;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
15 import dmd.TypeClass;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
16 import dmd.Identifier;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
17 import dmd.ArrayTypes;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
18 import dmd.Dsymbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
19 import dmd.Scope;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
20 import dmd.Global;
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
21 import dmd.Module;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
22 import dmd.BaseClass;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
23 import dmd.Id;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
24
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
25 import dmd.backend.Symbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
26 import dmd.backend.TYM;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
27 import dmd.backend.dt_t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
28 import dmd.backend.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
29 import dmd.codegen.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30 import dmd.backend.SC;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
31 import dmd.backend.FL;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
32 import dmd.backend.LIST;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
33 import dmd.backend.SFL;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
34
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
35 class InterfaceDeclaration : ClassDeclaration
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
36 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
37 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
38 bool cpp; // true if this is a C++ interface
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
39 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
40 this(Loc loc, Identifier id, BaseClasses baseclasses)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
41 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 176
diff changeset
42 register();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
43 super(loc, id, baseclasses);
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 166
diff changeset
44
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
45 if (id is Id.IUnknown) // IUnknown is the root of all COM interfaces
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
46 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
47 com = true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
48 cpp = true; // IUnknown is also a C++ interface
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
49 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
50 }
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 166
diff changeset
51
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
52 override Dsymbol syntaxCopy(Dsymbol s)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
53 {
123
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
54 InterfaceDeclaration id;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
55
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
56 if (s)
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
57 id = cast(InterfaceDeclaration)s;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
58 else
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
59 id = new InterfaceDeclaration(loc, ident, null);
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
60
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
61 ClassDeclaration.syntaxCopy(id);
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
62 return id;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
63 }
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 166
diff changeset
64
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
65 override void semantic(Scope sc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
66 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
67 //printf("InterfaceDeclaration.semantic(%s), type = %p\n", toChars(), type);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
68 if (inuse)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
69 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
70
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
71 if (!sc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
72 sc = scope_;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
73 if (!parent && sc.parent && !sc.parent.isModule())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
74 parent = sc.parent;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
75
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
76 type = type.semantic(loc, sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
77 handle = type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
78
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
79 if (!members) // if forward reference
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 166
diff changeset
80 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
81 //printf("\tinterface '%s' is forward referenced\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
82 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
83 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
84 if (symtab) // if already done
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 166
diff changeset
85 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
86 if (!scope_)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
87 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
88 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
89 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
90 symtab = new DsymbolTable();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
91
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
92 Scope scx = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
93 if (scope_)
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 166
diff changeset
94 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
95 sc = scope_;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
96 scx = scope_; // save so we don't make redundant copies
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
97 scope_ = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
98 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
99
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
100 if (sc.stc & STC.STCdeprecated)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
101 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
102 isdeprecated = true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
103 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
104
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
105 // Expand any tuples in baseclasses[]
89
37b95c347975 Fixed an obscure bug with i variable being reused
korDen
parents: 87
diff changeset
106 for (size_t i = 0; i < baseclasses.dim; )
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 166
diff changeset
107 {
125
767a01c2a272 BaseClasses -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 123
diff changeset
108 auto b = baseclasses[0];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
109 b.type = b.type.semantic(loc, sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
110 Type tb = b.type.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
111
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
112 if (tb.ty == TY.Ttuple)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
113 { TypeTuple tup = cast(TypeTuple)tb;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
114 PROT protection = b.protection;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
115 baseclasses.remove(i);
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 125
diff changeset
116 size_t dim = Parameter.dim(tup.arguments);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
117 for (size_t j = 0; j < dim; j++)
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 125
diff changeset
118 { auto arg = Parameter.getNth(tup.arguments, j);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
119 b = new BaseClass(arg.type, protection);
125
767a01c2a272 BaseClasses -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 123
diff changeset
120 baseclasses.insert(i + j, b);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
121 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
122 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
123 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
124 i++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
125 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
126
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
127 if (!baseclasses.dim && sc.linkage == LINK.LINKcpp)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
128 cpp = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
129
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
130 // Check for errors, handle forward references
89
37b95c347975 Fixed an obscure bug with i variable being reused
korDen
parents: 87
diff changeset
131 for (size_t i = 0; i < baseclasses.dim; )
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 166
diff changeset
132 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
133 TypeClass tc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
134 BaseClass b;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
135 Type tb;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
136
125
767a01c2a272 BaseClasses -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 123
diff changeset
137 b = baseclasses[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
138 b.type = b.type.semantic(loc, sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
139 tb = b.type.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
140 if (tb.ty == TY.Tclass)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
141 tc = cast(TypeClass)tb;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
142 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
143 tc = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
144 if (!tc || !tc.sym.isInterfaceDeclaration())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
145 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
146 error("base type must be interface, not %s", b.type.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
147 baseclasses.remove(i);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
148 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
149 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
150 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
151 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
152 // Check for duplicate interfaces
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
153 for (size_t j = 0; j < i; j++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
154 {
125
767a01c2a272 BaseClasses -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 123
diff changeset
155 auto b2 = baseclasses[j];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
156 if (b2.base is tc.sym)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
157 error("inherits from duplicate interface %s", b2.base.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
158 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
159
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
160 b.base = tc.sym;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
161 if (b.base == this || isBaseOf2(b.base))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
162 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
163 error("circular inheritance of interface");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
164 baseclasses.remove(i);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
165 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
166 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
167 if (!b.base.symtab)
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 166
diff changeset
168 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
169 // Try to resolve forward reference
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
170 if (sc.mustsemantic && b.base.scope_)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
171 b.base.semantic(null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
172 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
173 if (!b.base.symtab || b.base.scope_ || b.base.inuse)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
174 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
175 //error("forward reference of base class %s", baseClass.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
176 // Forward reference of base, try again later
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
177 //printf("\ttry later, forward reference of base %s\n", b.base.toChars());
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: 77
diff changeset
178 scope_ = scx ? scx : sc.clone();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
179 scope_.setNoFree();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
180 scope_.module_.addDeferredSemantic(this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
181 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
182 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
183 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
184 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
185 // Inherit const/invariant from base class
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
186 storage_class |= b.base.storage_class & STC.STC_TYPECTOR;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
187 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
188 i++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
189 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
190
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
191 interfaces_dim = baseclasses.dim;
125
767a01c2a272 BaseClasses -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 123
diff changeset
192 interfaces = baseclasses.ptr;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
193
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
194 interfaceSemantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
195
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
196 if (vtblOffset())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
197 vtbl.push(cast(void*)this); // leave room at vtbl[0] for classinfo
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
198
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
199 // Cat together the vtbl[]'s from base interfaces
89
37b95c347975 Fixed an obscure bug with i variable being reused
korDen
parents: 87
diff changeset
200 for (size_t i = 0; i < interfaces_dim; i++)
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 166
diff changeset
201 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
202 BaseClass b = interfaces[i];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
203
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
204 // Skip if b has already appeared
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
205 for (int k = 0; k < i; k++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
206 {
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 125
diff changeset
207 if (b == interfaces[k])
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
208 goto Lcontinue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
209 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
210
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
211 // Copy vtbl[] from base class
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
212 if (b.base.vtblOffset())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
213 { int d = b.base.vtbl.dim;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
214 if (d > 1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
215 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
216 vtbl.reserve(d - 1);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
217 for (int j = 1; j < d; j++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
218 vtbl.push(b.base.vtbl.data[j]);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
219 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
220 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
221 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
222 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
223 vtbl.append(b.base.vtbl);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
224 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
225
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
226 Lcontinue:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
227 ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
228 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
229
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
230 protection = sc.protection;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
231 storage_class |= sc.stc & STC.STC_TYPECTOR;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
232
77
ad4792a1cfd6 more D-ification container accessing
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
233 foreach(Dsymbol s; members)
13
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 0
diff changeset
234 s.addMember(sc, this, true);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
235
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
236 sc = sc.push(this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
237 sc.stc &= ~(STC.STCfinal | STC.STCauto | STC.STCscope | STC.STCstatic |
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
238 STC.STCabstract | STC.STCdeprecated | STC.STC_TYPECTOR | STC.STCtls | STC.STCgshared);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
239 sc.stc |= storage_class & STC.STC_TYPECTOR;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
240 sc.parent = this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
241 if (isCOMinterface())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
242 sc.linkage = LINK.LINKwindows;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
243 else if (isCPPinterface())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
244 sc.linkage = LINK.LINKcpp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
245 sc.structalign = 8;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
246 structalign = sc.structalign;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
247 sc.offset = PTRSIZE * 2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
248 inuse++;
77
ad4792a1cfd6 more D-ification container accessing
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
249 foreach(Dsymbol s; members)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
250 s.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
251 inuse--;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
252 //members.print();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
253 sc.pop();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
254 //printf("-InterfaceDeclaration.semantic(%s), type = %p\n", toChars(), type);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
255 }
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 166
diff changeset
256
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
257 override bool isBaseOf(ClassDeclaration cd, int* poffset)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
258 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
259 uint j;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
260
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
261 //printf("%s.InterfaceDeclaration.isBaseOf(cd = '%s')\n", toChars(), cd.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
262 assert(!baseClass);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
263 for (j = 0; j < cd.interfaces_dim; j++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
264 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
265 BaseClass b = cd.interfaces[j];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
266
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
267 //printf("\tbase %s\n", b.base.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
268 if (this == b.base)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
269 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
270 //printf("\tfound at offset %d\n", b.offset);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
271 if (poffset)
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 166
diff changeset
272 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
273 *poffset = b.offset;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
274 if (j && cd.isInterfaceDeclaration())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
275 *poffset = OFFSET_RUNTIME;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
276 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
277 return true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
278 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
279 if (isBaseOf(b, poffset))
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 166
diff changeset
280 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
281 if (j && poffset && cd.isInterfaceDeclaration())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
282 *poffset = OFFSET_RUNTIME;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
283 return true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
284 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
285 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
286
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
287 if (cd.baseClass && isBaseOf(cd.baseClass, poffset))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
288 return true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
289
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
290 if (poffset)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
291 *poffset = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
292 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
293 }
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 166
diff changeset
294
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
295 bool isBaseOf(BaseClass bc, int* poffset)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
296 {
64
4290d870944a More fixes
korDen
parents: 23
diff changeset
297 //printf("%s.InterfaceDeclaration.isBaseOf(bc = '%s')\n", toChars(), bc.base.toChars());
4290d870944a More fixes
korDen
parents: 23
diff changeset
298 for (uint j = 0; j < bc.baseInterfaces.length; j++)
4290d870944a More fixes
korDen
parents: 23
diff changeset
299 {
4290d870944a More fixes
korDen
parents: 23
diff changeset
300 BaseClass b = bc.baseInterfaces[j];
4290d870944a More fixes
korDen
parents: 23
diff changeset
301
4290d870944a More fixes
korDen
parents: 23
diff changeset
302 if (this == b.base)
4290d870944a More fixes
korDen
parents: 23
diff changeset
303 {
4290d870944a More fixes
korDen
parents: 23
diff changeset
304 if (poffset)
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 166
diff changeset
305 {
64
4290d870944a More fixes
korDen
parents: 23
diff changeset
306 *poffset = b.offset;
4290d870944a More fixes
korDen
parents: 23
diff changeset
307 if (j && bc.base.isInterfaceDeclaration())
4290d870944a More fixes
korDen
parents: 23
diff changeset
308 *poffset = OFFSET_RUNTIME;
4290d870944a More fixes
korDen
parents: 23
diff changeset
309 }
166
d8565fbd755c Moved object and classinfo from ClassDeclaration to Global (as part of getting rid of the global state)
korDen
parents: 130
diff changeset
310 return true;
64
4290d870944a More fixes
korDen
parents: 23
diff changeset
311 }
4290d870944a More fixes
korDen
parents: 23
diff changeset
312 if (isBaseOf(b, poffset))
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 166
diff changeset
313 {
64
4290d870944a More fixes
korDen
parents: 23
diff changeset
314 if (j && poffset && bc.base.isInterfaceDeclaration())
4290d870944a More fixes
korDen
parents: 23
diff changeset
315 *poffset = OFFSET_RUNTIME;
166
d8565fbd755c Moved object and classinfo from ClassDeclaration to Global (as part of getting rid of the global state)
korDen
parents: 130
diff changeset
316 return true;
64
4290d870944a More fixes
korDen
parents: 23
diff changeset
317 }
4290d870944a More fixes
korDen
parents: 23
diff changeset
318 }
4290d870944a More fixes
korDen
parents: 23
diff changeset
319 if (poffset)
4290d870944a More fixes
korDen
parents: 23
diff changeset
320 *poffset = 0;
166
d8565fbd755c Moved object and classinfo from ClassDeclaration to Global (as part of getting rid of the global state)
korDen
parents: 130
diff changeset
321 return false;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
322 }
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 166
diff changeset
323
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
324 override string kind()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
325 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
326 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
327 }
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 166
diff changeset
328
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
329 /****************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
330 * Determine if slot 0 of the vtbl[] is reserved for something else.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
331 * For class objects, yes, this is where the ClassInfo ptr goes.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
332 * For COM interfaces, no.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
333 * For non-COM interfaces, yes, this is where the Interface ptr goes.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
334 */
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
335 override int vtblOffset()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
336 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
337 if (isCOMinterface() || isCPPinterface())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
338 return 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
339 return 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
340 }
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 166
diff changeset
341
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
342 version (DMDV2) {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
343 override bool isCPPinterface()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
344 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
345 return cpp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
346 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
347 }
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
348 override bool isCOMinterface()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
349 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
350 return com;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
351 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
352
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
353 override void toObjFile(int multiobj) // compile to .obj file
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
354 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
355 uint offset;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
356 Symbol* sinit;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
357 SC scclass;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
358
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
359 //printf("InterfaceDeclaration.toObjFile('%s')\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
360
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
361 if (!members)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
362 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
363
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
364 if (global.params.symdebug)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
365 toDebug();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
366
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
367 scclass = SCglobal;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
368 if (inTemplateInstance())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
369 scclass = SCcomdat;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
370
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
371 // Put out the members
77
ad4792a1cfd6 more D-ification container accessing
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
372 foreach(Dsymbol member; members)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
373 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
374 if (!member.isFuncDeclaration())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
375 member.toObjFile(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
376 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
377
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
378 // Generate C symbols
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
379 toSymbol();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
380
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
381 //////////////////////////////////////////////
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
382
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
383 // Put out the TypeInfo
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
384 type.getTypeInfo(null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
385 type.vtinfo.toObjFile(multiobj);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
386
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
387 //////////////////////////////////////////////
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
388
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
389 // Put out the ClassInfo
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
390 csym.Sclass = scclass;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
391 csym.Sfl = FLdata;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
392
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
393 /* The layout is:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
394 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
395 void **vptr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
396 monitor_t monitor;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
397 byte[] initializer; // static initialization data
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
398 char[] name; // class name
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
399 void *[] vtbl;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
400 Interface[] interfaces;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
401 Object *base; // base class
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
402 void *destructor;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
403 void *invariant; // class invariant
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
404 uint flags;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
405 void *deallocator;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
406 OffsetTypeInfo[] offTi;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
407 void *defaultConstructor;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
408 #if DMDV2
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
409 const(MemberInfo[]) function(string) xgetMembers; // module getMembers() function
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
410 #endif
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 125
diff changeset
411 //TypeInfo typeinfo;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
412 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
413 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
414 dt_t *dt = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
415
166
d8565fbd755c Moved object and classinfo from ClassDeclaration to Global (as part of getting rid of the global state)
korDen
parents: 130
diff changeset
416 if (global.classinfo)
d8565fbd755c Moved object and classinfo from ClassDeclaration to Global (as part of getting rid of the global state)
korDen
parents: 130
diff changeset
417 dtxoff(&dt, global.classinfo.toVtblSymbol(), 0, TYnptr); // vtbl for ClassInfo
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
418 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
419 dtdword(&dt, 0); // BUG: should be an assert()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
420 dtdword(&dt, 0); // monitor
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
421
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
422 // initializer[]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
423 dtdword(&dt, 0); // size
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
424 dtdword(&dt, 0); // initializer
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
425
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
426 // name[]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
427 string name = toPrettyChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
428 size_t namelen = name.length;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
429 dtdword(&dt, namelen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
430 dtabytes(&dt, TYnptr, 0, namelen + 1, toStringz(name));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
431
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
432 // vtbl[]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
433 dtdword(&dt, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
434 dtdword(&dt, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
435
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
436 // vtblInterfaces.data[]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
437 dtdword(&dt, vtblInterfaces.dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
438 if (vtblInterfaces.dim)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
439 {
166
d8565fbd755c Moved object and classinfo from ClassDeclaration to Global (as part of getting rid of the global state)
korDen
parents: 130
diff changeset
440 if (global.classinfo)
d8565fbd755c Moved object and classinfo from ClassDeclaration to Global (as part of getting rid of the global state)
korDen
parents: 130
diff changeset
441 assert(global.classinfo.structsize == CLASSINFO_SIZE);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
442 offset = CLASSINFO_SIZE;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
443 dtxoff(&dt, csym, offset, TYnptr); // (*)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
444 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
445 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
446 dtdword(&dt, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
447
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
448 // base
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
449 assert(!baseClass);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
450 dtdword(&dt, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
451
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
452 // dtor
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
453 dtdword(&dt, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
454
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
455 // invariant
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
456 dtdword(&dt, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
457
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
458 // flags
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
459 dtdword(&dt, 4 | isCOMinterface() | 32);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
460
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
461 // deallocator
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
462 dtdword(&dt, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
463
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
464 // offTi[]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
465 dtdword(&dt, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
466 dtdword(&dt, 0); // null for now, fix later
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
467
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
468 // defaultConstructor
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
469 dtdword(&dt, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
470
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
471 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
472 // xgetMembers
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
473 dtdword(&dt, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
474 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
475
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 125
diff changeset
476 //dtxoff(&dt, type.vtinfo.toSymbol(), 0, TYnptr); // typeinfo
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
477
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
478 //////////////////////////////////////////////
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
479
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
480 // Put out vtblInterfaces.data[]. Must immediately follow csym, because
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
481 // of the fixup (*)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
482
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
483 offset += vtblInterfaces.dim * (4 * PTRSIZE);
125
767a01c2a272 BaseClasses -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 123
diff changeset
484 foreach (b; vtblInterfaces)
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 166
diff changeset
485 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
486 ClassDeclaration id = b.base;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
487
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
488 // ClassInfo
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
489 dtxoff(&dt, id.toSymbol(), 0, TYnptr);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
490
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
491 // vtbl[]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
492 dtdword(&dt, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
493 dtdword(&dt, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
494
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
495 // this offset
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
496 dtdword(&dt, b.offset);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
497 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
498
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
499 csym.Sdt = dt;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
500 version (ELFOBJ) {
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
501 csym.Sseg = Segment.CDATA;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
502 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
503 version (MACHOBJ) {
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
504 csym.Sseg = Segment.DATA;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
505 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
506 outdata(csym);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
507 if (isExport())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
508 obj_export(csym,0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
509 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
510
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
511 /*************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
512 * Create the "InterfaceInfo" symbol
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
513 */
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
514 override Symbol* toSymbol()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
515 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
516 if (!csym)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
517 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
518 Symbol *s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
519
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 166
diff changeset
520 s = toSymbolX("__Interface", SCextern, global.scc.Stype, "Z");
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
521 s.Sfl = FLextern;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
522 s.Sflags |= SFLnodebug;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
523 csym = s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
524 slist_add(s);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
525 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
526 return csym;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
527 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
528
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
529 override InterfaceDeclaration isInterfaceDeclaration() { return this; }
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
530 }