annotate dmd/dsymbol.c @ 1351:8d501abecd24

Initial (but disabled) fix for ticket #294 , the actual part that fixes the bug is in a #if 0 block as I'm afraid it will cause regressions. I'm most likely not going to be around tonight, and maybe not tomorrow as well, so I'm pushing it in case someone wants to run some serious testing/investigate the problem noted in llvmhelpers.cpp : realignOffset .
author Tomas Lindquist Olsen <tomas.l.olsen gmail com>
date Thu, 14 May 2009 17:20:17 +0200
parents dbe4af57b240
children 78038e540342
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
2 // Compiler implementation of the D programming language
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
3 // Copyright (c) 1999-2008 by Digital Mars
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
4 // All Rights Reserved
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
5 // written by Walter Bright
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
6 // http://www.digitalmars.com
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
7 // License for redistribution is by either the Artistic License
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
8 // in artistic.txt, or the GNU General Public License in gnu.txt.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
9 // See the included readme.txt for details.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
10
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
11 #include <stdio.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
12 #include <string.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
13 #include <assert.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
14
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 946
diff changeset
15 #include "rmem.h"
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
16
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
17 #include "mars.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
18 #include "dsymbol.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
19 #include "aggregate.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
20 #include "identifier.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
21 #include "module.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
22 #include "mtype.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
23 #include "expression.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
24 #include "statement.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
25 #include "declaration.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
26 #include "id.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
27 #include "scope.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
28 #include "init.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
29 #include "import.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
30 #include "template.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
31
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
32 #include "../gen/enums.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
33
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
34 /****************************** Dsymbol ******************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
35
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
36 Dsymbol::Dsymbol()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
37 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
38 //printf("Dsymbol::Dsymbol(%p)\n", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
39 this->ident = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
40 this->c_ident = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
41 this->parent = NULL;
1146
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
42 #if IN_DMD
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
43 this->csym = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
44 this->isym = NULL;
1146
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
45 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
46 this->loc = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
47 this->comment = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
48
1146
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
49 #if IN_LLVM
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
50 this->llvmInternal = LLVMnone;
1147
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1146
diff changeset
51 this->irsym = NULL;
1146
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
52 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
53 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
54
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
55 Dsymbol::Dsymbol(Identifier *ident)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
56 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
57 //printf("Dsymbol::Dsymbol(%p, ident)\n", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
58 this->ident = ident;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
59 this->c_ident = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
60 this->parent = NULL;
1146
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
61 #if IN_DMD
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
62 this->csym = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
63 this->isym = NULL;
1146
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
64 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
65 this->loc = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
66 this->comment = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
67
1146
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
68 #if IN_LLVM
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
69 this->llvmInternal = LLVMnone;
1147
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1146
diff changeset
70 this->irsym = NULL;
1146
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
71 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
72 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
73
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
74 int Dsymbol::equals(Object *o)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
75 { Dsymbol *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
76
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
77 if (this == o)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
78 return TRUE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
79 s = (Dsymbol *)(o);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
80 if (s && ident->equals(s->ident))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
81 return TRUE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
82 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
83 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
84
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
85 /**************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
86 * Copy the syntax.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
87 * Used for template instantiations.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
88 * If s is NULL, allocate the new object, otherwise fill it in.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
89 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
90
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
91 Dsymbol *Dsymbol::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
92 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
93 print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
94 printf("%s %s\n", kind(), toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
95 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
96 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
97 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
98
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
99 /**************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
100 * Determine if this symbol is only one.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
101 * Returns:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
102 * FALSE, *ps = NULL: There are 2 or more symbols
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
103 * TRUE, *ps = NULL: There are zero symbols
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
104 * TRUE, *ps = symbol: The one and only one symbol
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
105 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
106
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
107 int Dsymbol::oneMember(Dsymbol **ps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
108 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
109 //printf("Dsymbol::oneMember()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
110 *ps = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
111 return TRUE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
112 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
113
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
114 /*****************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
115 * Same as Dsymbol::oneMember(), but look at an array of Dsymbols.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
116 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
117
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
118 int Dsymbol::oneMembers(Array *members, Dsymbol **ps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
119 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
120 //printf("Dsymbol::oneMembers() %d\n", members ? members->dim : 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
121 Dsymbol *s = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
122
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
123 if (members)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
124 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
125 for (int i = 0; i < members->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
126 { Dsymbol *sx = (Dsymbol *)members->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
127
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
128 int x = sx->oneMember(ps);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
129 //printf("\t[%d] kind %s = %d, s = %p\n", i, sx->kind(), x, *ps);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
130 if (!x)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
131 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
132 //printf("\tfalse 1\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
133 assert(*ps == NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
134 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
135 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
136 if (*ps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
137 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
138 if (s) // more than one symbol
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
139 { *ps = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
140 //printf("\tfalse 2\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
141 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
142 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
143 s = *ps;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
144 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
145 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
146 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
147 *ps = s; // s is the one symbol, NULL if none
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
148 //printf("\ttrue\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
149 return TRUE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
150 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
151
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
152 /*****************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
153 * Is Dsymbol a variable that contains pointers?
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
154 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
155
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
156 int Dsymbol::hasPointers()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
157 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
158 //printf("Dsymbol::hasPointers() %s\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
159 return 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
160 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
161
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
162 char *Dsymbol::toChars()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
163 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
164 return ident ? ident->toChars() : (char *)"__anonymous";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
165 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
166
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
167 char *Dsymbol::toPrettyChars()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
168 { Dsymbol *p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
169 char *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
170 char *q;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
171 size_t len;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
172
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
173 //printf("Dsymbol::toPrettyChars() '%s'\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
174 if (!parent)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
175 return toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
176
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
177 len = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
178 for (p = this; p; p = p->parent)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
179 len += strlen(p->toChars()) + 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
180
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
181 s = (char *)mem.malloc(len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
182 q = s + len - 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
183 *q = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
184 for (p = this; p; p = p->parent)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
185 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
186 char *t = p->toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
187 len = strlen(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
188 q -= len;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
189 memcpy(q, t, len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
190 if (q == s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
191 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
192 q--;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
193 *q = '.';
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
194 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
195 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
196 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
197
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
198 char *Dsymbol::locToChars()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
199 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
200 OutBuffer buf;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
201 char *p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
202
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
203 Module *m = getModule();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
204
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
205 if (m && m->srcfile)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
206 loc.filename = m->srcfile->toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
207 return loc.toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
208 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
209
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
210 const char *Dsymbol::kind()
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
211 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
212 return "symbol";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
213 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
214
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
215 /*********************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
216 * If this symbol is really an alias for another,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
217 * return that other.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
218 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
219
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
220 Dsymbol *Dsymbol::toAlias()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
221 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
222 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
223 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
224
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
225 Dsymbol *Dsymbol::toParent()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
226 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
227 return parent ? parent->pastMixin() : NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
228 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
229
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
230 Dsymbol *Dsymbol::pastMixin()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
231 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
232 Dsymbol *s = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
233
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
234 //printf("Dsymbol::pastMixin() %s\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
235 while (s && s->isTemplateMixin())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
236 s = s->parent;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
237 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
238 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
239
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
240 /**********************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
241 * Use this instead of toParent() when looking for the
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
242 * 'this' pointer of the enclosing function/class.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
243 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
244
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
245 Dsymbol *Dsymbol::toParent2()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
246 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
247 Dsymbol *s = parent;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
248 while (s && s->isTemplateInstance())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
249 s = s->parent;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
250 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
251 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
252
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
253 TemplateInstance *Dsymbol::inTemplateInstance()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
254 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
255 for (Dsymbol *parent = this->parent; parent; parent = parent->parent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
256 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
257 TemplateInstance *ti = parent->isTemplateInstance();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
258 if (ti)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
259 return ti;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
260 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
261 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
262 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
263
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
264 int Dsymbol::isAnonymous()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
265 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
266 return ident ? 0 : 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
267 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
268
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
269 void Dsymbol::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
270 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
271 error("%p has no semantic routine", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
272 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
273
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
274 void Dsymbol::semantic2(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
275 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
276 // Most Dsymbols have no further semantic analysis needed
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
277 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
278
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
279 void Dsymbol::semantic3(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
280 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
281 // Most Dsymbols have no further semantic analysis needed
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
282 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
283
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
284 void Dsymbol::inlineScan()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
285 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
286 // Most Dsymbols have no further semantic analysis needed
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
287 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
288
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
289 /*********************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
290 * Search for ident as member of s.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
291 * Input:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
292 * flags: 1 don't find private members
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
293 * 2 don't give error messages
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
294 * 4 return NULL if ambiguous
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
295 * Returns:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
296 * NULL if not found
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
297 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
298
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
299 Dsymbol *Dsymbol::search(Loc loc, Identifier *ident, int flags)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
300 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
301 //printf("Dsymbol::search(this=%p,%s, ident='%s')\n", this, toChars(), ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
302 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
303 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
304
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
305 /***************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
306 * Search for identifier id as a member of 'this'.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
307 * id may be a template instance.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
308 * Returns:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
309 * symbol found, NULL if not
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
310 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
311
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
312 Dsymbol *Dsymbol::searchX(Loc loc, Scope *sc, Identifier *id)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
313 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
314 //printf("Dsymbol::searchX(this=%p,%s, ident='%s')\n", this, toChars(), ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
315 Dsymbol *s = toAlias();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
316 Dsymbol *sm;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
317
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
318 switch (id->dyncast())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
319 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
320 case DYNCAST_IDENTIFIER:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
321 sm = s->search(loc, id, 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
322 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
323
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
324 case DYNCAST_DSYMBOL:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
325 { // It's a template instance
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
326 //printf("\ttemplate instance id\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
327 Dsymbol *st = (Dsymbol *)id;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
328 TemplateInstance *ti = st->isTemplateInstance();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
329 id = ti->name;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
330 sm = s->search(loc, id, 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
331 if (!sm)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
332 { error("template identifier %s is not a member of %s %s",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
333 id->toChars(), s->kind(), s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
334 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
335 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
336 sm = sm->toAlias();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
337 TemplateDeclaration *td = sm->isTemplateDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
338 if (!td)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
339 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
340 error("%s is not a template, it is a %s", id->toChars(), sm->kind());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
341 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
342 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
343 ti->tempdecl = td;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
344 if (!ti->semanticdone)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
345 ti->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
346 sm = ti->toAlias();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
347 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
348 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
349
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
350 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
351 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
352 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
353 return sm;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
354 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
355
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
356 int Dsymbol::overloadInsert(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
357 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
358 //printf("Dsymbol::overloadInsert('%s')\n", s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
359 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
360 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
361
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
362 void Dsymbol::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
363 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
364 buf->writestring(toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
365 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
366
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
367 unsigned Dsymbol::size(Loc loc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
368 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
369 error("Dsymbol '%s' has no size\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
370 return 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
371 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
372
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
373 int Dsymbol::isforwardRef()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
374 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
375 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
376 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
377
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
378 AggregateDeclaration *Dsymbol::isThis()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
379 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
380 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
381 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
382
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
383 ClassDeclaration *Dsymbol::isClassMember() // are we a member of a class?
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
384 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
385 Dsymbol *parent = toParent();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
386 if (parent && parent->isClassDeclaration())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
387 return (ClassDeclaration *)parent;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
388 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
389 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
390
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
391 void Dsymbol::defineRef(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
392 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
393 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
394 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
395
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
396 int Dsymbol::isExport()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
397 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
398 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
399 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
400
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
401 int Dsymbol::isImportedSymbol()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
402 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
403 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
404 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
405
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
406 int Dsymbol::isDeprecated()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
407 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
408 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
409 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
410
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
411 LabelDsymbol *Dsymbol::isLabel() // is this a LabelDsymbol()?
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
412 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
413 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
414 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
415
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
416 AggregateDeclaration *Dsymbol::isMember() // is this a member of an AggregateDeclaration?
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
417 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
418 //printf("Dsymbol::isMember() %s\n", toChars());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
419 Dsymbol *parent = toParent();
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
420 //printf("parent is %s %s\n", parent->kind(), parent->toChars());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
421 return parent ? parent->isAggregateDeclaration() : NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
422 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
423
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
424 Type *Dsymbol::getType()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
425 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
426 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
427 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
428
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
429 int Dsymbol::needThis()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
430 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
431 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
432 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
433
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
434 int Dsymbol::addMember(Scope *sc, ScopeDsymbol *sd, int memnum)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
435 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
436 //printf("Dsymbol::addMember('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
437 //printf("Dsymbol::addMember(this = %p, '%s' scopesym = '%s')\n", this, toChars(), sd->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
438 //printf("Dsymbol::addMember(this = %p, '%s' sd = %p, sd->symtab = %p)\n", this, toChars(), sd, sd->symtab);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
439 parent = sd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
440 if (!isAnonymous()) // no name, so can't add it to symbol table
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
441 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
442 if (!sd->symtab->insert(this)) // if name is already defined
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
443 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
444 Dsymbol *s2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
445
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
446 s2 = sd->symtab->lookup(ident);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
447 if (!s2->overloadInsert(this))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
448 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
449 sd->multiplyDefined(0, this, s2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
450 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
451 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
452 if (sd->isAggregateDeclaration() || sd->isEnumDeclaration())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
453 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
454 if (ident == Id::__sizeof || ident == Id::alignof || ident == Id::mangleof)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
455 error(".%s property cannot be redefined", ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
456 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
457 return 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
458 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
459 return 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
460 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
461
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
462 void Dsymbol::error(const char *format, ...)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
463 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
464 //printf("Dsymbol::error()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
465 if (!global.gag)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
466 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
467 char *p = locToChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
468
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
469 if (*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
470 fprintf(stdmsg, "%s: ", p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
471 mem.free(p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
472
427
f1d37dc5d354 Give errors originating from Dsymbol::error the proper 'Error:' heading.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
473 fprintf(stdmsg, "Error: ");
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
474 if (isAnonymous())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
475 fprintf(stdmsg, "%s ", kind());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
476 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
477 fprintf(stdmsg, "%s %s ", kind(), toPrettyChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
478
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
479 va_list ap;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
480 va_start(ap, format);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
481 vfprintf(stdmsg, format, ap);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
482 va_end(ap);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
483
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
484 fprintf(stdmsg, "\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
485 fflush(stdmsg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
486 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
487 global.errors++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
488
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
489 //fatal();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
490 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
491
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
492 void Dsymbol::error(Loc loc, const char *format, ...)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
493 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
494 if (!global.gag)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
495 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
496 char *p = loc.toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
497 if (!*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
498 p = locToChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
499
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
500 if (*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
501 fprintf(stdmsg, "%s: ", p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
502 mem.free(p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
503
427
f1d37dc5d354 Give errors originating from Dsymbol::error the proper 'Error:' heading.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
504 fprintf(stdmsg, "Error: ");
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
505 fprintf(stdmsg, "%s %s ", kind(), toPrettyChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
506
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
507 va_list ap;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
508 va_start(ap, format);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
509 vfprintf(stdmsg, format, ap);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
510 va_end(ap);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
511
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
512 fprintf(stdmsg, "\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
513 fflush(stdmsg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
514 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
515
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
516 global.errors++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
517
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
518 //fatal();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
519 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
520
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
521 void Dsymbol::checkDeprecated(Loc loc, Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
522 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
523 if (!global.params.useDeprecated && isDeprecated())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
524 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
525 // Don't complain if we're inside a deprecated symbol's scope
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
526 for (Dsymbol *sp = sc->parent; sp; sp = sp->parent)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
527 { if (sp->isDeprecated())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
528 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
529 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
530
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
531 for (; sc; sc = sc->enclosing)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
532 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
533 if (sc->scopesym && sc->scopesym->isDeprecated())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
534 return;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
535
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
536 // If inside a StorageClassDeclaration that is deprecated
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
537 if (sc->stc & STCdeprecated)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
538 return;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
539 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
540
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
541 error(loc, "is deprecated");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
542 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
543 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
544
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
545 /**********************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
546 * Determine which Module a Dsymbol is in.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
547 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
548
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
549 Module *Dsymbol::getModule()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
550 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
551 Module *m;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
552 Dsymbol *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
553
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
554 //printf("Dsymbol::getModule()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
555 s = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
556 while (s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
557 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
558 //printf("\ts = '%s'\n", s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
559 m = s->isModule();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
560 if (m)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
561 return m;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
562 s = s->parent;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
563 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
564 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
565 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
566
946
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
567
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
568 /**********************************
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
569 * Determine which Module a Dsymbol will be compiled in.
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
570 * This may be different from getModule for templates.
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
571 */
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
572
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
573 Module *Dsymbol::getCompilationModule()
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
574 {
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
575 Module *m;
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
576 TemplateInstance *ti;
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
577 Dsymbol *s;
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
578
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
579 //printf("Dsymbol::getModule()\n");
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
580 s = this;
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
581 while (s)
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
582 {
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
583 //printf("\ts = '%s'\n", s->toChars());
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
584 m = s->isModule();
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
585 if (m)
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
586 return m;
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
587 ti = s->isTemplateInstance();
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
588 if (ti && ti->tmodule)
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
589 return ti->tmodule;
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
590 s = s->parent;
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
591 }
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
592 return NULL;
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
593 }
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
594
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
595 /*************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
596 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
597
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
598 enum PROT Dsymbol::prot()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
599 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
600 return PROTpublic;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
601 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
602
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
603 /*************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
604 * Do syntax copy of an array of Dsymbol's.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
605 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
606
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
607
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
608 Array *Dsymbol::arraySyntaxCopy(Array *a)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
609 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
610
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
611 Array *b = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
612 if (a)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
613 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
614 b = a->copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
615 for (int i = 0; i < b->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
616 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
617 Dsymbol *s = (Dsymbol *)b->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
618
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
619 s = s->syntaxCopy(NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
620 b->data[i] = (void *)s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
621 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
622 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
623 return b;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
624 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
625
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
626
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
627 /****************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
628 * Add documentation comment to Dsymbol.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
629 * Ignore NULL comments.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
630 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
631
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
632 void Dsymbol::addComment(unsigned char *comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
633 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
634 // if (comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
635 // printf("adding comment '%s' to symbol %p '%s'\n", comment, this, toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
636
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
637 if (!this->comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
638 this->comment = comment;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
639 #if 1
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
640 else if (comment && strcmp((char *)comment, (char *)this->comment))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
641 { // Concatenate the two
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
642 this->comment = Lexer::combineComments(this->comment, comment);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
643 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
644 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
645 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
646
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
647
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
648 /********************************* ScopeDsymbol ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
649
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
650 ScopeDsymbol::ScopeDsymbol()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
651 : Dsymbol()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
652 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
653 members = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
654 symtab = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
655 imports = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
656 prots = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
657 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
658
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
659 ScopeDsymbol::ScopeDsymbol(Identifier *id)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
660 : Dsymbol(id)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
661 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
662 members = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
663 symtab = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
664 imports = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
665 prots = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
666 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
667
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
668 Dsymbol *ScopeDsymbol::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
669 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
670 //printf("ScopeDsymbol::syntaxCopy('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
671
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
672 ScopeDsymbol *sd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
673 if (s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
674 sd = (ScopeDsymbol *)s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
675 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
676 sd = new ScopeDsymbol(ident);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
677 sd->members = arraySyntaxCopy(members);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
678 return sd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
679 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
680
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
681 Dsymbol *ScopeDsymbol::search(Loc loc, Identifier *ident, int flags)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
682 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
683 //printf("%s->ScopeDsymbol::search(ident='%s', flags=x%x)\n", toChars(), ident->toChars(), flags);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
684
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
685 // Look in symbols declared in this module
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
686 Dsymbol *s = symtab ? symtab->lookup(ident) : NULL;
626
e83ba4ae4878 Fix import visibility bugs 313 and 314.
Christian Kamm <kamm incasoftware de>
parents: 443
diff changeset
687
e83ba4ae4878 Fix import visibility bugs 313 and 314.
Christian Kamm <kamm incasoftware de>
parents: 443
diff changeset
688 // hide private nonlocal symbols
e83ba4ae4878 Fix import visibility bugs 313 and 314.
Christian Kamm <kamm incasoftware de>
parents: 443
diff changeset
689 if (flags & 1 && s && s->prot() == PROTprivate)
e83ba4ae4878 Fix import visibility bugs 313 and 314.
Christian Kamm <kamm incasoftware de>
parents: 443
diff changeset
690 s = NULL;
e83ba4ae4878 Fix import visibility bugs 313 and 314.
Christian Kamm <kamm incasoftware de>
parents: 443
diff changeset
691
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
692 if (s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
693 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
694 //printf("\ts = '%s.%s'\n",toChars(),s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
695 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
696 else if (imports)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
697 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
698 // Look in imported modules
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
699 for (int i = 0; i < imports->dim; i++)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
700 { ScopeDsymbol *ss = (ScopeDsymbol *)imports->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
701 Dsymbol *s2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
702
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
703 // If private import, don't search it
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
704 if (flags & 1 && prots[i] == PROTprivate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
705 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
706
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
707 //printf("\tscanning import '%s', prots = %d, isModule = %p, isImport = %p\n", ss->toChars(), prots[i], ss->isModule(), ss->isImport());
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
708 /* Don't find private members if ss is a module
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
709 */
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
710 s2 = ss->search(loc, ident, ss->isModule() ? 1 : 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
711 if (!s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
712 s = s2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
713 else if (s2 && s != s2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
714 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
715 if (s->toAlias() == s2->toAlias())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
716 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
717 /* After following aliases, we found the same symbol,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
718 * so it's not an ambiguity.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
719 * But if one alias is deprecated, prefer the other.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
720 */
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
721 if (s->isDeprecated())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
722 s = s2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
723 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
724 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
725 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
726 /* Two imports of the same module should be regarded as
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
727 * the same.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
728 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
729 Import *i1 = s->isImport();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
730 Import *i2 = s2->isImport();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
731 if (!(i1 && i2 &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
732 (i1->mod == i2->mod ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
733 (!i1->parent->isImport() && !i2->parent->isImport() &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
734 i1->ident->equals(i2->ident))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
735 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
736 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
737 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
738 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
739 ss->multiplyDefined(loc, s, s2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
740 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
741 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
742 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
743 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
744 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
745 if (s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
746 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
747 Declaration *d = s->isDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
748 if (d && d->protection == PROTprivate && !d->parent->isTemplateMixin())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
749 error("%s is private", d->toPrettyChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
750 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
751 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
752 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
753 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
754
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
755 void ScopeDsymbol::importScope(ScopeDsymbol *s, enum PROT protection)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
756 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
757 //printf("%s->ScopeDsymbol::importScope(%s, %d)\n", toChars(), s->toChars(), protection);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
758
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
759 // No circular or redundant import's
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
760 if (s != this)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
761 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
762 if (!imports)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
763 imports = new Array();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
764 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
765 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
766 for (int i = 0; i < imports->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
767 { ScopeDsymbol *ss;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
768
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
769 ss = (ScopeDsymbol *) imports->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
770 if (ss == s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
771 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
772 if (protection > prots[i])
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
773 prots[i] = protection; // upgrade access
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
774 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
775 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
776 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
777 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
778 imports->push(s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
779 prots = (unsigned char *)mem.realloc(prots, imports->dim * sizeof(prots[0]));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
780 prots[imports->dim - 1] = protection;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
781 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
782 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
783
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
784 int ScopeDsymbol::isforwardRef()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
785 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
786 return (members == NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
787 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
788
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
789 void ScopeDsymbol::defineRef(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
790 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
791 ScopeDsymbol *ss;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
792
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
793 ss = s->isScopeDsymbol();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
794 members = ss->members;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
795 ss->members = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
796 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
797
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
798 void ScopeDsymbol::multiplyDefined(Loc loc, Dsymbol *s1, Dsymbol *s2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
799 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
800 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
801 printf("ScopeDsymbol::multiplyDefined()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
802 printf("s1 = %p, '%s' kind = '%s', parent = %s\n", s1, s1->toChars(), s1->kind(), s1->parent ? s1->parent->toChars() : "");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
803 printf("s2 = %p, '%s' kind = '%s', parent = %s\n", s2, s2->toChars(), s2->kind(), s2->parent ? s2->parent->toChars() : "");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
804 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
805 if (loc.filename)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
806 { ::error(loc, "%s at %s conflicts with %s at %s",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
807 s1->toPrettyChars(),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
808 s1->locToChars(),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
809 s2->toPrettyChars(),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
810 s2->locToChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
811 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
812 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
813 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
814 s1->error(loc, "conflicts with %s %s at %s",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
815 s2->kind(),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
816 s2->toPrettyChars(),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
817 s2->locToChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
818 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
819 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
820
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
821 Dsymbol *ScopeDsymbol::nameCollision(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
822 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
823 Dsymbol *sprev;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
824
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
825 // Look to see if we are defining a forward referenced symbol
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
826
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
827 sprev = symtab->lookup(s->ident);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
828 assert(sprev);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
829 if (s->equals(sprev)) // if the same symbol
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
830 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
831 if (s->isforwardRef()) // if second declaration is a forward reference
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
832 return sprev;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
833 if (sprev->isforwardRef())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
834 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
835 sprev->defineRef(s); // copy data from s into sprev
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
836 return sprev;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
837 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
838 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
839 multiplyDefined(0, s, sprev);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
840 return sprev;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
841 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
842
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
843 const char *ScopeDsymbol::kind()
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
844 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
845 return "ScopeDsymbol";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
846 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
847
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
848
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
849 /*******************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
850 * Look for member of the form:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
851 * const(MemberInfo)[] getMembers(string);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
852 * Returns NULL if not found
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
853 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
854
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
855 #if DMDV2
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
856 FuncDeclaration *ScopeDsymbol::findGetMembers()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
857 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
858 Dsymbol *s = search_function(this, Id::getmembers);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
859 FuncDeclaration *fdx = s ? s->isFuncDeclaration() : NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
860
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
861 #if 0 // Finish
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
862 static TypeFunction *tfgetmembers;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
863
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
864 if (!tfgetmembers)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
865 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
866 Scope sc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
867 Arguments *arguments = new Arguments;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
868 Arguments *arg = new Argument(STCin, Type::tchar->constOf()->arrayOf(), NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
869 arguments->push(arg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
870
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
871 Type *tret = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
872 tfgetmembers = new TypeFunction(arguments, tret, 0, LINKd);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
873 tfgetmembers = (TypeFunction *)tfgetmembers->semantic(0, &sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
874 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
875 if (fdx)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
876 fdx = fdx->overloadExactMatch(tfgetmembers);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
877 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
878 if (fdx && fdx->isVirtual())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
879 fdx = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
880
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
881 return fdx;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
882 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
883 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
884
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
885
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
886 /****************************** WithScopeSymbol ******************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
887
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
888 WithScopeSymbol::WithScopeSymbol(WithStatement *withstate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
889 : ScopeDsymbol()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
890 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
891 this->withstate = withstate;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
892 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
893
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
894 Dsymbol *WithScopeSymbol::search(Loc loc, Identifier *ident, int flags)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
895 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
896 // Acts as proxy to the with class declaration
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
897 return withstate->exp->type->toDsymbol(NULL)->search(loc, ident, 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
898 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
899
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
900 /****************************** ArrayScopeSymbol ******************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
901
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
902 ArrayScopeSymbol::ArrayScopeSymbol(Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
903 : ScopeDsymbol()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
904 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
905 assert(e->op == TOKindex || e->op == TOKslice);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
906 exp = e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
907 type = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
908 td = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
909 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
910
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
911 ArrayScopeSymbol::ArrayScopeSymbol(TypeTuple *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
912 : ScopeDsymbol()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
913 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
914 exp = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
915 type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
916 td = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
917 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
918
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
919 ArrayScopeSymbol::ArrayScopeSymbol(TupleDeclaration *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
920 : ScopeDsymbol()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
921 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
922 exp = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
923 type = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
924 td = s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
925 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
926
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
927 Dsymbol *ArrayScopeSymbol::search(Loc loc, Identifier *ident, int flags)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
928 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
929 //printf("ArrayScopeSymbol::search('%s', flags = %d)\n", ident->toChars(), flags);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
930 if (ident == Id::length || ident == Id::dollar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
931 { VarDeclaration **pvar;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
932 Expression *ce;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
933
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
934 L1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
935
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
936 if (td)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
937 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
938 VarDeclaration *v = new VarDeclaration(loc, Type::tsize_t, Id::dollar, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
939 Expression *e = new IntegerExp(0, td->objects->dim, Type::tsize_t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
940 v->init = new ExpInitializer(0, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
941 v->storage_class |= STCconst;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
942 return v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
943 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
944
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
945 if (type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
946 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
947 VarDeclaration *v = new VarDeclaration(loc, Type::tsize_t, Id::dollar, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
948 Expression *e = new IntegerExp(0, type->arguments->dim, Type::tsize_t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
949 v->init = new ExpInitializer(0, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
950 v->storage_class |= STCconst;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
951 return v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
952 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
953
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
954 if (exp->op == TOKindex)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
955 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
956 IndexExp *ie = (IndexExp *)exp;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
957
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
958 pvar = &ie->lengthVar;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
959 ce = ie->e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
960 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
961 else if (exp->op == TOKslice)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
962 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
963 SliceExp *se = (SliceExp *)exp;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
964
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
965 pvar = &se->lengthVar;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
966 ce = se->e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
967 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
968 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
969 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
970
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
971 if (ce->op == TOKtype)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
972 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
973 Type *t = ((TypeExp *)ce)->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
974 if (t->ty == Ttuple)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
975 { type = (TypeTuple *)t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
976 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
977 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
978 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
979
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
980 if (!*pvar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
981 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
982 VarDeclaration *v = new VarDeclaration(loc, Type::tsize_t, Id::dollar, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
983
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
984 if (ce->op == TOKstring)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
985 { /* It is for a string literal, so the
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
986 * length will be a const.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
987 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
988 Expression *e = new IntegerExp(0, ((StringExp *)ce)->len, Type::tsize_t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
989 v->init = new ExpInitializer(0, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
990 v->storage_class |= STCconst;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
991 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
992 else if (ce->op == TOKarrayliteral)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
993 { /* It is for an array literal, so the
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
994 * length will be a const.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
995 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
996 Expression *e = new IntegerExp(0, ((ArrayLiteralExp *)ce)->elements->dim, Type::tsize_t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
997 v->init = new ExpInitializer(0, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
998 v->storage_class |= STCconst;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
999 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1000 else if (ce->op == TOKtuple)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1001 { /* It is for an expression tuple, so the
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1002 * length will be a const.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1003 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1004 Expression *e = new IntegerExp(0, ((TupleExp *)ce)->exps->dim, Type::tsize_t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1005 v->init = new ExpInitializer(0, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1006 v->storage_class |= STCconst;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1007 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1008 *pvar = v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1009 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1010 return (*pvar);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1011 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1012 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1013 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1014
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1015
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1016 /****************************** DsymbolTable ******************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1017
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1018 DsymbolTable::DsymbolTable()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1019 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1020 tab = new StringTable;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1021 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1022
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1023 DsymbolTable::~DsymbolTable()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1024 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1025 delete tab;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1026 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1027
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1028 Dsymbol *DsymbolTable::lookup(Identifier *ident)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1029 { StringValue *sv;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1030
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1031 #ifdef DEBUG
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1032 assert(ident);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1033 assert(tab);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1034 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1035 sv = tab->lookup((char*)ident->string, ident->len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1036 return (Dsymbol *)(sv ? sv->ptrvalue : NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1037 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1038
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1039 Dsymbol *DsymbolTable::insert(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1040 { StringValue *sv;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1041 Identifier *ident;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1042
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1043 //printf("DsymbolTable::insert(this = %p, '%s')\n", this, s->ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1044 ident = s->ident;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1045 #ifdef DEBUG
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1046 assert(ident);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1047 assert(tab);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1048 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1049 sv = tab->insert(ident->toChars(), ident->len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1050 if (!sv)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1051 return NULL; // already in table
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1052 sv->ptrvalue = s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1053 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1054 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1055
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1056 Dsymbol *DsymbolTable::insert(Identifier *ident, Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1057 { StringValue *sv;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1058
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1059 //printf("DsymbolTable::insert()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1060 sv = tab->insert(ident->toChars(), ident->len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1061 if (!sv)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1062 return NULL; // already in table
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1063 sv->ptrvalue = s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1064 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1065 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1066
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1067 Dsymbol *DsymbolTable::update(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1068 { StringValue *sv;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1069 Identifier *ident;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1070
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1071 ident = s->ident;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1072 sv = tab->update(ident->toChars(), ident->len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1073 sv->ptrvalue = s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1074 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1075 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1076
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1077
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1078
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1079