annotate dmd/struct.c @ 1587:def7a1d494fd

Merge DMD 1.051
author Christian Kamm <kamm incasoftware de>
date Fri, 06 Nov 2009 23:58:01 +0100
parents d9c5f5a43403
children 207a8a438dea
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
2 // Compiler implementation of the D programming language
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
3 // Copyright (c) 1999-2009 by Digital Mars
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
4 // All Rights Reserved
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
5 // written by Walter Bright
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
6 // http://www.digitalmars.com
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
7 // License for redistribution is by either the Artistic License
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
8 // in artistic.txt, or the GNU General Public License in gnu.txt.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
9 // See the included readme.txt for details.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
10
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
11 #include <stdio.h>
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
12 #include <assert.h>
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
13
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
14 #include "root.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
15 #include "aggregate.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
16 #include "scope.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
17 #include "mtype.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
18 #include "declaration.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
19 #include "module.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
20 #include "id.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
21 #include "statement.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
22
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
23 /********************************* AggregateDeclaration ****************************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
24
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
25 AggregateDeclaration::AggregateDeclaration(Loc loc, Identifier *id)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
26 : ScopeDsymbol(id)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
27 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
28 this->loc = loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
29
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
30 storage_class = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
31 protection = PROTpublic;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
32 type = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
33 handle = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
34 structsize = 0; // size of struct
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
35 alignsize = 0; // size of struct for alignment purposes
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
36 structalign = 0; // struct member alignment in effect
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
37 hasUnions = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
38 sizeok = 0; // size not determined yet
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
39 isdeprecated = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
40 inv = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
41 aggNew = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
42 aggDelete = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
43
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
44 #if IN_DMD
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
45 stag = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
46 sinit = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
47 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
48 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
49 dtor = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
50
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
51 ctor = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
52 defaultCtor = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
53 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
54
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
55 #if IN_LLVM
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
56 availableExternally = true; // assume this unless proven otherwise
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
57 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
58 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
59
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
60 enum PROT AggregateDeclaration::prot()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
61 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
62 return protection;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
63 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
64
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
65 void AggregateDeclaration::semantic2(Scope *sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
66 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
67 //printf("AggregateDeclaration::semantic2(%s)\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
68 if (scope && members)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
69 { error("has forward references");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
70 return;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
71 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
72 if (members)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
73 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
74 sc = sc->push(this);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
75 for (size_t i = 0; i < members->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
76 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
77 Dsymbol *s = (Dsymbol *)members->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
78 s->semantic2(sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
79 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
80 sc->pop();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
81 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
82 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
83
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
84 void AggregateDeclaration::semantic3(Scope *sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
85 { int i;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
86
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
87 // LDC
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
88 if (!global.params.useAvailableExternally)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
89 availableExternally = false;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
90
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
91 //printf("AggregateDeclaration::semantic3(%s)\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
92 if (members)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
93 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
94 sc = sc->push(this);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
95 for (i = 0; i < members->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
96 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
97 Dsymbol *s = (Dsymbol *)members->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
98 s->semantic3(sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
99 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
100 sc->pop();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
101 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
102 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
103
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
104 void AggregateDeclaration::inlineScan()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
105 { int i;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
106
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
107 //printf("AggregateDeclaration::inlineScan(%s)\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
108 if (members)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
109 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
110 for (i = 0; i < members->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
111 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
112 Dsymbol *s = (Dsymbol *)members->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
113 //printf("inline scan aggregate symbol '%s'\n", s->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
114 s->inlineScan();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
115 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
116 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
117 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
118
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
119 unsigned AggregateDeclaration::size(Loc loc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
120 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
121 //printf("AggregateDeclaration::size() = %d\n", structsize);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
122 if (!members)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
123 error(loc, "unknown size");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
124 if (sizeok != 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
125 { error(loc, "no size yet for forward reference");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
126 //*(char*)0=0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
127 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
128 return structsize;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
129 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
130
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
131 Type *AggregateDeclaration::getType()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
132 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
133 return type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
134 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
135
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
136 int AggregateDeclaration::isDeprecated()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
137 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
138 return isdeprecated;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
139 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
140
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
141 /****************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
142 * Do byte or word alignment as necessary.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
143 * Align sizes of 0, as we may not know array sizes yet.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
144 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
145
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
146 void AggregateDeclaration::alignmember(
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
147 unsigned salign, // struct alignment that is in effect
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
148 unsigned size, // alignment requirement of field
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
149 unsigned *poffset)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
150 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
151 //printf("salign = %d, size = %d, offset = %d\n",salign,size,offset);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
152 if (salign > 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
153 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
154 assert(size != 3);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
155 int sa = size;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
156 if (sa == 0 || salign < sa)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
157 sa = salign;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
158 *poffset = (*poffset + sa - 1) & ~(sa - 1);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
159 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
160 //printf("result = %d\n",offset);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
161 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
162
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
163
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
164 void AggregateDeclaration::addField(Scope *sc, VarDeclaration *v)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
165 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
166 unsigned memsize; // size of member
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
167 unsigned memalignsize; // size of member for alignment purposes
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
168 unsigned xalign; // alignment boundaries
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
169
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
170 //printf("AggregateDeclaration::addField('%s') %s\n", v->toChars(), toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
171
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
172 // Check for forward referenced types which will fail the size() call
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
173 Type *t = v->type->toBasetype();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
174 if (t->ty == Tstruct /*&& isStructDeclaration()*/)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
175 { TypeStruct *ts = (TypeStruct *)t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
176 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
177 if (ts->sym == this)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
178 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
179 error("cannot have field %s with same struct type", v->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
180 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
181 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
182
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
183 if (ts->sym->sizeok != 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
184 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
185 sizeok = 2; // cannot finish; flag as forward referenced
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
186 return;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
187 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
188 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
189 if (t->ty == Tident)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
190 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
191 sizeok = 2; // cannot finish; flag as forward referenced
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
192 return;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
193 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
194
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
195 memsize = v->type->size(loc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
196 memalignsize = v->type->alignsize();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
197 xalign = v->type->memalign(sc->structalign);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
198 alignmember(xalign, memalignsize, &sc->offset);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
199 v->offset = sc->offset;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
200 sc->offset += memsize;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
201 if (sc->offset > structsize)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
202 structsize = sc->offset;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
203 if (sc->structalign < memalignsize)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
204 memalignsize = sc->structalign;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
205 if (alignsize < memalignsize)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
206 alignsize = memalignsize;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
207 //printf("\talignsize = %d\n", alignsize);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
208
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
209 v->storage_class |= STCfield;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
210 //printf(" addField '%s' to '%s' at offset %d, size = %d\n", v->toChars(), toChars(), v->offset, memsize);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
211 fields.push(v);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
212 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
213
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
214
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
215 /********************************* StructDeclaration ****************************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
216
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
217 StructDeclaration::StructDeclaration(Loc loc, Identifier *id)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
218 : AggregateDeclaration(loc, id)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
219 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
220 zeroInit = 0; // assume false until we do semantic processing
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
221 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
222 hasIdentityAssign = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
223 cpctor = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
224 postblit = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
225 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
226
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
227 // For forward references
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
228 type = new TypeStruct(this);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
229 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
230
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
231 Dsymbol *StructDeclaration::syntaxCopy(Dsymbol *s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
232 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
233 StructDeclaration *sd;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
234
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
235 if (s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
236 sd = (StructDeclaration *)s;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
237 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
238 sd = new StructDeclaration(loc, ident);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
239 ScopeDsymbol::syntaxCopy(sd);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
240 return sd;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
241 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
242
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
243 void StructDeclaration::semantic(Scope *sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
244 { int i;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
245 Scope *sc2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
246
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
247 //printf("+StructDeclaration::semantic(this=%p, '%s')\n", this, toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
248
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
249 //static int count; if (++count == 20) *(char*)0=0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
250
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
251 assert(type);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
252 if (!members) // if forward reference
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
253 return;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
254
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
255 if (symtab)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
256 { if (!scope)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
257 return; // semantic() already completed
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
258 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
259 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
260 symtab = new DsymbolTable();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
261
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
262 Scope *scx = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
263 if (scope)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
264 { sc = scope;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
265 scx = scope; // save so we don't make redundant copies
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
266 scope = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
267 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
268
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
269 parent = sc->parent;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
270 type = type->semantic(loc, sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
271 #if STRUCTTHISREF
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
272 handle = type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
273 #else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
274 handle = type->pointerTo();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
275 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
276 structalign = sc->structalign;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
277 protection = sc->protection;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
278 if (sc->stc & STCdeprecated)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
279 isdeprecated = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
280 assert(!isAnonymous());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
281 if (sc->stc & STCabstract)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
282 error("structs, unions cannot be abstract");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
283 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
284 if (storage_class & STCinvariant)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
285 type = type->invariantOf();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
286 else if (storage_class & STCconst)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
287 type = type->constOf();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
288 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
289
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
290 if (sizeok == 0) // if not already done the addMember step
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
291 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
292 for (i = 0; i < members->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
293 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
294 Dsymbol *s = (Dsymbol *)members->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
295 //printf("adding member '%s' to '%s'\n", s->toChars(), this->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
296 s->addMember(sc, this, 1);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
297 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
298 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
299
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
300 sizeok = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
301 sc2 = sc->push(this);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
302 sc2->stc = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
303 sc2->parent = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
304 if (isUnionDeclaration())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
305 sc2->inunion = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
306 sc2->protection = PROTpublic;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
307 sc2->explicitProtection = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
308
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
309 int members_dim = members->dim;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
310 for (i = 0; i < members_dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
311 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
312 Dsymbol *s = (Dsymbol *)members->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
313 s->semantic(sc2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
314 if (isUnionDeclaration())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
315 sc2->offset = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
316 #if 0
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
317 if (sizeok == 2)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
318 { //printf("forward reference\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
319 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
320 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
321 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
322 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
323
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
324 /* The TypeInfo_Struct is expecting an opEquals and opCmp with
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
325 * a parameter that is a pointer to the struct. But if there
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
326 * isn't one, but is an opEquals or opCmp with a value, write
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
327 * another that is a shell around the value:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
328 * int opCmp(struct *p) { return opCmp(*p); }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
329 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
330
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
331 TypeFunction *tfeqptr;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
332 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
333 Arguments *arguments = new Arguments;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
334 Argument *arg = new Argument(STCin, handle, Id::p, NULL);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
335
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
336 arguments->push(arg);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
337 tfeqptr = new TypeFunction(arguments, Type::tint32, 0, LINKd);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
338 tfeqptr = (TypeFunction *)tfeqptr->semantic(0, sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
339 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
340
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
341 TypeFunction *tfeq;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
342 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
343 Arguments *arguments = new Arguments;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
344 Argument *arg = new Argument(STCin, type, NULL, NULL);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
345
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
346 arguments->push(arg);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
347 tfeq = new TypeFunction(arguments, Type::tint32, 0, LINKd);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
348 tfeq = (TypeFunction *)tfeq->semantic(0, sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
349 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
350
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
351 Identifier *id = Id::eq;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
352 for (int i = 0; i < 2; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
353 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
354 Dsymbol *s = search_function(this, id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
355 FuncDeclaration *fdx = s ? s->isFuncDeclaration() : NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
356 if (fdx)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
357 { FuncDeclaration *fd = fdx->overloadExactMatch(tfeqptr, getModule());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
358 if (!fd)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
359 { fd = fdx->overloadExactMatch(tfeq, getModule());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
360 if (fd)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
361 { // Create the thunk, fdptr
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
362 FuncDeclaration *fdptr = new FuncDeclaration(loc, loc, fdx->ident, STCundefined, tfeqptr);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
363 Expression *e = new IdentifierExp(loc, Id::p);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
364 e = new PtrExp(loc, e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
365 Expressions *args = new Expressions();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
366 args->push(e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
367 e = new IdentifierExp(loc, id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
368 e = new CallExp(loc, e, args);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
369 fdptr->fbody = new ReturnStatement(loc, e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
370 ScopeDsymbol *s = fdx->parent->isScopeDsymbol();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
371 assert(s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
372 s->members->push(fdptr);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
373 fdptr->addMember(sc, s, 1);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
374 fdptr->semantic(sc2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
375 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
376 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
377 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
378
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
379 id = Id::cmp;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
380 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
381 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
382 dtor = buildDtor(sc2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
383 postblit = buildPostBlit(sc2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
384 cpctor = buildCpCtor(sc2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
385 buildOpAssign(sc2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
386 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
387
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
388 sc2->pop();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
389
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
390 if (sizeok == 2)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
391 { // semantic() failed because of forward references.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
392 // Unwind what we did, and defer it for later
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
393 fields.setDim(0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
394 structsize = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
395 alignsize = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
396 structalign = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
397
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
398 scope = scx ? scx : new Scope(*sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
399 scope->setNoFree();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
400 scope->module->addDeferredSemantic(this);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
401 //printf("\tdeferring %s\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
402 return;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
403 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
404
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
405 // 0 sized struct's are set to 1 byte
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
406 if (structsize == 0)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
407 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
408 structsize = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
409 alignsize = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
410 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
411
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
412 // Round struct size up to next alignsize boundary.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
413 // This will ensure that arrays of structs will get their internals
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
414 // aligned properly.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
415 structsize = (structsize + alignsize - 1) & ~(alignsize - 1);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
416
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
417 sizeok = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
418 Module::dprogress++;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
419
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
420 //printf("-StructDeclaration::semantic(this=%p, '%s')\n", this, toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
421
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
422 // Determine if struct is all zeros or not
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
423 zeroInit = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
424 for (i = 0; i < fields.dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
425 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
426 Dsymbol *s = (Dsymbol *)fields.data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
427 VarDeclaration *vd = s->isVarDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
428 if (vd && !vd->isDataseg())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
429 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
430 if (vd->init)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
431 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
432 // Should examine init to see if it is really all 0's
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
433 zeroInit = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
434 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
435 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
436 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
437 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
438 if (!vd->type->isZeroInit(loc))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
439 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
440 zeroInit = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
441 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
442 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
443 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
444 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
445 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
446
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
447 /* Look for special member functions.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
448 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
449 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
450 ctor = (CtorDeclaration *)search(0, Id::ctor, 0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
451 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
452 inv = (InvariantDeclaration *)search(0, Id::classInvariant, 0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
453 aggNew = (NewDeclaration *)search(0, Id::classNew, 0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
454 aggDelete = (DeleteDeclaration *)search(0, Id::classDelete, 0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
455
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
456 if (sc->func)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
457 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
458 semantic2(sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
459 semantic3(sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
460 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
461 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
462
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
463 void StructDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
464 { int i;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
465
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
466 buf->printf("%s ", kind());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
467 if (!isAnonymous())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
468 buf->writestring(toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
469 if (!members)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
470 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
471 buf->writeByte(';');
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
472 buf->writenl();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
473 return;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
474 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
475 buf->writenl();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
476 buf->writeByte('{');
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
477 buf->writenl();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
478 for (i = 0; i < members->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
479 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
480 Dsymbol *s = (Dsymbol *)members->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
481
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
482 buf->writestring(" ");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
483 s->toCBuffer(buf, hgs);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
484 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
485 buf->writeByte('}');
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
486 buf->writenl();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
487 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
488
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
489
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
490 const char *StructDeclaration::kind()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
491 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
492 return "struct";
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
493 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
494
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
495 /********************************* UnionDeclaration ****************************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
496
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
497 UnionDeclaration::UnionDeclaration(Loc loc, Identifier *id)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
498 : StructDeclaration(loc, id)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
499 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
500 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
501
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
502 Dsymbol *UnionDeclaration::syntaxCopy(Dsymbol *s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
503 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
504 UnionDeclaration *ud;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
505
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
506 if (s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
507 ud = (UnionDeclaration *)s;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
508 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
509 ud = new UnionDeclaration(loc, ident);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
510 StructDeclaration::syntaxCopy(ud);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
511 return ud;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
512 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
513
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
514
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
515 const char *UnionDeclaration::kind()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
516 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
517 return "union";
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
518 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
519
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
520