annotate dmd/attrib.c @ 270:d9d5d59873d8 trunk

[svn r291] Fixed a bunch of the old Phobos tests to work with Tango. Branch statements now emit a new block after it. Fixed the _adSort runtime function had a bad signature. Added a missing dot prefix on compiler generated string tables for string switch. Fixed, PTRSIZE seems like it was wrong on 64bit, now it definitely gets set properly.
author lindquist
date Mon, 16 Jun 2008 16:01:19 +0200
parents 5acec6b2eef8
children aaade6ded589
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
2 // Compiler implementation of the D programming language
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
3 // Copyright (c) 1999-2007 by Digital Mars
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
4 // All Rights Reserved
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
5 // written by Walter Bright
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
6 // http://www.digitalmars.com
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
7 // License for redistribution is by either the Artistic License
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
8 // in artistic.txt, or the GNU General Public License in gnu.txt.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
9 // See the included readme.txt for details.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
10
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
11 #include <stdio.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
12 #include <stdlib.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
13 #include <assert.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
14
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
15 #if _WIN32 || IN_GCC || IN_LLVM
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
16 #include "mem.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
17 #elif linux
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
18 #include "../root/mem.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
19 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
20
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
21 #include "init.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
22 #include "declaration.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
23 #include "attrib.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
24 #include "cond.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
25 #include "scope.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
26 #include "id.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
27 #include "expression.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
28 #include "dsymbol.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
29 #include "aggregate.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
30 #include "module.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
31 #include "parse.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
32 #include "template.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
33
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
34 #include "../gen/enums.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
35 #include "../gen/logger.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
36
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
37 extern void obj_includelib(char *name);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
38
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
39
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
40 /********************************* AttribDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
41
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
42 AttribDeclaration::AttribDeclaration(Array *decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
43 : Dsymbol()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
44 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
45 this->decl = decl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
46 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
47
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
48 Array *AttribDeclaration::include(Scope *sc, ScopeDsymbol *sd)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
49 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
50 return decl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
51 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
52
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
53 int AttribDeclaration::addMember(Scope *sc, ScopeDsymbol *sd, int memnum)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
54 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
55 unsigned i;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
56 int m = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
57 Array *d = include(sc, sd);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
58
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
59 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
60 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
61 for (i = 0; i < d->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
62 { Dsymbol *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
63
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
64 s = (Dsymbol *)d->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
65 m |= s->addMember(sc, sd, m | memnum);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
66 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
67 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
68 return m;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
69 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
70
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
71 void AttribDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
72 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
73 Array *d = include(sc, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
74
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
75 //printf("\tAttribDeclaration::semantic '%s'\n",toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
76 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
77 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
78 for (unsigned i = 0; i < d->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
79 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
80 Dsymbol *s = (Dsymbol *)d->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
81
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
82 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
83 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
84 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
85 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
86
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
87 void AttribDeclaration::semantic2(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
88 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
89 unsigned i;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
90 Array *d = include(sc, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
91
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
92 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
93 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
94 for (i = 0; i < d->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
95 { Dsymbol *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
96
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
97 s = (Dsymbol *)d->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
98 s->semantic2(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
99 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
100 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
101 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
102
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
103 void AttribDeclaration::semantic3(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
104 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
105 unsigned i;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
106 Array *d = include(sc, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
107
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
108 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
109 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
110 for (i = 0; i < d->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
111 { Dsymbol *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
112
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
113 s = (Dsymbol *)d->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
114 s->semantic3(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
115 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
116 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
117 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
118
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
119 void AttribDeclaration::inlineScan()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
120 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
121 unsigned i;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
122 Array *d = include(NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
123
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
124 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
125 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
126 for (i = 0; i < d->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
127 { Dsymbol *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
128
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
129 s = (Dsymbol *)d->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
130 //printf("AttribDeclaration::inlineScan %s\n", s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
131 s->inlineScan();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
132 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
133 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
134 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
135
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
136 void AttribDeclaration::addComment(unsigned char *comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
137 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
138 if (comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
139 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
140 unsigned i;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
141 Array *d = include(NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
142
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
143 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
144 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
145 for (i = 0; i < d->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
146 { Dsymbol *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
147
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
148 s = (Dsymbol *)d->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
149 //printf("AttribDeclaration::addComment %s\n", s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
150 s->addComment(comment);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
151 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
152 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
153 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
154 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
155
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
156 void AttribDeclaration::emitComment(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
157 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
158 //printf("AttribDeclaration::emitComment(sc = %p)\n", sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
160 /* If generating doc comment, skip this because if we're inside
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
161 * a template, then include(NULL, NULL) will fail.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
162 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
163 // if (sc->docbuf)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
164 // return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
165
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
166 unsigned i;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
167 Array *d = include(NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
168
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
169 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
170 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
171 for (i = 0; i < d->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
172 { Dsymbol *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
173
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
174 s = (Dsymbol *)d->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
175 //printf("AttribDeclaration::emitComment %s\n", s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
176 s->emitComment(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
177 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
178 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
179 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
180
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
181 void AttribDeclaration::toObjFile()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
182 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
183 unsigned i;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
184 Array *d = include(NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
185
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
186 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
187 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
188 for (i = 0; i < d->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
189 { Dsymbol *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
190
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
191 s = (Dsymbol *)d->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
192 s->toObjFile();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
193 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
194 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
195 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
196
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
197 int AttribDeclaration::cvMember(unsigned char *p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
198 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
199 unsigned i;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
200 int nwritten = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
201 int n;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
202 Array *d = include(NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
203
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
204 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
205 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
206 for (i = 0; i < d->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
207 { Dsymbol *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
208
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
209 s = (Dsymbol *)d->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
210 n = s->cvMember(p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
211 if (p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
212 p += n;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
213 nwritten += n;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
214 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
215 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
216 return nwritten;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
217 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
218
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
219 int AttribDeclaration::hasPointers()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
220 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
221 Array *d = include(NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
222
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
223 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
224 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
225 for (size_t i = 0; i < d->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
226 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
227 Dsymbol *s = (Dsymbol *)d->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
228 if (s->hasPointers())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
229 return 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
230 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
231 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
232 return 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
233 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
234
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
235 char *AttribDeclaration::kind()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
236 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
237 return "attribute";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
238 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
239
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
240 int AttribDeclaration::oneMember(Dsymbol **ps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
241 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
242 Array *d = include(NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
243
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
244 return Dsymbol::oneMembers(d, ps);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
245 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
246
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
247 void AttribDeclaration::checkCtorConstInit()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
248 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
249 unsigned i;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
250 Array *d = include(NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
251
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
252 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
253 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
254 for (i = 0; i < d->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
255 { Dsymbol *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
256
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
257 s = (Dsymbol *)d->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
258 s->checkCtorConstInit();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
259 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
260 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
261 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
262
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
263 /****************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
264 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
265
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
266 void AttribDeclaration::addLocalClass(ClassDeclarations *aclasses)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
267 { unsigned i;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
268 Array *d = include(NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
269
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
270 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
271 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
272 for (i = 0; i < d->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
273 { Dsymbol *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
274
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
275 s = (Dsymbol *)d->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
276 s->addLocalClass(aclasses);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
277 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
278 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
279 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
280
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
281
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
282 void AttribDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
283 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
284 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
285 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
286 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
287 buf->writeByte('{');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
288 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
289 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
290 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
291 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
292
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
293 buf->writestring(" ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
294 s->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
295 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
296 buf->writeByte('}');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
297 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
298 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
299 buf->writeByte(';');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
300 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
301 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
302
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
303 /************************* StorageClassDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
304
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
305 StorageClassDeclaration::StorageClassDeclaration(unsigned stc, Array *decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
306 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
307 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
308 this->stc = stc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
309 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
310
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
311 Dsymbol *StorageClassDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
312 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
313 StorageClassDeclaration *scd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
314
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
315 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
316 scd = new StorageClassDeclaration(stc, Dsymbol::arraySyntaxCopy(decl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
317 return scd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
318 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
319
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
320 void StorageClassDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
321 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
322 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
323 { unsigned stc_save = sc->stc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
324
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
325 if (stc & (STCauto | STCscope | STCstatic | STCextern))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
326 sc->stc &= ~(STCauto | STCscope | STCstatic | STCextern);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
327 sc->stc |= stc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
328 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
329 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
330 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
331
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
332 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
333 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
334 sc->stc = stc_save;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
335 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
336 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
337 sc->stc = stc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
338 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
339
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
340 void StorageClassDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
341 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
342 struct SCstring
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
343 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
344 int stc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
345 enum TOK tok;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
346 };
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
347
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
348 static SCstring table[] =
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
349 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
350 { STCauto, TOKauto },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
351 { STCscope, TOKscope },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
352 { STCstatic, TOKstatic },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
353 { STCextern, TOKextern },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
354 { STCconst, TOKconst },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
355 { STCfinal, TOKfinal },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
356 { STCabstract, TOKabstract },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
357 { STCsynchronized, TOKsynchronized },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
358 { STCdeprecated, TOKdeprecated },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
359 { STCoverride, TOKoverride },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
360 };
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
361
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
362 int written = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
363 for (int i = 0; i < sizeof(table)/sizeof(table[0]); i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
364 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
365 if (stc & table[i].stc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
366 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
367 if (written)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
368 buf->writeByte(' ');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
369 written = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
370 buf->writestring(Token::toChars(table[i].tok));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
371 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
372 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
373
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
374 AttribDeclaration::toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
375 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
376
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
377 /********************************* LinkDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
378
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
379 LinkDeclaration::LinkDeclaration(enum LINK p, Array *decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
380 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
381 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
382 //printf("LinkDeclaration(linkage = %d, decl = %p)\n", p, decl);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
383 linkage = p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
384 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
385
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
386 Dsymbol *LinkDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
387 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
388 LinkDeclaration *ld;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
389
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
390 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
391 ld = new LinkDeclaration(linkage, Dsymbol::arraySyntaxCopy(decl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
392 return ld;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
393 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
394
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
395 void LinkDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
396 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
397 //printf("LinkDeclaration::semantic(linkage = %d, decl = %p)\n", linkage, decl);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
398 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
399 { enum LINK linkage_save = sc->linkage;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
400
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
401 sc->linkage = linkage;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
402 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
403 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
404 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
405
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
406 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
407 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
408 sc->linkage = linkage_save;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
409 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
410 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
411 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
412 sc->linkage = linkage;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
413 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
414 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
415
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
416 void LinkDeclaration::semantic3(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
417 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
418 //printf("LinkDeclaration::semantic3(linkage = %d, decl = %p)\n", linkage, decl);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
419 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
420 { enum LINK linkage_save = sc->linkage;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
421
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
422 sc->linkage = linkage;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
423 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
424 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
425 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
426
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
427 s->semantic3(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
428 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
429 sc->linkage = linkage_save;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
430 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
431 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
432 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
433 sc->linkage = linkage;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
434 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
435 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
436
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
437 void LinkDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
438 { char *p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
439
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
440 switch (linkage)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
441 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
442 case LINKd: p = "D"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
443 case LINKc: p = "C"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
444 case LINKcpp: p = "C++"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
445 case LINKwindows: p = "Windows"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
446 case LINKpascal: p = "Pascal"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
447 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
448 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
449 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
450 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
451 buf->writestring("extern (");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
452 buf->writestring(p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
453 buf->writestring(") ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
454 AttribDeclaration::toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
455 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
456
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
457 char *LinkDeclaration::toChars()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
458 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
459 return "extern ()";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
460 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
461
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
462 /********************************* ProtDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
463
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
464 ProtDeclaration::ProtDeclaration(enum PROT p, Array *decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
465 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
466 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
467 protection = p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
468 //printf("decl = %p\n", decl);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
469 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
470
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
471 Dsymbol *ProtDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
472 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
473 ProtDeclaration *pd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
474
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
475 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
476 pd = new ProtDeclaration(protection, Dsymbol::arraySyntaxCopy(decl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
477 return pd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
478 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
479
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
480 void ProtDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
481 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
482 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
483 { enum PROT protection_save = sc->protection;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
484 int explicitProtection_save = sc->explicitProtection;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
485
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
486 sc->protection = protection;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
487 sc->explicitProtection = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
488 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
489 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
490 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
491
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
492 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
493 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
494 sc->protection = protection_save;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
495 sc->explicitProtection = explicitProtection_save;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
496 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
497 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
498 { sc->protection = protection;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
499 sc->explicitProtection = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
500 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
501 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
502
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
503 void ProtDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
504 { char *p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
505
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
506 switch (protection)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
507 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
508 case PROTprivate: p = "private"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
509 case PROTpackage: p = "package"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
510 case PROTprotected: p = "protected"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
511 case PROTpublic: p = "public"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
512 case PROTexport: p = "export"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
513 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
514 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
515 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
516 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
517 buf->writestring(p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
518 AttribDeclaration::toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
519 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
520
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
521 /********************************* AlignDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
522
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
523 AlignDeclaration::AlignDeclaration(unsigned sa, Array *decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
524 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
525 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
526 salign = sa;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
527 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
528
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
529 Dsymbol *AlignDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
530 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
531 AlignDeclaration *ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
532
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
533 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
534 ad = new AlignDeclaration(salign, Dsymbol::arraySyntaxCopy(decl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
535 return ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
536 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
537
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
538 void AlignDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
539 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
540 //printf("\tAlignDeclaration::semantic '%s'\n",toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
541 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
542 { unsigned salign_save = sc->structalign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
543
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
544 sc->structalign = salign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
545 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
546 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
547 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
548
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
549 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
550 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
551 sc->structalign = salign_save;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
552 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
553 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
554 sc->structalign = salign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
555 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
556
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
557
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
558 void AlignDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
559 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
560 buf->printf("align (%d)", salign);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
561 AttribDeclaration::toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
562 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
563
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
564 /********************************* AnonDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
565
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
566 AnonDeclaration::AnonDeclaration(Loc loc, int isunion, Array *decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
567 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
568 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
569 this->loc = loc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
570 this->isunion = isunion;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
571 this->scope = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
572 this->sem = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
573 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
574
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
575 Dsymbol *AnonDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
576 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
577 AnonDeclaration *ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
578
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
579 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
580 ad = new AnonDeclaration(loc, isunion, Dsymbol::arraySyntaxCopy(decl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
581 return ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
582 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
583
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
584 void AnonDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
585 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
586 //printf("\tAnonDeclaration::semantic %s %p\n", isunion ? "union" : "struct", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
587
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
588 Scope *scx = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
589 if (scope)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
590 { sc = scope;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
591 scx = scope;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
592 scope = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
593 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
594
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
595 assert(sc->parent);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
596
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
597 Dsymbol *parent = sc->parent->pastMixin();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
598 AggregateDeclaration *ad = parent->isAggregateDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
599
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
600 if (!ad || (!ad->isStructDeclaration() && !ad->isClassDeclaration()))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
601 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
602 error("can only be a part of an aggregate");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
603 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
604 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
605
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
606 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
607 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
608 AnonymousAggregateDeclaration aad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
609 int adisunion;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
610
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
611 if (sc->anonAgg)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
612 { ad = sc->anonAgg;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
613 adisunion = sc->inunion;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
614 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
615 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
616 adisunion = ad->isUnionDeclaration() != NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
617
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
618 // printf("\tsc->anonAgg = %p\n", sc->anonAgg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
619 // printf("\tad = %p\n", ad);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
620 // printf("\taad = %p\n", &aad);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
621
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
622 sc = sc->push();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
623 sc->anonAgg = &aad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
624 sc->stc &= ~(STCauto | STCscope | STCstatic);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
625 sc->inunion = isunion;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
626 sc->offset = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
627 sc->flags = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
628 aad.structalign = sc->structalign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
629 aad.parent = ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
630
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
631 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
632 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
633 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
634
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
635 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
636 if (isunion)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
637 sc->offset = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
638 if (aad.sizeok == 2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
639 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
640 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
641 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
642 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
643 sc = sc->pop();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
644
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
645 // If failed due to forward references, unwind and try again later
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
646 if (aad.sizeok == 2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
647 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
648 ad->sizeok = 2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
649 //printf("\tsetting ad->sizeok %p to 2\n", ad);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
650 if (!sc->anonAgg)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
651 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
652 scope = scx ? scx : new Scope(*sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
653 scope->setNoFree();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
654 scope->module->addDeferredSemantic(this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
655 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
656 //printf("\tforward reference %p\n", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
657 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
658 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
659 if (sem == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
660 { Module::dprogress++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
661 sem = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
662 //printf("\tcompleted %p\n", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
663 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
664 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
665 ;//printf("\talready completed %p\n", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
666
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
667 // 0 sized structs are set to 1 byte
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
668 if (aad.structsize == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
669 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
670 aad.structsize = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
671 aad.alignsize = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
672 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
673
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
674 // Align size of anonymous aggregate
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
675 //printf("aad.structalign = %d, aad.alignsize = %d, sc->offset = %d\n", aad.structalign, aad.alignsize, sc->offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
676 ad->alignmember(aad.structalign, aad.alignsize, &sc->offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
677 //ad->structsize = sc->offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
678 //printf("sc->offset = %d\n", sc->offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
679
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
680 // Add members of aad to ad
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
681 //printf("\tadding members of aad to '%s'\n", ad->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
682 for (unsigned i = 0; i < aad.fields.dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
683 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
684 VarDeclaration *v = (VarDeclaration *)aad.fields.data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
685
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
686 v->offset += sc->offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
687 ad->fields.push(v);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
688 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
689
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
690 // Add size of aad to ad
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
691 if (adisunion)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
692 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
693 if (aad.structsize > ad->structsize)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
694 ad->structsize = aad.structsize;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
695 sc->offset = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
696 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
697 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
698 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
699 ad->structsize = sc->offset + aad.structsize;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
700 sc->offset = ad->structsize;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
701 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
702
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
703 if (ad->alignsize < aad.alignsize)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
704 ad->alignsize = aad.alignsize;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
705 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
706 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
707
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
708
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
709 void AnonDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
710 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
711 buf->printf(isunion ? "union" : "struct");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
712 buf->writestring("\n{\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
713 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
714 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
715 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
716 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
717 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
718
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
719 //buf->writestring(" ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
720 s->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
721 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
722 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
723 buf->writestring("}\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
724 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
725
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
726 char *AnonDeclaration::kind()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
727 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
728 return (char *)(isunion ? "anonymous union" : "anonymous struct");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
729 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
730
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
731 /********************************* PragmaDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
732
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
733 PragmaDeclaration::PragmaDeclaration(Loc loc, Identifier *ident, Expressions *args, Array *decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
734 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
735 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
736 this->loc = loc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
737 this->ident = ident;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
738 this->args = args;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
739 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
740
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
741 Dsymbol *PragmaDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
742 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
743 PragmaDeclaration *pd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
744
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
745 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
746 pd = new PragmaDeclaration(loc, ident,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
747 Expression::arraySyntaxCopy(args), Dsymbol::arraySyntaxCopy(decl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
748 return pd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
749 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
750
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
751 void PragmaDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
752 { // Should be merged with PragmaStatement
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
753
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
754 #if IN_LLVM
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
755 int llvm_internal = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
756 char* llvm_str1 = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
757
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
758 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
759
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
760 //printf("\tPragmaDeclaration::semantic '%s'\n",toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
761 if (ident == Id::msg)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
762 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
763 if (args)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
764 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
765 for (size_t i = 0; i < args->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
766 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
767 Expression *e = (Expression *)args->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
768
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
769 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
770 e = e->optimize(WANTvalue | WANTinterpret);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
771 if (e->op == TOKstring)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
772 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
773 StringExp *se = (StringExp *)e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
774 fprintf(stdmsg, "%.*s", (int)se->len, se->string);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
775 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
776 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
777 error("string expected for message, not '%s'", e->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
778 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
779 fprintf(stdmsg, "\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
780 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
781 goto Lnodecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
782 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
783 else if (ident == Id::lib)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
784 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
785 if (!args || args->dim != 1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
786 error("string expected for library name");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
787 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
788 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
789 Expression *e = (Expression *)args->data[0];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
790
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
791 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
792 e = e->optimize(WANTvalue | WANTinterpret);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
793 args->data[0] = (void *)e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
794 if (e->op != TOKstring)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
795 error("string expected for library name, not '%s'", e->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
796 else if (global.params.verbose)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
797 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
798 StringExp *se = (StringExp *)e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
799 char *name = (char *)mem.malloc(se->len + 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
800 memcpy(name, se->string, se->len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
801 name[se->len] = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
802 printf("library %s\n", name);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
803 mem.free(name);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
804 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
805 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
806 goto Lnodecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
807 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
808 #if IN_GCC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
809 else if (ident == Id::GNU_asm)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
810 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
811 if (! args || args->dim != 2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
812 error("identifier and string expected for asm name");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
813 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
814 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
815 Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
816 Declaration *d = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
817 StringExp *s = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
818
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
819 e = (Expression *)args->data[0];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
820 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
821 if (e->op == TOKvar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
822 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
823 d = ((VarExp *)e)->var;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
824 if (! d->isFuncDeclaration() && ! d->isVarDeclaration())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
825 d = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
826 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
827 if (!d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
828 error("first argument of GNU_asm must be a function or variable declaration");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
829
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
830 e = (Expression *)args->data[1];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
831 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
832 e = e->optimize(WANTvalue);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
833 if (e->op == TOKstring && ((StringExp *)e)->sz == 1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
834 s = ((StringExp *)e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
835 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
836 error("second argument of GNU_asm must be a char string");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
837
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
838 if (d && s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
839 d->c_ident = Lexer::idPool((char*) s->string);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
840 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
841 goto Lnodecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
842 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
843 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
844 #if IN_LLVM
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
845 else if (ident == Id::LLVM_internal)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
846 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
847 if (!args || args->dim < 1 || args->dim > 2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
848 error("needs 1-3 parameters");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
849 else if (!decl || decl->dim < 1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
850 error("must apply to at least one declaration");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
851 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
852 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
853 Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
854 StringExp *s = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
855
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
856 e = (Expression *)args->data[0];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
857 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
858 e = e->optimize(WANTvalue);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
859 if (e->op == TOKstring && (s = (StringExp *)e))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
860 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
861 char* str = (char*)s->string;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
862 if (strcmp(str,"intrinsic")==0) {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
863 llvm_internal = LLVMintrinsic;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
864 assert(args->dim == 2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
865 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
866 else if (strcmp(str,"va_start")==0) {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
867 llvm_internal = LLVMva_start;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
868 assert(args->dim == 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
869 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
870 else if (strcmp(str,"va_arg")==0) {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
871 llvm_internal = LLVMva_arg;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
872 assert(args->dim == 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
873 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
874 else if (strcmp(str,"va_intrinsic")==0) {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
875 llvm_internal = LLVMva_intrinsic;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
876 assert(args->dim == 2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
877 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
878 else if (strcmp(str,"notypeinfo")==0) {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
879 llvm_internal = LLVMnotypeinfo;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
880 assert(args->dim == 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
881 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
882 else if (strcmp(str,"alloca")==0) {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
883 llvm_internal = LLVMalloca;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
884 assert(args->dim == 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
885 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
886 else {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
887 error("unknown pragma command: %s", str);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
888 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
889 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
890 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
891 error("1st argument must be a string");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
892
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
893 if (llvm_internal)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
894 switch (llvm_internal)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
895 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
896 case LLVMintrinsic:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
897 case LLVMva_intrinsic:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
898 e = (Expression *)args->data[1];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
899 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
900 e = e->optimize(WANTvalue);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
901 if (e->op == TOKstring && (s = (StringExp *)e)) {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
902 llvm_str1 = (char*)s->string;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
903 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
904 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
905 error("2nd argument must be a string");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
906 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
907
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
908 case LLVMva_arg:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
909 case LLVMva_start:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
910 case LLVMnotypeinfo:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
911 case LLVMalloca:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
912 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
913
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
914 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
915 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
916 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
917 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
918 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
919 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
920 else if (global.params.ignoreUnsupportedPragmas)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
921 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
922 if (global.params.verbose)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
923 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
924 /* Print unrecognized pragmas
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
925 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
926 printf("pragma %s", ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
927 if (args)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
928 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
929 for (size_t i = 0; i < args->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
930 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
931 Expression *e = (Expression *)args->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
932 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
933 e = e->optimize(WANTvalue | WANTinterpret);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
934 if (i == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
935 printf(" (");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
936 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
937 printf(",");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
938 printf("%s", e->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
939 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
940 if (args->dim)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
941 printf(")");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
942 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
943 printf("\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
944 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
945 goto Lnodecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
946 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
947 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
948 error("unrecognized pragma(%s)", ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
949
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
950 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
951 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
952 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
953 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
954 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
955
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
956 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
957
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
958 #if IN_LLVM
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
959 if (llvm_internal)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
960 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
961 switch(llvm_internal)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
962 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
963 case LLVMintrinsic:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
964 case LLVMva_intrinsic:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
965 if (FuncDeclaration* fd = s->isFuncDeclaration()) {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
966 fd->llvmInternal = llvm_internal;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
967 fd->llvmInternal1 = llvm_str1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
968 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
969 else {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
970 error("may only be used on function declarations");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
971 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
972 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
973 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
974
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
975 case LLVMva_start:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
976 case LLVMva_arg:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
977 if (TemplateDeclaration* td = s->isTemplateDeclaration()) {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
978 td->llvmInternal = llvm_internal;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
979 assert(td->parameters->dim == 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
980 assert(!td->overnext);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
981 assert(!td->overroot);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
982 assert(td->onemember);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
983 Logger::println("template->onemember = %s", td->onemember->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
984 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
985 else {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
986 error("can only be used on templates");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
987 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
988 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
989 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
990
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
991 case LLVMnotypeinfo:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
992 s->llvmInternal = llvm_internal;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
993 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
994
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
995 case LLVMalloca:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
996 if (FuncDeclaration* fd = s->isFuncDeclaration()) {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
997 fd->llvmInternal = llvm_internal;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
998 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
999 else {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1000 error("may only be used on function declarations");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1001 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1002 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1003 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1004
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1005 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1006 assert(0 && "invalid LLVM_internal pragma got through :/");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1007 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1008 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1009
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1010 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1011 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1012 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1013 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1014
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1015 Lnodecl:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1016 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1017 error("pragma is missing closing ';'");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1018 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1019
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1020 int PragmaDeclaration::oneMember(Dsymbol **ps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1021 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1022 *ps = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1023 return TRUE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1024 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1025
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1026 char *PragmaDeclaration::kind()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1027 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1028 return "pragma";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1029 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1030
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1031 void PragmaDeclaration::toObjFile()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1032 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1033 if (ident == Id::lib)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1034 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1035 assert(args && args->dim == 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1036
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1037 Expression *e = (Expression *)args->data[0];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1038
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1039 assert(e->op == TOKstring);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1040
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1041 StringExp *se = (StringExp *)e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1042 char *name = (char *)mem.malloc(se->len + 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1043 memcpy(name, se->string, se->len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1044 name[se->len] = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1045 obj_includelib(name);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1046 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1047 AttribDeclaration::toObjFile();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1048 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1049
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1050 void PragmaDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1051 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1052 buf->printf("pragma(%s", ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1053 if (args)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1054 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1055 for (size_t i = 0; i < args->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1056 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1057 Expression *e = (Expression *)args->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1058
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1059 buf->writestring(", ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1060 e->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1061 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1062 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1063 buf->writestring(")");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1064 AttribDeclaration::toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1065 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1066
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1067
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1068 /********************************* ConditionalDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1069
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1070 ConditionalDeclaration::ConditionalDeclaration(Condition *condition, Array *decl, Array *elsedecl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1071 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1072 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1073 //printf("ConditionalDeclaration::ConditionalDeclaration()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1074 this->condition = condition;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1075 this->elsedecl = elsedecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1076 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1077
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1078 Dsymbol *ConditionalDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1079 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1080 ConditionalDeclaration *dd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1081
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1082 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1083 dd = new ConditionalDeclaration(condition->syntaxCopy(),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1084 Dsymbol::arraySyntaxCopy(decl),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1085 Dsymbol::arraySyntaxCopy(elsedecl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1086 return dd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1087 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1088
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1089
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1090 int ConditionalDeclaration::oneMember(Dsymbol **ps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1091 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1092 //printf("ConditionalDeclaration::oneMember(), inc = %d\n", condition->inc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1093 if (condition->inc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1094 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1095 Array *d = condition->include(NULL, NULL) ? decl : elsedecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1096 return Dsymbol::oneMembers(d, ps);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1097 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1098 *ps = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1099 return TRUE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1100 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1101
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1102 void ConditionalDeclaration::emitComment(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1103 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1104 //printf("ConditionalDeclaration::emitComment(sc = %p)\n", sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1105 if (condition->inc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1106 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1107 AttribDeclaration::emitComment(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1108 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1109 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1110
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1111 // Decide if 'then' or 'else' code should be included
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1112
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1113 Array *ConditionalDeclaration::include(Scope *sc, ScopeDsymbol *sd)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1114 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1115 //printf("ConditionalDeclaration::include()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1116 assert(condition);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1117 return condition->include(sc, sd) ? decl : elsedecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1118 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1119
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1120
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1121 void ConditionalDeclaration::addComment(unsigned char *comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1122 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1123 /* Because addComment is called by the parser, if we called
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1124 * include() it would define a version before it was used.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1125 * But it's no problem to drill down to both decl and elsedecl,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1126 * so that's the workaround.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1127 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1128
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1129 if (comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1130 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1131 Array *d = decl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1132
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1133 for (int j = 0; j < 2; j++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1134 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1135 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1136 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1137 for (unsigned i = 0; i < d->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1138 { Dsymbol *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1139
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1140 s = (Dsymbol *)d->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1141 //printf("ConditionalDeclaration::addComment %s\n", s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1142 s->addComment(comment);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1143 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1144 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1145 d = elsedecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1146 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1147 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1148 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1149
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1150 void ConditionalDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1151 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1152 condition->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1153 if (decl || elsedecl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1154 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1155 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1156 buf->writeByte('{');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1157 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1158 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1159 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1160 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1161 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1162 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1163
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1164 buf->writestring(" ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1165 s->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1166 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1167 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1168 buf->writeByte('}');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1169 if (elsedecl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1170 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1171 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1172 buf->writestring("else");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1173 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1174 buf->writeByte('{');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1175 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1176 for (unsigned i = 0; i < elsedecl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1177 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1178 Dsymbol *s = (Dsymbol *)elsedecl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1179
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1180 buf->writestring(" ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1181 s->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1182 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1183 buf->writeByte('}');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1184 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1185 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1186 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1187 buf->writeByte(':');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1188 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1189 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1190
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1191 /***************************** StaticIfDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1192
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1193 StaticIfDeclaration::StaticIfDeclaration(Condition *condition,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1194 Array *decl, Array *elsedecl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1195 : ConditionalDeclaration(condition, decl, elsedecl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1196 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1197 //printf("StaticIfDeclaration::StaticIfDeclaration()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1198 sd = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1199 addisdone = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1200 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1201
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1202
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1203 Dsymbol *StaticIfDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1204 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1205 StaticIfDeclaration *dd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1206
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1207 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1208 dd = new StaticIfDeclaration(condition->syntaxCopy(),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1209 Dsymbol::arraySyntaxCopy(decl),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1210 Dsymbol::arraySyntaxCopy(elsedecl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1211 return dd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1212 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1213
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1214
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1215 int StaticIfDeclaration::addMember(Scope *sc, ScopeDsymbol *sd, int memnum)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1216 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1217 /* This is deferred until semantic(), so that
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1218 * expressions in the condition can refer to declarations
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1219 * in the same scope, such as:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1220 *
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1221 * template Foo(int i)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1222 * {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1223 * const int j = i + 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1224 * static if (j == 3)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1225 * const int k;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1226 * }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1227 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1228 this->sd = sd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1229 int m = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1230
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1231 if (memnum == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1232 { m = AttribDeclaration::addMember(sc, sd, memnum);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1233 addisdone = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1234 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1235 return m;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1236 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1237
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1238
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1239 void StaticIfDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1240 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1241 Array *d = include(sc, sd);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1242
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1243 //printf("\tStaticIfDeclaration::semantic '%s'\n",toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1244 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1245 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1246 if (!addisdone)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1247 { AttribDeclaration::addMember(sc, sd, 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1248 addisdone = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1249 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1250
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1251 for (unsigned i = 0; i < d->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1252 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1253 Dsymbol *s = (Dsymbol *)d->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1254
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1255 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1256 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1257 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1258 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1259
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1260 char *StaticIfDeclaration::kind()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1261 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1262 return "static if";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1263 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1264
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1265
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1266 /***************************** CompileDeclaration *****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1267
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1268 CompileDeclaration::CompileDeclaration(Loc loc, Expression *exp)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1269 : AttribDeclaration(NULL)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1270 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1271 this->exp = exp;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1272 this->sd = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1273 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1274
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1275 Dsymbol *CompileDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1276 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1277 //printf("CompileDeclaration::syntaxCopy('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1278 CompileDeclaration *sc = new CompileDeclaration(loc, exp->syntaxCopy());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1279 return sc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1280 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1281
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1282 int CompileDeclaration::addMember(Scope *sc, ScopeDsymbol *sd, int memnum)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1283 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1284 this->sd = sd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1285 return memnum;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1286 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1287
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1288 void CompileDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1289 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1290 //printf("CompileDeclaration::semantic()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1291 exp = exp->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1292 exp = resolveProperties(sc, exp);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1293 exp = exp->optimize(WANTvalue | WANTinterpret);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1294 if (exp->op != TOKstring)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1295 { error("argument to mixin must be a string, not (%s)", exp->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1296 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1297 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1298 StringExp *se = (StringExp *)exp;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1299 se = se->toUTF8(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1300 Parser p(sc->module, (unsigned char *)se->string, se->len, 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1301 p.loc = loc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1302 p.nextToken();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1303 decl = p.parseDeclDefs(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1304 if (p.token.value != TOKeof)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1305 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1306 error("incomplete mixin declaration (%s)", se->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1307 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1308
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1309 AttribDeclaration::addMember(sc, sd, 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1310 AttribDeclaration::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1311 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1312
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1313 void CompileDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1314 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1315 buf->writestring("mixin(");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1316 exp->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1317 buf->writestring(");");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1318 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1319 }