Mercurial > projects > ldc
annotate dmd2/class.c @ 1650:40bd4a0d4870
Update to work with LLVM 2.7.
Removed use of dyn_cast, llvm no compiles
without exceptions and rtti by
default. We do need exceptions for the libconfig stuff, but rtti isn't
necessary (anymore).
Debug info needs to be rewritten, as in LLVM 2.7 the format has
completely changed. To have something to look at while rewriting, the
old code has been wrapped inside #ifndef DISABLE_DEBUG_INFO , this means
that you have to define this to compile at the moment.
Updated tango 0.99.9 patch to include updated EH runtime code, which is
needed for LLVM 2.7 as well.
author | Tomas Lindquist Olsen |
---|---|
date | Wed, 19 May 2010 12:42:32 +0200 |
parents | e4f7b5d9c68a |
children |
rev | line source |
---|---|
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
2 // Compiler implementation of the D programming language |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3 // Copyright (c) 1999-2009 by Digital Mars |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
4 // All Rights Reserved |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
5 // written by Walter Bright |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
6 // http://www.digitalmars.com |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
7 // License for redistribution is by either the Artistic License |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
8 // in artistic.txt, or the GNU General Public License in gnu.txt. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
9 // See the included readme.txt for details. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
10 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
11 #include <stdio.h> |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
12 #include <stdlib.h> |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
13 #include <assert.h> |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
14 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
15 #include "root.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
16 #include "rmem.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
17 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
18 #include "enum.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
19 #include "init.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
20 #include "attrib.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
21 #include "declaration.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
22 #include "aggregate.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
23 #include "id.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
24 #include "mtype.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
25 #include "scope.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
26 #include "module.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
27 #include "expression.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
28 #include "statement.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
29 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
30 /********************************* ClassDeclaration ****************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
31 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
32 ClassDeclaration *ClassDeclaration::classinfo; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
33 ClassDeclaration *ClassDeclaration::object; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
34 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
35 ClassDeclaration::ClassDeclaration(Loc loc, Identifier *id, BaseClasses *baseclasses) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
36 : AggregateDeclaration(loc, id) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
37 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
38 static char msg[] = "only object.d can define this reserved class name"; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
39 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
40 if (baseclasses) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
41 this->baseclasses = *baseclasses; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
42 baseClass = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
43 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
44 interfaces_dim = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
45 interfaces = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
46 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
47 vtblInterfaces = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
48 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
49 //printf("ClassDeclaration(%s), dim = %d\n", id->toChars(), this->baseclasses.dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
50 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
51 // For forward references |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
52 type = new TypeClass(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
53 handle = type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
54 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
55 staticCtor = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
56 staticDtor = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
57 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
58 #if IN_DMD |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
59 vtblsym = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
60 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
61 vclassinfo = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
62 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
63 if (id) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
64 { // Look for special class names |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
65 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
66 if (id == Id::__sizeof || id == Id::alignof || id == Id::mangleof) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
67 error("illegal class name"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
68 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
69 // BUG: What if this is the wrong TypeInfo, i.e. it is nested? |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
70 if (id->toChars()[0] == 'T') |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
71 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
72 if (id == Id::TypeInfo) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
73 { if (Type::typeinfo) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
74 Type::typeinfo->error("%s", msg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
75 Type::typeinfo = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
76 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
77 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
78 if (id == Id::TypeInfo_Class) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
79 { if (Type::typeinfoclass) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
80 Type::typeinfoclass->error("%s", msg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
81 Type::typeinfoclass = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
82 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
83 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
84 if (id == Id::TypeInfo_Interface) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
85 { if (Type::typeinfointerface) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
86 Type::typeinfointerface->error("%s", msg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
87 Type::typeinfointerface = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
88 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
89 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
90 if (id == Id::TypeInfo_Struct) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
91 { if (Type::typeinfostruct) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
92 Type::typeinfostruct->error("%s", msg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
93 Type::typeinfostruct = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
94 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
95 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
96 if (id == Id::TypeInfo_Typedef) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
97 { if (Type::typeinfotypedef) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
98 Type::typeinfotypedef->error("%s", msg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
99 Type::typeinfotypedef = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
100 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
101 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
102 if (id == Id::TypeInfo_Pointer) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
103 { if (Type::typeinfopointer) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
104 Type::typeinfopointer->error("%s", msg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
105 Type::typeinfopointer = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
106 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
107 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
108 if (id == Id::TypeInfo_Array) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
109 { if (Type::typeinfoarray) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
110 Type::typeinfoarray->error("%s", msg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
111 Type::typeinfoarray = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
112 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
113 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
114 if (id == Id::TypeInfo_StaticArray) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
115 { //if (Type::typeinfostaticarray) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
116 //Type::typeinfostaticarray->error("%s", msg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
117 Type::typeinfostaticarray = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
118 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
119 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
120 if (id == Id::TypeInfo_AssociativeArray) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
121 { if (Type::typeinfoassociativearray) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
122 Type::typeinfoassociativearray->error("%s", msg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
123 Type::typeinfoassociativearray = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
124 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
125 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
126 if (id == Id::TypeInfo_Enum) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
127 { if (Type::typeinfoenum) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
128 Type::typeinfoenum->error("%s", msg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
129 Type::typeinfoenum = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
130 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
131 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
132 if (id == Id::TypeInfo_Function) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
133 { if (Type::typeinfofunction) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
134 Type::typeinfofunction->error("%s", msg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
135 Type::typeinfofunction = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
136 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
137 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
138 if (id == Id::TypeInfo_Delegate) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
139 { if (Type::typeinfodelegate) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
140 Type::typeinfodelegate->error("%s", msg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
141 Type::typeinfodelegate = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
142 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
143 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
144 if (id == Id::TypeInfo_Tuple) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
145 { if (Type::typeinfotypelist) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
146 Type::typeinfotypelist->error("%s", msg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
147 Type::typeinfotypelist = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
148 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
149 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
150 #if DMDV2 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
151 if (id == Id::TypeInfo_Const) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
152 { if (Type::typeinfoconst) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
153 Type::typeinfoconst->error("%s", msg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
154 Type::typeinfoconst = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
155 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
156 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
157 if (id == Id::TypeInfo_Invariant) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
158 { if (Type::typeinfoinvariant) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
159 Type::typeinfoinvariant->error("%s", msg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
160 Type::typeinfoinvariant = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
161 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
162 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
163 if (id == Id::TypeInfo_Shared) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
164 { if (Type::typeinfoshared) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
165 Type::typeinfoshared->error("%s", msg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
166 Type::typeinfoshared = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
167 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
168 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
169 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
170 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
171 if (id == Id::Object) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
172 { if (object) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
173 object->error("%s", msg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
174 object = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
175 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
176 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
177 if (id == Id::ClassInfo) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
178 { if (classinfo) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
179 classinfo->error("%s", msg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
180 classinfo = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
181 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
182 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
183 if (id == Id::ModuleInfo) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
184 { if (Module::moduleinfo) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
185 Module::moduleinfo->error("%s", msg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
186 Module::moduleinfo = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
187 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
188 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
189 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
190 com = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
191 isauto = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
192 isabstract = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
193 inuse = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
194 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
195 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
196 Dsymbol *ClassDeclaration::syntaxCopy(Dsymbol *s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
197 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
198 ClassDeclaration *cd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
199 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
200 //printf("ClassDeclaration::syntaxCopy('%s')\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
201 if (s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
202 cd = (ClassDeclaration *)s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
203 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
204 cd = new ClassDeclaration(loc, ident, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
205 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
206 cd->storage_class |= storage_class; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
207 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
208 cd->baseclasses.setDim(this->baseclasses.dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
209 for (int i = 0; i < cd->baseclasses.dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
210 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
211 BaseClass *b = (BaseClass *)this->baseclasses.data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
212 BaseClass *b2 = new BaseClass(b->type->syntaxCopy(), b->protection); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
213 cd->baseclasses.data[i] = b2; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
214 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
215 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
216 ScopeDsymbol::syntaxCopy(cd); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
217 return cd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
218 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
219 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
220 void ClassDeclaration::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
221 { int i; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
222 unsigned offset; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
223 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
224 //printf("ClassDeclaration::semantic(%s), type = %p, sizeok = %d, this = %p\n", toChars(), type, sizeok, this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
225 //printf("\tparent = %p, '%s'\n", sc->parent, sc->parent ? sc->parent->toChars() : ""); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
226 //printf("sc->stc = %x\n", sc->stc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
227 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
228 //{ static int n; if (++n == 20) *(char*)0=0; } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
229 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
230 if (!ident) // if anonymous class |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
231 { const char *id = "__anonclass"; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
232 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
233 ident = Identifier::generateId(id); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
234 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
235 |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
236 if (!sc) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
237 sc = scope; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
238 if (!parent && sc->parent && !sc->parent->isModule()) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
239 parent = sc->parent; |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
240 |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
241 type = type->semantic(loc, sc); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
242 handle = type; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
243 |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
244 if (!members) // if forward reference |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
245 { //printf("\tclass '%s' is forward referenced\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
246 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
247 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
248 if (symtab) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
249 { if (!scope) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
250 { //printf("\tsemantic for '%s' is already completed\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
251 return; // semantic() already completed |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
252 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
253 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
254 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
255 symtab = new DsymbolTable(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
256 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
257 Scope *scx = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
258 if (scope) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
259 { sc = scope; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
260 scx = scope; // save so we don't make redundant copies |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
261 scope = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
262 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
263 #ifdef IN_GCC |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
264 methods.setDim(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
265 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
266 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
267 if (sc->stc & STCdeprecated) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
268 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
269 isdeprecated = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
270 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
271 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
272 if (sc->linkage == LINKcpp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
273 error("cannot create C++ classes"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
274 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
275 // Expand any tuples in baseclasses[] |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
276 for (i = 0; i < baseclasses.dim; ) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
277 { BaseClass *b = (BaseClass *)baseclasses.data[i]; |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
278 //printf("test1 %s %s\n", toChars(), b->type->toChars()); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
279 b->type = b->type->semantic(loc, sc); |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
280 //printf("test2\n"); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
281 Type *tb = b->type->toBasetype(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
282 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
283 if (tb->ty == Ttuple) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
284 { TypeTuple *tup = (TypeTuple *)tb; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
285 enum PROT protection = b->protection; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
286 baseclasses.remove(i); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
287 size_t dim = Argument::dim(tup->arguments); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
288 for (size_t j = 0; j < dim; j++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
289 { Argument *arg = Argument::getNth(tup->arguments, j); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
290 b = new BaseClass(arg->type, protection); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
291 baseclasses.insert(i + j, b); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
292 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
293 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
294 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
295 i++; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
296 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
297 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
298 // See if there's a base class as first in baseclasses[] |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
299 if (baseclasses.dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
300 { TypeClass *tc; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
301 BaseClass *b; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
302 Type *tb; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
303 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
304 b = (BaseClass *)baseclasses.data[0]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
305 //b->type = b->type->semantic(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
306 tb = b->type->toBasetype(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
307 if (tb->ty != Tclass) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
308 { error("base type must be class or interface, not %s", b->type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
309 baseclasses.remove(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
310 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
311 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
312 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
313 tc = (TypeClass *)(tb); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
314 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
315 if (tc->sym->isDeprecated()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
316 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
317 if (!isDeprecated()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
318 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
319 // Deriving from deprecated class makes this one deprecated too |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
320 isdeprecated = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
321 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
322 tc->checkDeprecated(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
323 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
324 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
325 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
326 if (tc->sym->isInterfaceDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
327 ; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
328 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
329 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
330 for (ClassDeclaration *cdb = tc->sym; cdb; cdb = cdb->baseClass) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
331 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
332 if (cdb == this) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
333 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
334 error("circular inheritance"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
335 baseclasses.remove(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
336 goto L7; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
337 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
338 } |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
339 if (!tc->sym->symtab || tc->sym->sizeok == 0) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
340 { // Try to resolve forward reference |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
341 if (sc->mustsemantic && tc->sym->scope) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
342 tc->sym->semantic(NULL); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
343 } |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
344 if (!tc->sym->symtab || tc->sym->scope || tc->sym->sizeok == 0) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
345 { |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
346 //printf("%s: forward reference of base class %s\n", toChars(), tc->sym->toChars()); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
347 //error("forward reference of base class %s", baseClass->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
348 // Forward reference of base class, try again later |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
349 //printf("\ttry later, forward reference of base class %s\n", tc->sym->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
350 scope = scx ? scx : new Scope(*sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
351 scope->setNoFree(); |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
352 if (tc->sym->scope) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
353 tc->sym->scope->module->addDeferredSemantic(tc->sym); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
354 scope->module->addDeferredSemantic(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
355 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
356 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
357 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
358 { baseClass = tc->sym; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
359 b->base = baseClass; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
360 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
361 L7: ; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
362 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
363 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
364 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
365 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
366 // Treat the remaining entries in baseclasses as interfaces |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
367 // Check for errors, handle forward references |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
368 for (i = (baseClass ? 1 : 0); i < baseclasses.dim; ) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
369 { TypeClass *tc; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
370 BaseClass *b; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
371 Type *tb; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
372 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
373 b = (BaseClass *)baseclasses.data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
374 b->type = b->type->semantic(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
375 tb = b->type->toBasetype(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
376 if (tb->ty == Tclass) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
377 tc = (TypeClass *)tb; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
378 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
379 tc = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
380 if (!tc || !tc->sym->isInterfaceDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
381 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
382 error("base type must be interface, not %s", b->type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
383 baseclasses.remove(i); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
384 continue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
385 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
386 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
387 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
388 if (tc->sym->isDeprecated()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
389 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
390 if (!isDeprecated()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
391 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
392 // Deriving from deprecated class makes this one deprecated too |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
393 isdeprecated = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
394 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
395 tc->checkDeprecated(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
396 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
397 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
398 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
399 // Check for duplicate interfaces |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
400 for (size_t j = (baseClass ? 1 : 0); j < i; j++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
401 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
402 BaseClass *b2 = (BaseClass *)baseclasses.data[j]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
403 if (b2->base == tc->sym) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
404 error("inherits from duplicate interface %s", b2->base->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
405 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
406 |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
407 if (!tc->sym->symtab) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
408 { // Try to resolve forward reference |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
409 if (sc->mustsemantic && tc->sym->scope) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
410 tc->sym->semantic(NULL); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
411 } |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
412 |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
413 b->base = tc->sym; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
414 if (!b->base->symtab || b->base->scope) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
415 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
416 //error("forward reference of base class %s", baseClass->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
417 // Forward reference of base, try again later |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
418 //printf("\ttry later, forward reference of base %s\n", baseClass->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
419 scope = scx ? scx : new Scope(*sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
420 scope->setNoFree(); |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
421 if (tc->sym->scope) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
422 tc->sym->scope->module->addDeferredSemantic(tc->sym); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
423 scope->module->addDeferredSemantic(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
424 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
425 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
426 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
427 i++; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
428 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
429 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
430 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
431 // If no base class, and this is not an Object, use Object as base class |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
432 if (!baseClass && ident != Id::Object) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
433 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
434 // BUG: what if Object is redefined in an inner scope? |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
435 Type *tbase = new TypeIdentifier(0, Id::Object); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
436 BaseClass *b; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
437 TypeClass *tc; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
438 Type *bt; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
439 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
440 if (!object) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
441 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
442 error("missing or corrupt object.d"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
443 fatal(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
444 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
445 bt = tbase->semantic(loc, sc)->toBasetype(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
446 b = new BaseClass(bt, PROTpublic); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
447 baseclasses.shift(b); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
448 assert(b->type->ty == Tclass); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
449 tc = (TypeClass *)(b->type); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
450 baseClass = tc->sym; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
451 assert(!baseClass->isInterfaceDeclaration()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
452 b->base = baseClass; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
453 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
454 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
455 interfaces_dim = baseclasses.dim; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
456 interfaces = (BaseClass **)baseclasses.data; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
457 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
458 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
459 if (baseClass) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
460 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
461 if (baseClass->storage_class & STCfinal) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
462 error("cannot inherit from final class %s", baseClass->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
463 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
464 interfaces_dim--; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
465 interfaces++; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
466 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
467 // Copy vtbl[] from base class |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
468 vtbl.setDim(baseClass->vtbl.dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
469 memcpy(vtbl.data, baseClass->vtbl.data, sizeof(void *) * vtbl.dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
470 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
471 // Inherit properties from base class |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
472 com = baseClass->isCOMclass(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
473 isauto = baseClass->isauto; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
474 vthis = baseClass->vthis; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
475 storage_class |= baseClass->storage_class & STC_TYPECTOR; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
476 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
477 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
478 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
479 // No base class, so this is the root of the class hierarchy |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
480 vtbl.setDim(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
481 vtbl.push(this); // leave room for classinfo as first member |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
482 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
483 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
484 protection = sc->protection; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
485 storage_class |= sc->stc; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
486 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
487 if (sizeok == 0) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
488 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
489 interfaceSemantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
490 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
491 for (i = 0; i < members->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
492 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
493 Dsymbol *s = (Dsymbol *)members->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
494 s->addMember(sc, this, 1); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
495 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
496 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
497 /* If this is a nested class, add the hidden 'this' |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
498 * member which is a pointer to the enclosing scope. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
499 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
500 if (vthis) // if inheriting from nested class |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
501 { // Use the base class's 'this' member |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
502 isnested = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
503 if (storage_class & STCstatic) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
504 error("static class cannot inherit from nested class %s", baseClass->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
505 if (toParent2() != baseClass->toParent2()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
506 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
507 if (toParent2()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
508 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
509 error("is nested within %s, but super class %s is nested within %s", |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
510 toParent2()->toChars(), |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
511 baseClass->toChars(), |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
512 baseClass->toParent2()->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
513 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
514 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
515 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
516 error("is not nested, but super class %s is nested within %s", |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
517 baseClass->toChars(), |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
518 baseClass->toParent2()->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
519 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
520 isnested = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
521 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
522 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
523 else if (!(storage_class & STCstatic)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
524 { Dsymbol *s = toParent2(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
525 if (s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
526 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
527 AggregateDeclaration *ad = s->isClassDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
528 FuncDeclaration *fd = s->isFuncDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
529 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
530 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
531 if (ad || fd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
532 { isnested = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
533 Type *t; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
534 if (ad) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
535 t = ad->handle; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
536 else if (fd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
537 { AggregateDeclaration *ad = fd->isMember2(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
538 if (ad) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
539 t = ad->handle; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
540 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
541 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
542 t = Type::tvoidptr; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
543 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
544 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
545 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
546 assert(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
547 if (t->ty == Tstruct) // ref to struct |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
548 t = Type::tvoidptr; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
549 assert(!vthis); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
550 vthis = new ThisDeclaration(loc, t); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
551 members->push(vthis); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
552 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
553 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
554 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
555 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
556 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
557 if (storage_class & (STCauto | STCscope)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
558 isauto = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
559 if (storage_class & STCabstract) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
560 isabstract = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
561 if (storage_class & STCimmutable) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
562 type = type->invariantOf(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
563 else if (storage_class & STCconst) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
564 type = type->constOf(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
565 else if (storage_class & STCshared) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
566 type = type->sharedOf(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
567 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
568 sc = sc->push(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
569 sc->stc &= ~(STCfinal | STCauto | STCscope | STCstatic | |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
570 STCabstract | STCdeprecated | STC_TYPECTOR | STCtls | STCgshared); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
571 sc->stc |= storage_class & STC_TYPECTOR; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
572 sc->parent = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
573 sc->inunion = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
574 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
575 if (isCOMclass()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
576 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
577 #if _WIN32 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
578 sc->linkage = LINKwindows; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
579 #else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
580 /* This enables us to use COM objects under Linux and |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
581 * work with things like XPCOM |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
582 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
583 sc->linkage = LINKc; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
584 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
585 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
586 sc->protection = PROTpublic; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
587 sc->explicitProtection = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
588 sc->structalign = 8; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
589 structalign = sc->structalign; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
590 if (baseClass) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
591 { sc->offset = baseClass->structsize; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
592 alignsize = baseClass->alignsize; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
593 // if (isnested) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
594 // sc->offset += PTRSIZE; // room for uplevel context pointer |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
595 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
596 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
597 { sc->offset = PTRSIZE * 2; // allow room for __vptr and __monitor |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
598 alignsize = PTRSIZE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
599 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
600 structsize = sc->offset; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
601 Scope scsave = *sc; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
602 int members_dim = members->dim; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
603 sizeok = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
604 for (i = 0; i < members_dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
605 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
606 Dsymbol *s = (Dsymbol *)members->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
607 s->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
608 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
609 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
610 if (sizeok == 2) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
611 { // semantic() failed because of forward references. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
612 // Unwind what we did, and defer it for later |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
613 fields.setDim(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
614 structsize = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
615 alignsize = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
616 structalign = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
617 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
618 sc = sc->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
619 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
620 scope = scx ? scx : new Scope(*sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
621 scope->setNoFree(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
622 scope->module->addDeferredSemantic(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
623 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
624 //printf("\tsemantic('%s') failed due to forward references\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
625 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
626 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
627 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
628 //printf("\tsemantic('%s') successful\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
629 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
630 structsize = sc->offset; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
631 //members->print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
632 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
633 /* Look for special member functions. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
634 * They must be in this class, not in a base class. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
635 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
636 ctor = (CtorDeclaration *)search(0, Id::ctor, 0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
637 if (ctor && (ctor->toParent() != this || !ctor->isCtorDeclaration())) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
638 ctor = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
639 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
640 // dtor = (DtorDeclaration *)search(Id::dtor, 0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
641 // if (dtor && dtor->toParent() != this) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
642 // dtor = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
643 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
644 // inv = (InvariantDeclaration *)search(Id::classInvariant, 0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
645 // if (inv && inv->toParent() != this) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
646 // inv = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
647 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
648 // Can be in base class |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
649 aggNew = (NewDeclaration *)search(0, Id::classNew, 0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
650 aggDelete = (DeleteDeclaration *)search(0, Id::classDelete, 0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
651 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
652 // If this class has no constructor, but base class does, create |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
653 // a constructor: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
654 // this() { } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
655 if (!ctor && baseClass && baseClass->ctor) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
656 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
657 //printf("Creating default this(){} for class %s\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
658 CtorDeclaration *ctor = new CtorDeclaration(loc, 0, NULL, 0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
659 ctor->fbody = new CompoundStatement(0, new Statements()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
660 members->push(ctor); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
661 ctor->addMember(sc, this, 1); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
662 *sc = scsave; // why? What about sc->nofree? |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
663 sc->offset = structsize; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
664 ctor->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
665 this->ctor = ctor; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
666 defaultCtor = ctor; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
667 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
668 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
669 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
670 if (baseClass) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
671 { if (!aggDelete) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
672 aggDelete = baseClass->aggDelete; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
673 if (!aggNew) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
674 aggNew = baseClass->aggNew; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
675 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
676 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
677 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
678 // Allocate instance of each new interface |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
679 for (i = 0; i < vtblInterfaces->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
680 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
681 BaseClass *b = (BaseClass *)vtblInterfaces->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
682 unsigned thissize = PTRSIZE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
683 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
684 alignmember(structalign, thissize, &sc->offset); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
685 assert(b->offset == 0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
686 b->offset = sc->offset; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
687 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
688 // Take care of single inheritance offsets |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
689 while (b->baseInterfaces_dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
690 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
691 b = &b->baseInterfaces[0]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
692 b->offset = sc->offset; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
693 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
694 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
695 sc->offset += thissize; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
696 if (alignsize < thissize) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
697 alignsize = thissize; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
698 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
699 structsize = sc->offset; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
700 sizeok = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
701 Module::dprogress++; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
702 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
703 dtor = buildDtor(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
704 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
705 sc->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
706 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
707 #if 0 // Do not call until toObjfile() because of forward references |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
708 // Fill in base class vtbl[]s |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
709 for (i = 0; i < vtblInterfaces->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
710 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
711 BaseClass *b = (BaseClass *)vtblInterfaces->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
712 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
713 //b->fillVtbl(this, &b->vtbl, 1); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
714 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
715 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
716 //printf("-ClassDeclaration::semantic(%s), type = %p\n", toChars(), type); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
717 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
718 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
719 void ClassDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
720 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
721 if (!isAnonymous()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
722 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
723 buf->printf("%s ", kind()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
724 buf->writestring(toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
725 if (baseclasses.dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
726 buf->writestring(" : "); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
727 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
728 for (int i = 0; i < baseclasses.dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
729 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
730 BaseClass *b = (BaseClass *)baseclasses.data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
731 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
732 if (i) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
733 buf->writeByte(','); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
734 //buf->writestring(b->base->ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
735 b->type->toCBuffer(buf, NULL, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
736 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
737 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
738 buf->writeByte('{'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
739 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
740 for (int i = 0; i < members->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
741 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
742 Dsymbol *s = (Dsymbol *)members->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
743 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
744 buf->writestring(" "); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
745 s->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
746 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
747 buf->writestring("}"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
748 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
749 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
750 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
751 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
752 void ClassDeclaration::defineRef(Dsymbol *s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
753 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
754 ClassDeclaration *cd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
755 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
756 AggregateDeclaration::defineRef(s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
757 cd = s->isClassDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
758 baseType = cd->baseType; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
759 cd->baseType = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
760 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
761 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
762 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
763 /********************************************* |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
764 * Determine if 'this' is a base class of cd. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
765 * This is used to detect circular inheritance only. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
766 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
767 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
768 int ClassDeclaration::isBaseOf2(ClassDeclaration *cd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
769 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
770 if (!cd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
771 return 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
772 //printf("ClassDeclaration::isBaseOf2(this = '%s', cd = '%s')\n", toChars(), cd->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
773 for (int i = 0; i < cd->baseclasses.dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
774 { BaseClass *b = (BaseClass *)cd->baseclasses.data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
775 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
776 if (b->base == this || isBaseOf2(b->base)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
777 return 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
778 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
779 return 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
780 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
781 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
782 /******************************************* |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
783 * Determine if 'this' is a base class of cd. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
784 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
785 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
786 int ClassDeclaration::isBaseOf(ClassDeclaration *cd, int *poffset) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
787 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
788 //printf("ClassDeclaration::isBaseOf(this = '%s', cd = '%s')\n", toChars(), cd->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
789 if (poffset) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
790 *poffset = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
791 while (cd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
792 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
793 if (this == cd->baseClass) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
794 return 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
795 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
796 /* cd->baseClass might not be set if cd is forward referenced. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
797 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
798 if (!cd->baseClass && cd->baseclasses.dim && !cd->isInterfaceDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
799 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
800 cd->error("base class is forward referenced by %s", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
801 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
802 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
803 cd = cd->baseClass; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
804 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
805 return 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
806 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
807 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
808 Dsymbol *ClassDeclaration::search(Loc loc, Identifier *ident, int flags) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
809 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
810 Dsymbol *s; |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
811 //printf("%s.ClassDeclaration::search('%s')\n", toChars(), ident->toChars()); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
812 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
813 if (scope) |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
814 { Scope *sc = scope; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
815 sc->mustsemantic++; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
816 semantic(sc); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
817 sc->mustsemantic--; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
818 } |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
819 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
820 if (!members || !symtab || scope) |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
821 { |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
822 error("is forward referenced when looking for '%s'", ident->toChars()); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
823 //*(char*)0=0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
824 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
825 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
826 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
827 s = ScopeDsymbol::search(loc, ident, flags); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
828 if (!s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
829 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
830 // Search bases classes in depth-first, left to right order |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
831 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
832 int i; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
833 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
834 for (i = 0; i < baseclasses.dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
835 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
836 BaseClass *b = (BaseClass *)baseclasses.data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
837 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
838 if (b->base) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
839 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
840 if (!b->base->symtab) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
841 error("base %s is forward referenced", b->base->ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
842 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
843 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
844 s = b->base->search(loc, ident, flags); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
845 if (s == this) // happens if s is nested in this and derives from this |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
846 s = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
847 else if (s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
848 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
849 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
850 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
851 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
852 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
853 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
854 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
855 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
856 /********************************************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
857 * fd is in the vtbl[] for this class. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
858 * Return 1 if function is hidden (not findable through search). |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
859 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
860 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
861 #if DMDV2 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
862 int isf(void *param, FuncDeclaration *fd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
863 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
864 //printf("param = %p, fd = %p %s\n", param, fd, fd->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
865 return param == fd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
866 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
867 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
868 int ClassDeclaration::isFuncHidden(FuncDeclaration *fd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
869 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
870 //printf("ClassDeclaration::isFuncHidden(class = %s, fd = %s)\n", toChars(), fd->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
871 Dsymbol *s = search(0, fd->ident, 4|2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
872 if (!s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
873 { //printf("not found\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
874 /* Because, due to a hack, if there are multiple definitions |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
875 * of fd->ident, NULL is returned. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
876 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
877 return 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
878 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
879 s = s->toAlias(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
880 OverloadSet *os = s->isOverloadSet(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
881 if (os) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
882 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
883 for (int i = 0; i < os->a.dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
884 { Dsymbol *s = (Dsymbol *)os->a.data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
885 FuncDeclaration *f2 = s->isFuncDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
886 if (f2 && overloadApply(getModule(), f2, &isf, fd)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
887 return 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
888 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
889 return 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
890 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
891 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
892 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
893 FuncDeclaration *fdstart = s->isFuncDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
894 //printf("%s fdstart = %p\n", s->kind(), fdstart); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
895 return !overloadApply(getModule(), fdstart, &isf, fd); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
896 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
897 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
898 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
899 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
900 /**************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
901 * Find virtual function matching identifier and type. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
902 * Used to build virtual function tables for interface implementations. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
903 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
904 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
905 FuncDeclaration *ClassDeclaration::findFunc(Identifier *ident, TypeFunction *tf) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
906 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
907 //printf("ClassDeclaration::findFunc(%s, %s) %s\n", ident->toChars(), tf->toChars(), toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
908 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
909 ClassDeclaration *cd = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
910 Array *vtbl = &cd->vtbl; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
911 while (1) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
912 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
913 for (size_t i = 0; i < vtbl->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
914 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
915 FuncDeclaration *fd = ((Dsymbol*)vtbl->data[i])->isFuncDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
916 if (!fd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
917 continue; // the first entry might be a ClassInfo |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
918 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
919 //printf("\t[%d] = %s\n", i, fd->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
920 if (ident == fd->ident && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
921 //tf->equals(fd->type) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
922 fd->type->covariant(tf) == 1 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
923 ) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
924 { //printf("\t\tfound\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
925 return fd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
926 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
927 //else printf("\t\t%d\n", fd->type->covariant(tf)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
928 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
929 if (!cd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
930 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
931 vtbl = &cd->vtblFinal; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
932 cd = cd->baseClass; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
933 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
934 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
935 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
936 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
937 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
938 void ClassDeclaration::interfaceSemantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
939 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
940 InterfaceDeclaration *id = isInterfaceDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
941 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
942 vtblInterfaces = new BaseClasses(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
943 vtblInterfaces->reserve(interfaces_dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
944 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
945 for (size_t i = 0; i < interfaces_dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
946 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
947 BaseClass *b = interfaces[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
948 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
949 // If this is an interface, and it derives from a COM interface, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
950 // then this is a COM interface too. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
951 if (b->base->isCOMinterface()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
952 com = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
953 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
954 if (b->base->isCPPinterface() && id) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
955 id->cpp = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
956 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
957 vtblInterfaces->push(b); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
958 b->copyBaseInterfaces(vtblInterfaces); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
959 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
960 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
961 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
962 /**************************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
963 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
964 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
965 int ClassDeclaration::isCOMclass() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
966 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
967 return com; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
968 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
969 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
970 int ClassDeclaration::isCOMinterface() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
971 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
972 return 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
973 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
974 |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
975 #if DMDV2 |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
976 int ClassDeclaration::isCPPinterface() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
977 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
978 return 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
979 } |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
980 #endif |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
981 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
982 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
983 /**************************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
984 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
985 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
986 int ClassDeclaration::isAbstract() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
987 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
988 if (isabstract) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
989 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
990 for (int i = 1; i < vtbl.dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
991 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
992 FuncDeclaration *fd = ((Dsymbol *)vtbl.data[i])->isFuncDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
993 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
994 //printf("\tvtbl[%d] = %p\n", i, fd); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
995 if (!fd || fd->isAbstract()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
996 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
997 isabstract |= 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
998 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
999 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1000 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1001 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1002 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1003 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1004 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1005 /**************************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1006 * Determine if slot 0 of the vtbl[] is reserved for something else. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1007 * For class objects, yes, this is where the classinfo ptr goes. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1008 * For COM interfaces, no. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1009 * For non-COM interfaces, yes, this is where the Interface ptr goes. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1010 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1011 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1012 int ClassDeclaration::vtblOffset() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1013 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1014 return 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1015 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1016 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1017 /**************************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1018 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1019 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1020 const char *ClassDeclaration::kind() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1021 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1022 return "class"; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1023 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1024 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1025 /**************************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1026 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1027 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1028 void ClassDeclaration::addLocalClass(ClassDeclarations *aclasses) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1029 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1030 aclasses->push(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1031 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1032 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1033 /********************************* InterfaceDeclaration ****************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1034 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1035 InterfaceDeclaration::InterfaceDeclaration(Loc loc, Identifier *id, BaseClasses *baseclasses) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1036 : ClassDeclaration(loc, id, baseclasses) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1037 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1038 com = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1039 cpp = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1040 if (id == Id::IUnknown) // IUnknown is the root of all COM interfaces |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1041 { com = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1042 cpp = 1; // IUnknown is also a C++ interface |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1043 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1044 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1045 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1046 Dsymbol *InterfaceDeclaration::syntaxCopy(Dsymbol *s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1047 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1048 InterfaceDeclaration *id; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1049 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1050 if (s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1051 id = (InterfaceDeclaration *)s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1052 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1053 id = new InterfaceDeclaration(loc, ident, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1054 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1055 ClassDeclaration::syntaxCopy(id); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1056 return id; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1057 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1058 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1059 void InterfaceDeclaration::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1060 { int i; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1061 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1062 //printf("InterfaceDeclaration::semantic(%s), type = %p\n", toChars(), type); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1063 if (inuse) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1064 return; |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
1065 |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
1066 if (!sc) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
1067 sc = scope; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
1068 if (!parent && sc->parent && !sc->parent->isModule()) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
1069 parent = sc->parent; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
1070 |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
1071 type = type->semantic(loc, sc); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
1072 handle = type; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
1073 |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1074 if (!members) // if forward reference |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1075 { //printf("\tinterface '%s' is forward referenced\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1076 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1077 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1078 if (symtab) // if already done |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1079 { if (!scope) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1080 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1081 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1082 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1083 symtab = new DsymbolTable(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1084 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1085 Scope *scx = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1086 if (scope) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1087 { sc = scope; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1088 scx = scope; // save so we don't make redundant copies |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1089 scope = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1090 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1091 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1092 if (sc->stc & STCdeprecated) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1093 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1094 isdeprecated = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1095 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1096 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1097 // Expand any tuples in baseclasses[] |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1098 for (i = 0; i < baseclasses.dim; ) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1099 { BaseClass *b = (BaseClass *)baseclasses.data[0]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1100 b->type = b->type->semantic(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1101 Type *tb = b->type->toBasetype(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1102 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1103 if (tb->ty == Ttuple) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1104 { TypeTuple *tup = (TypeTuple *)tb; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1105 enum PROT protection = b->protection; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1106 baseclasses.remove(i); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1107 size_t dim = Argument::dim(tup->arguments); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1108 for (size_t j = 0; j < dim; j++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1109 { Argument *arg = Argument::getNth(tup->arguments, j); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1110 b = new BaseClass(arg->type, protection); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1111 baseclasses.insert(i + j, b); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1112 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1113 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1114 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1115 i++; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1116 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1117 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1118 if (!baseclasses.dim && sc->linkage == LINKcpp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1119 cpp = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1120 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1121 // Check for errors, handle forward references |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1122 for (i = 0; i < baseclasses.dim; ) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1123 { TypeClass *tc; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1124 BaseClass *b; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1125 Type *tb; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1126 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1127 b = (BaseClass *)baseclasses.data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1128 b->type = b->type->semantic(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1129 tb = b->type->toBasetype(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1130 if (tb->ty == Tclass) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1131 tc = (TypeClass *)tb; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1132 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1133 tc = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1134 if (!tc || !tc->sym->isInterfaceDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1135 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1136 error("base type must be interface, not %s", b->type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1137 baseclasses.remove(i); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1138 continue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1139 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1140 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1141 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1142 // Check for duplicate interfaces |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1143 for (size_t j = 0; j < i; j++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1144 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1145 BaseClass *b2 = (BaseClass *)baseclasses.data[j]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1146 if (b2->base == tc->sym) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1147 error("inherits from duplicate interface %s", b2->base->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1148 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1149 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1150 b->base = tc->sym; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1151 if (b->base == this || isBaseOf2(b->base)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1152 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1153 error("circular inheritance of interface"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1154 baseclasses.remove(i); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1155 continue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1156 } |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1157 if (!b->base->symtab) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1158 { // Try to resolve forward reference |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1159 if (sc->mustsemantic && b->base->scope) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1160 b->base->semantic(NULL); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1161 } |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1162 if (!b->base->symtab || b->base->scope || b->base->inuse) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1163 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1164 //error("forward reference of base class %s", baseClass->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1165 // Forward reference of base, try again later |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1166 //printf("\ttry later, forward reference of base %s\n", b->base->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1167 scope = scx ? scx : new Scope(*sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1168 scope->setNoFree(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1169 scope->module->addDeferredSemantic(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1170 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1171 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1172 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1173 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1174 // Inherit const/invariant from base class |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1175 storage_class |= b->base->storage_class & STC_TYPECTOR; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1176 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1177 i++; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1178 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1179 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1180 interfaces_dim = baseclasses.dim; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1181 interfaces = (BaseClass **)baseclasses.data; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1182 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1183 interfaceSemantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1184 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1185 if (vtblOffset()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1186 vtbl.push(this); // leave room at vtbl[0] for classinfo |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1187 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1188 // Cat together the vtbl[]'s from base interfaces |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1189 for (i = 0; i < interfaces_dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1190 { BaseClass *b = interfaces[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1191 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1192 // Skip if b has already appeared |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1193 for (int k = 0; k < i; k++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1194 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1195 if (b == interfaces[i]) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1196 goto Lcontinue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1197 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1198 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1199 // Copy vtbl[] from base class |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1200 if (b->base->vtblOffset()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1201 { int d = b->base->vtbl.dim; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1202 if (d > 1) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1203 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1204 vtbl.reserve(d - 1); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1205 for (int j = 1; j < d; j++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1206 vtbl.push(b->base->vtbl.data[j]); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1207 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1208 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1209 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1210 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1211 vtbl.append(&b->base->vtbl); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1212 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1213 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1214 Lcontinue: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1215 ; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1216 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1217 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1218 protection = sc->protection; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1219 storage_class |= sc->stc & STC_TYPECTOR; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1220 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1221 for (i = 0; i < members->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1222 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1223 Dsymbol *s = (Dsymbol *)members->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1224 s->addMember(sc, this, 1); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1225 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1226 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1227 sc = sc->push(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1228 sc->stc &= ~(STCfinal | STCauto | STCscope | STCstatic | |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1229 STCabstract | STCdeprecated | STC_TYPECTOR | STCtls | STCgshared); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1230 sc->stc |= storage_class & STC_TYPECTOR; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1231 sc->parent = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1232 if (isCOMinterface()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1233 sc->linkage = LINKwindows; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1234 else if (isCPPinterface()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1235 sc->linkage = LINKcpp; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1236 sc->structalign = 8; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1237 structalign = sc->structalign; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1238 sc->offset = PTRSIZE * 2; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1239 inuse++; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1240 for (i = 0; i < members->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1241 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1242 Dsymbol *s = (Dsymbol *)members->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1243 s->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1244 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1245 inuse--; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1246 //members->print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1247 sc->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1248 //printf("-InterfaceDeclaration::semantic(%s), type = %p\n", toChars(), type); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1249 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1250 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1251 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1252 /******************************************* |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1253 * Determine if 'this' is a base class of cd. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1254 * (Actually, if it is an interface supported by cd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1255 * Output: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1256 * *poffset offset to start of class |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1257 * OFFSET_RUNTIME must determine offset at runtime |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1258 * Returns: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1259 * 0 not a base |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1260 * 1 is a base |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1261 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1262 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1263 int InterfaceDeclaration::isBaseOf(ClassDeclaration *cd, int *poffset) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1264 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1265 unsigned j; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1266 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1267 //printf("%s.InterfaceDeclaration::isBaseOf(cd = '%s')\n", toChars(), cd->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1268 assert(!baseClass); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1269 for (j = 0; j < cd->interfaces_dim; j++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1270 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1271 BaseClass *b = cd->interfaces[j]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1272 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1273 //printf("\tbase %s\n", b->base->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1274 if (this == b->base) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1275 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1276 //printf("\tfound at offset %d\n", b->offset); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1277 if (poffset) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1278 { *poffset = b->offset; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1279 if (j && cd->isInterfaceDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1280 *poffset = OFFSET_RUNTIME; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1281 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1282 return 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1283 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1284 if (isBaseOf(b, poffset)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1285 { if (j && poffset && cd->isInterfaceDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1286 *poffset = OFFSET_RUNTIME; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1287 return 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1288 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1289 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1290 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1291 if (cd->baseClass && isBaseOf(cd->baseClass, poffset)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1292 return 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1293 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1294 if (poffset) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1295 *poffset = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1296 return 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1297 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1298 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1299 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1300 int InterfaceDeclaration::isBaseOf(BaseClass *bc, int *poffset) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1301 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1302 //printf("%s.InterfaceDeclaration::isBaseOf(bc = '%s')\n", toChars(), bc->base->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1303 for (unsigned j = 0; j < bc->baseInterfaces_dim; j++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1304 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1305 BaseClass *b = &bc->baseInterfaces[j]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1306 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1307 if (this == b->base) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1308 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1309 if (poffset) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1310 { *poffset = b->offset; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1311 if (j && bc->base->isInterfaceDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1312 *poffset = OFFSET_RUNTIME; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1313 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1314 return 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1315 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1316 if (isBaseOf(b, poffset)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1317 { if (j && poffset && bc->base->isInterfaceDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1318 *poffset = OFFSET_RUNTIME; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1319 return 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1320 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1321 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1322 if (poffset) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1323 *poffset = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1324 return 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1325 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1326 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1327 /**************************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1328 * Determine if slot 0 of the vtbl[] is reserved for something else. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1329 * For class objects, yes, this is where the ClassInfo ptr goes. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1330 * For COM interfaces, no. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1331 * For non-COM interfaces, yes, this is where the Interface ptr goes. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1332 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1333 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1334 int InterfaceDeclaration::vtblOffset() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1335 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1336 if (isCOMinterface() || isCPPinterface()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1337 return 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1338 return 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1339 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1340 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1341 int InterfaceDeclaration::isCOMinterface() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1342 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1343 return com; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1344 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1345 |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1346 #if DMDV2 |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1347 int InterfaceDeclaration::isCPPinterface() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1348 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1349 return cpp; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1350 } |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1351 #endif |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1352 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1353 /******************************************* |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1354 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1355 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1356 const char *InterfaceDeclaration::kind() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1357 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1358 return "interface"; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1359 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1360 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1361 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1362 /******************************** BaseClass *****************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1363 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1364 BaseClass::BaseClass() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1365 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1366 memset(this, 0, sizeof(BaseClass)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1367 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1368 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1369 BaseClass::BaseClass(Type *type, enum PROT protection) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1370 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1371 //printf("BaseClass(this = %p, '%s')\n", this, type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1372 this->type = type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1373 this->protection = protection; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1374 base = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1375 offset = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1376 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1377 baseInterfaces_dim = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1378 baseInterfaces = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1379 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1380 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1381 /**************************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1382 * Fill in vtbl[] for base class based on member functions of class cd. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1383 * Input: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1384 * vtbl if !=NULL, fill it in |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1385 * newinstance !=0 means all entries must be filled in by members |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1386 * of cd, not members of any base classes of cd. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1387 * Returns: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1388 * !=0 if any entries were filled in by members of cd (not exclusively |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1389 * by base classes) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1390 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1391 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1392 int BaseClass::fillVtbl(ClassDeclaration *cd, Array *vtbl, int newinstance) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1393 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1394 ClassDeclaration *id = base; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1395 int j; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1396 int result = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1397 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1398 //printf("BaseClass::fillVtbl(this='%s', cd='%s')\n", base->toChars(), cd->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1399 if (vtbl) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1400 vtbl->setDim(base->vtbl.dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1401 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1402 // first entry is ClassInfo reference |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1403 for (j = base->vtblOffset(); j < base->vtbl.dim; j++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1404 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1405 FuncDeclaration *ifd = ((Dsymbol *)base->vtbl.data[j])->isFuncDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1406 FuncDeclaration *fd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1407 TypeFunction *tf; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1408 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1409 //printf(" vtbl[%d] is '%s'\n", j, ifd ? ifd->toChars() : "null"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1410 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1411 assert(ifd); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1412 // Find corresponding function in this class |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1413 tf = (ifd->type->ty == Tfunction) ? (TypeFunction *)(ifd->type) : NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1414 fd = cd->findFunc(ifd->ident, tf); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1415 if (fd && !fd->isAbstract()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1416 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1417 //printf(" found\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1418 // Check that calling conventions match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1419 if (fd->linkage != ifd->linkage) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1420 fd->error("linkage doesn't match interface function"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1421 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1422 // Check that it is current |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1423 if (newinstance && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1424 fd->toParent() != cd && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1425 ifd->toParent() == base) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1426 cd->error("interface function %s.%s is not implemented", |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1427 id->toChars(), ifd->ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1428 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1429 if (fd->toParent() == cd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1430 result = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1431 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1432 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1433 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1434 //printf(" not found\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1435 // BUG: should mark this class as abstract? |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1436 if (!cd->isAbstract()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1437 cd->error("interface function %s.%s isn't implemented", |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1438 id->toChars(), ifd->ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1439 fd = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1440 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1441 if (vtbl) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1442 vtbl->data[j] = fd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1443 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1444 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1445 return result; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1446 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1447 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1448 void BaseClass::copyBaseInterfaces(BaseClasses *vtblInterfaces) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1449 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1450 //printf("+copyBaseInterfaces(), %s\n", base->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1451 // if (baseInterfaces_dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1452 // return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1453 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1454 baseInterfaces_dim = base->interfaces_dim; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1455 baseInterfaces = (BaseClass *)mem.calloc(baseInterfaces_dim, sizeof(BaseClass)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1456 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1457 //printf("%s.copyBaseInterfaces()\n", base->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1458 for (int i = 0; i < baseInterfaces_dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1459 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1460 BaseClass *b = &baseInterfaces[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1461 BaseClass *b2 = base->interfaces[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1462 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1463 assert(b2->vtbl.dim == 0); // should not be filled yet |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1464 memcpy(b, b2, sizeof(BaseClass)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1465 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1466 if (i) // single inheritance is i==0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1467 vtblInterfaces->push(b); // only need for M.I. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1468 b->copyBaseInterfaces(vtblInterfaces); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1469 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1470 //printf("-copyBaseInterfaces\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
809
diff
changeset
|
1471 } |