annotate dmd/scope.c @ 1650:40bd4a0d4870

Update to work with LLVM 2.7. Removed use of dyn_cast, llvm no compiles without exceptions and rtti by default. We do need exceptions for the libconfig stuff, but rtti isn't necessary (anymore). Debug info needs to be rewritten, as in LLVM 2.7 the format has completely changed. To have something to look at while rewriting, the old code has been wrapped inside #ifndef DISABLE_DEBUG_INFO , this means that you have to define this to compile at the moment. Updated tango 0.99.9 patch to include updated EH runtime code, which is needed for LLVM 2.7 as well.
author Tomas Lindquist Olsen
date Wed, 19 May 2010 12:42:32 +0200
parents 9bf06e02070b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
1
1640
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1587
diff changeset
2 // Copyright (c) 1999-2010 by Digital Mars
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
3 // All Rights Reserved
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
4 // written by Walter Bright
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
5 // http://www.digitalmars.com
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
6 // License for redistribution is by either the Artistic License
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
7 // in artistic.txt, or the GNU General Public License in gnu.txt.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
8 // See the included readme.txt for details.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
9
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
10 #include <stdio.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
11 #include <assert.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
12
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
13 #include "root.h"
1640
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1587
diff changeset
14 #include "speller.h"
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
15
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
16 #include "mars.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
17 #include "init.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
18 #include "identifier.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
19 #include "attrib.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
20 #include "dsymbol.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
21 #include "scope.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
22 #include "declaration.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
23 #include "aggregate.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
24 #include "module.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
25 #include "id.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
26
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
27 Scope *Scope::freelist = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
28
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
29 void *Scope::operator new(size_t size)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
30 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
31 if (freelist)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
32 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
33 Scope *s = freelist;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
34 freelist = s->enclosing;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
35 //printf("freelist %p\n", s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
36 assert(s->flags & SCOPEfree);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
37 s->flags &= ~SCOPEfree;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
38 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
39 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
40
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
41 void *p = ::operator new(size);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
42 //printf("new %p\n", p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
43 return p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
44 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
45
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
46 Scope::Scope()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
47 { // Create root scope
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
48
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
49 //printf("Scope::Scope() %p\n", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
50 this->module = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
51 this->scopesym = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
52 this->sd = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
53 this->enclosing = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
54 this->parent = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
55 this->sw = NULL;
1141
f99a3b393c03 Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents: 1103
diff changeset
56 this->enclosingFinally = NULL;
f99a3b393c03 Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents: 1103
diff changeset
57 this->enclosingScopeExit = NULL;
561
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 215
diff changeset
58 this->tinst = NULL;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
59 this->sbreak = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
60 this->scontinue = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
61 this->fes = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
62 this->structalign = global.structalign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
63 this->func = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
64 this->slabel = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
65 this->linkage = LINKd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
66 this->protection = PROTpublic;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
67 this->explicitProtection = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
68 this->stc = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
69 this->offset = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
70 this->inunion = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
71 this->incontract = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
72 this->nofree = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
73 this->noctor = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
74 this->noaccesscheck = 0;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1141
diff changeset
75 this->mustsemantic = 0;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
76 this->intypeof = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
77 this->parameterSpecialization = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
78 this->callSuper = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
79 this->flags = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
80 this->anonAgg = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
81 this->lastdc = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
82 this->lastoffset = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
83 this->docbuf = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
84 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
85
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
86 Scope::Scope(Scope *enclosing)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
87 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
88 //printf("Scope::Scope(enclosing = %p) %p\n", enclosing, this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
89 assert(!(enclosing->flags & SCOPEfree));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
90 this->module = enclosing->module;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
91 this->func = enclosing->func;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
92 this->parent = enclosing->parent;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
93 this->scopesym = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
94 this->sd = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
95 this->sw = enclosing->sw;
1141
f99a3b393c03 Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents: 1103
diff changeset
96 this->enclosingFinally = enclosing->enclosingFinally;
f99a3b393c03 Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents: 1103
diff changeset
97 this->enclosingScopeExit = enclosing->enclosingScopeExit;
561
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 215
diff changeset
98 this->tinst = enclosing->tinst;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
99 this->sbreak = enclosing->sbreak;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
100 this->scontinue = enclosing->scontinue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
101 this->fes = enclosing->fes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
102 this->structalign = enclosing->structalign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
103 this->enclosing = enclosing;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
104 #ifdef DEBUG
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
105 if (enclosing->enclosing)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
106 assert(!(enclosing->enclosing->flags & SCOPEfree));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
107 if (this == enclosing->enclosing)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
108 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
109 printf("this = %p, enclosing = %p, enclosing->enclosing = %p\n", this, enclosing, enclosing->enclosing);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
110 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
111 assert(this != enclosing->enclosing);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
112 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
113 this->slabel = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
114 this->linkage = enclosing->linkage;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
115 this->protection = enclosing->protection;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
116 this->explicitProtection = enclosing->explicitProtection;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
117 this->stc = enclosing->stc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
118 this->offset = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
119 this->inunion = enclosing->inunion;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
120 this->incontract = enclosing->incontract;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
121 this->nofree = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
122 this->noctor = enclosing->noctor;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
123 this->noaccesscheck = enclosing->noaccesscheck;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1141
diff changeset
124 this->mustsemantic = enclosing->mustsemantic;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
125 this->intypeof = enclosing->intypeof;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
126 this->parameterSpecialization = enclosing->parameterSpecialization;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
127 this->callSuper = enclosing->callSuper;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
128 this->flags = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
129 this->anonAgg = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
130 this->lastdc = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
131 this->lastoffset = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
132 this->docbuf = enclosing->docbuf;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
133 assert(this != enclosing);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
134 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
135
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
136 Scope *Scope::createGlobal(Module *module)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
137 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
138 Scope *sc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
139
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
140 sc = new Scope();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
141 sc->module = module;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
142 sc->scopesym = new ScopeDsymbol();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
143 sc->scopesym->symtab = new DsymbolTable();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
144
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
145 // Add top level package as member of this global scope
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
146 Dsymbol *m = module;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
147 while (m->parent)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
148 m = m->parent;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
149 m->addMember(NULL, sc->scopesym, 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
150 m->parent = NULL; // got changed by addMember()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
151
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
152 // Create the module scope underneath the global scope
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
153 sc = sc->push(module);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
154 sc->parent = module;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
155 return sc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
156 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
157
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
158 Scope *Scope::push()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
159 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
160 //printf("Scope::push()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
161 Scope *s = new Scope(this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
162 assert(this != s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
163 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
164 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
165
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
166 Scope *Scope::push(ScopeDsymbol *ss)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
167 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
168 //printf("Scope::push(%s)\n", ss->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
169 Scope *s = push();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
170 s->scopesym = ss;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
171 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
172 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
173
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
174 Scope *Scope::pop()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
175 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
176 //printf("Scope::pop() %p nofree = %d\n", this, nofree);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
177 Scope *enc = enclosing;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
178
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
179 if (enclosing)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
180 enclosing->callSuper |= callSuper;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
181
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
182 if (!nofree)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
183 { enclosing = freelist;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
184 freelist = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
185 flags |= SCOPEfree;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
186 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
187
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
188 return enc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
189 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
190
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
191 void Scope::mergeCallSuper(Loc loc, unsigned cs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
192 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
193 // This does a primitive flow analysis to support the restrictions
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
194 // regarding when and how constructors can appear.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
195 // It merges the results of two paths.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
196 // The two paths are callSuper and cs; the result is merged into callSuper.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
197
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
198 if (cs != callSuper)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
199 { int a;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
200 int b;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
201
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
202 callSuper |= cs & (CSXany_ctor | CSXlabel);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
203 if (cs & CSXreturn)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
204 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
205 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
206 else if (callSuper & CSXreturn)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
207 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
208 callSuper = cs | (callSuper & (CSXany_ctor | CSXlabel));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
209 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
210 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
211 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
212 a = (cs & (CSXthis_ctor | CSXsuper_ctor)) != 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
213 b = (callSuper & (CSXthis_ctor | CSXsuper_ctor)) != 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
214 if (a != b)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
215 error(loc, "one path skips constructor");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
216 callSuper |= cs;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
217 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
218 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
219 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
220
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
221 Dsymbol *Scope::search(Loc loc, Identifier *ident, Dsymbol **pscopesym)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
222 { Dsymbol *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
223 Scope *sc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
224
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
225 //printf("Scope::search(%p, '%s')\n", this, ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
226 if (ident == Id::empty)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
227 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
228 // Look for module scope
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
229 for (sc = this; sc; sc = sc->enclosing)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
230 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
231 assert(sc != sc->enclosing);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
232 if (sc->scopesym)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
233 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
234 s = sc->scopesym->isModule();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
235 if (s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
236 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
237 //printf("\tfound %s.%s\n", s->parent ? s->parent->toChars() : "", s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
238 if (pscopesym)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
239 *pscopesym = sc->scopesym;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
240 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
241 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
242 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
243 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
244 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
245 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
246
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
247 for (sc = this; sc; sc = sc->enclosing)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
248 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
249 assert(sc != sc->enclosing);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
250 if (sc->scopesym)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
251 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
252 //printf("\tlooking in scopesym '%s', kind = '%s'\n", sc->scopesym->toChars(), sc->scopesym->kind());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
253 s = sc->scopesym->search(loc, ident, 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
254 if (s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
255 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
256 if ((global.params.warnings ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
257 global.params.Dversion > 1) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
258 ident == Id::length &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
259 sc->scopesym->isArrayScopeSymbol() &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
260 sc->enclosing &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
261 sc->enclosing->search(loc, ident, NULL))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
262 {
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 561
diff changeset
263 warning(s->loc, "array 'length' hides other 'length' name in outer scope");
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
264 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
265
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
266 //printf("\tfound %s.%s, kind = '%s'\n", s->parent ? s->parent->toChars() : "", s->toChars(), s->kind());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
267 if (pscopesym)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
268 *pscopesym = sc->scopesym;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
269 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
270 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
271 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
272 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
273
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
274 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
275 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
276
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
277 Dsymbol *Scope::insert(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
278 { Scope *sc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
279
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
280 for (sc = this; sc; sc = sc->enclosing)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
281 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
282 //printf("\tsc = %p\n", sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
283 if (sc->scopesym)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
284 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
285 //printf("\t\tsc->scopesym = %p\n", sc->scopesym);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
286 if (!sc->scopesym->symtab)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
287 sc->scopesym->symtab = new DsymbolTable();
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1141
diff changeset
288 return sc->scopesym->symtabInsert(s);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
289 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
290 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
291 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
292 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
293 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
294
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
295 /********************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
296 * Search enclosing scopes for ClassDeclaration.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
297 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
298
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
299 ClassDeclaration *Scope::getClassScope()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
300 { Scope *sc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
301
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
302 for (sc = this; sc; sc = sc->enclosing)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
303 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
304 ClassDeclaration *cd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
305
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
306 if (sc->scopesym)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
307 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
308 cd = sc->scopesym->isClassDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
309 if (cd)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
310 return cd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
311 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
312 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
313 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
314 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
315
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
316 /********************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
317 * Search enclosing scopes for ClassDeclaration.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
318 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
319
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
320 AggregateDeclaration *Scope::getStructClassScope()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
321 { Scope *sc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
322
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
323 for (sc = this; sc; sc = sc->enclosing)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
324 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
325 AggregateDeclaration *ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
326
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
327 if (sc->scopesym)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
328 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
329 ad = sc->scopesym->isClassDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
330 if (ad)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
331 return ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
332 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
333 { ad = sc->scopesym->isStructDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
334 if (ad)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
335 return ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
336 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
337 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
338 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
339 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
340 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
341
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
342 /*******************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
343 * For TemplateDeclarations, we need to remember the Scope
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
344 * where it was declared. So mark the Scope as not
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
345 * to be free'd.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
346 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
347
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
348 void Scope::setNoFree()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
349 { Scope *sc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
350 //int i = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
351
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
352 //printf("Scope::setNoFree(this = %p)\n", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
353 for (sc = this; sc; sc = sc->enclosing)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
354 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
355 //printf("\tsc = %p\n", sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
356 sc->nofree = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
357
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
358 assert(!(flags & SCOPEfree));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
359 //assert(sc != sc->enclosing);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
360 //assert(!sc->enclosing || sc != sc->enclosing->enclosing);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
361 //if (++i == 10)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
362 //assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
363 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
364 }
1640
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1587
diff changeset
365
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1587
diff changeset
366
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1587
diff changeset
367 /************************************************
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1587
diff changeset
368 * Given the failed search attempt, try to find
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1587
diff changeset
369 * one with a close spelling.
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1587
diff changeset
370 */
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1587
diff changeset
371
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1587
diff changeset
372 void *scope_search_fp(void *arg, const char *seed)
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1587
diff changeset
373 {
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1587
diff changeset
374 //printf("scope_search_fp('%s')\n", seed);
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1587
diff changeset
375 Scope *sc = (Scope *)arg;
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1587
diff changeset
376 Identifier id(seed, 0);
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1587
diff changeset
377 Module::clearCache();
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1587
diff changeset
378 Dsymbol *s = sc->search(0, &id, NULL);
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1587
diff changeset
379 return s;
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1587
diff changeset
380 }
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1587
diff changeset
381
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1587
diff changeset
382 Dsymbol *Scope::search_correct(Identifier *ident)
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1587
diff changeset
383 {
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1587
diff changeset
384 if (global.gag)
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1587
diff changeset
385 return NULL; // don't do it for speculative compiles; too time consuming
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1587
diff changeset
386
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1587
diff changeset
387 return (Dsymbol *)speller(ident->toChars(), &scope_search_fp, this, idchars);
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1587
diff changeset
388 }