annotate dmd/Scope.d @ 178:e3afd1303184

Many small bugs fixed Made all classes derive from TObject to detect memory leaks (functionality is disabled for now) Began work on overriding backend memory allocations (to avoid memory leaks)
author korDen
date Sun, 17 Oct 2010 07:42:00 +0400
parents 96c0fff6897d
children b0d41ff5e0df
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1 module dmd.Scope;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 83
diff changeset
3 import dmd.common;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4 import dmd.Module;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5 import dmd.ScopeDsymbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6 import dmd.FuncDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
7 import dmd.Id;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
8 import dmd.Dsymbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
9 import dmd.LabelStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
10 import dmd.SwitchStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
11 import dmd.TryFinallyStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
12 import dmd.TemplateInstance;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
13 import dmd.Statement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
14 import dmd.ForeachStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
15 import dmd.LINK;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
16 import dmd.PROT;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
17 import dmd.STC;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
18 import dmd.AnonymousAggregateDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
19 import dmd.AggregateDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
20 import dmd.ClassDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
21 import dmd.Identifier;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
22 import dmd.Loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
23 import dmd.OutBuffer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
24 import dmd.DocComment;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
25 import dmd.DsymbolTable;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
26 import dmd.Global;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
27 import dmd.CSX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
28 import dmd.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
29
83
ee670dd808a8 malloc -> GC.malloc change, plus compilation issues fixed (always check before commiting stuff!!!)
korDen
parents: 82
diff changeset
30 import core.memory;
ee670dd808a8 malloc -> GC.malloc change, plus compilation issues fixed (always check before commiting stuff!!!)
korDen
parents: 82
diff changeset
31
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
32 enum SCOPE
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
33 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
34 SCOPEctor = 1, // constructor type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
35 SCOPEstaticif = 2, // inside static if
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
36 SCOPEfree = 4, // is on free list
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
37 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
38
178
e3afd1303184 Many small bugs fixed
korDen
parents: 170
diff changeset
39 import dmd.TObject;
e3afd1303184 Many small bugs fixed
korDen
parents: 170
diff changeset
40
e3afd1303184 Many small bugs fixed
korDen
parents: 170
diff changeset
41 class Scope : TObject
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
42 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
43 Scope enclosing; // enclosing Scope
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
44
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
45 Module module_; // Root module
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
46 ScopeDsymbol scopesym; // current symbol
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
47 ScopeDsymbol sd; // if in static if, and declaring new symbols,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
48 // sd gets the addMember()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
49 FuncDeclaration func; // function we are in
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
50 Dsymbol parent; // parent to use
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
51 LabelStatement slabel; // enclosing labelled statement
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
52 SwitchStatement sw; // enclosing switch statement
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
53 TryFinallyStatement tf; // enclosing try finally statement
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
54 TemplateInstance tinst; // enclosing template instance
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
55 Statement sbreak; // enclosing statement that supports "break"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
56 Statement scontinue; // enclosing statement that supports "continue"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
57 ForeachStatement fes; // if nested function for ForeachStatement, this is it
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
58 uint offset; // next offset to use in aggregate
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
59 int inunion; // we're processing members of a union
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
60 int incontract; // we're inside contract code
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
61 int nofree; // set if shouldn't free it
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
62 int noctor; // set if constructor calls aren't allowed
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
63 int intypeof; // in typeof(exp)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
64 int parameterSpecialization; // if in template parameter specialization
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
65 int noaccesscheck; // don't do access checks
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
66 int mustsemantic; // cannot defer semantic()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
67
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
68 uint callSuper; // primitive flow analysis for constructors
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
69 ///#define CSXthis_ctor 1 // called this()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
70 ///#define CSXsuper_ctor 2 // called super()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
71 ///#define CSXthis 4 // referenced this
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
72 ///#define CSXsuper 8 // referenced super
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
73 ///#define CSXlabel 0x10 // seen a label
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
74 ///#define CSXreturn 0x20 // seen a return statement
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
75 ///#define CSXany_ctor 0x40 // either this() or super() was called
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
76
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
77 uint structalign; // alignment for struct members
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
78 LINK linkage = LINK.LINKd; // linkage for external functions
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
79
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
80 PROT protection = PROT.PROTpublic; // protection for class members
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
81 int explicitProtection; // set if in an explicit protection attribute
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
82
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 129
diff changeset
83 StorageClass stc; // storage class
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
84
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
85 SCOPE flags;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
86
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
87 AnonymousAggregateDeclaration anonAgg; // for temporary analysis
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
88
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
89 DocComment lastdc; // documentation comment for last symbol at this scope
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
90 uint lastoffset; // offset in docbuf of where to insert next dec
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
91 OutBuffer docbuf; // buffer for documentation output
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
92
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
93 /// static void *operator new(size_t sz);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
94 static Scope createGlobal(Module module_)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
95 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
96 Scope sc = new Scope();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
97 sc.module_ = module_;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
98 sc.scopesym = new ScopeDsymbol();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
99 sc.scopesym.symtab = new DsymbolTable();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
100
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
101 // Add top level package as member of this global scope
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
102 Dsymbol m = module_;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
103 while (m.parent !is null)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
104 m = m.parent;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
105
13
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 0
diff changeset
106 m.addMember(null, sc.scopesym, true);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
107 m.parent = null; // got changed by addMember()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
108
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
109 // Create the module scope underneath the global scope
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
110 sc = sc.push(module_);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
111 sc.parent = module_;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
112 return sc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
113 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
114
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
115 this()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
116 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 170
diff changeset
117 register();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
118 // Create root scope
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
119
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
120 //printf("Scope.Scope() %p\n", this);
21
26b9f97f6162 Added in some = new OutBuffer();'s to be on the safe side, been getting some issues with null OutBuffers.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
121 this.docbuf = new OutBuffer;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
122 this.structalign = global.structalign;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
123 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
124
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
125 this(Module module_)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
126 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 170
diff changeset
127 register();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
128 assert(false);
21
26b9f97f6162 Added in some = new OutBuffer();'s to be on the safe side, been getting some issues with null OutBuffers.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
129 this.docbuf = new OutBuffer;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
130 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
131
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
132 this(Scope enclosing)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
133 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 170
diff changeset
134 register();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
135 //printf("Scope.Scope(enclosing = %p) %p\n", enclosing, this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
136 assert(!(enclosing.flags & SCOPE.SCOPEfree));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
137 this.module_ = enclosing.module_;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
138 this.func = enclosing.func;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
139 this.parent = enclosing.parent;
79
43073c7c7769 updated to 2.035
Trass3r
parents: 23
diff changeset
140 this.scopesym = null;
43073c7c7769 updated to 2.035
Trass3r
parents: 23
diff changeset
141 this.sd = null;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
142 this.sw = enclosing.sw;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
143 this.tf = enclosing.tf;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
144 this.tinst = enclosing.tinst;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
145 this.tinst = enclosing.tinst;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
146 this.sbreak = enclosing.sbreak;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
147 this.scontinue = enclosing.scontinue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
148 this.fes = enclosing.fes;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
149 this.structalign = enclosing.structalign;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
150 this.enclosing = enclosing;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
151 debug {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
152 if (enclosing.enclosing)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
153 assert(!(enclosing.enclosing.flags & SCOPE.SCOPEfree));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
154
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
155 if (this is enclosing.enclosing) /// huh?
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
156 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
157 writef("this = %p, enclosing = %p, enclosing.enclosing = %p\n", this, enclosing, enclosing.enclosing);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
158 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
159 assert(this !is enclosing.enclosing);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
160 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
161 this.linkage = enclosing.linkage;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
162 this.protection = enclosing.protection;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
163 this.explicitProtection = enclosing.explicitProtection;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
164 this.stc = enclosing.stc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
165 this.inunion = enclosing.inunion;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
166 this.incontract = enclosing.incontract;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
167 this.noctor = enclosing.noctor;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
168 this.noaccesscheck = enclosing.noaccesscheck;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
169 this.mustsemantic = enclosing.mustsemantic;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
170 this.intypeof = enclosing.intypeof;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
171 this.parameterSpecialization = enclosing.parameterSpecialization;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
172 this.callSuper = enclosing.callSuper;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
173 this.docbuf = enclosing.docbuf;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
174 assert(this !is enclosing); /// huh?
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
175 }
82
e95073e26356 fixed a hack I used as a lack of copy ctor in D
korDen
parents: 79
diff changeset
176
e95073e26356 fixed a hack I used as a lack of copy ctor in D
korDen
parents: 79
diff changeset
177 Scope clone()
e95073e26356 fixed a hack I used as a lack of copy ctor in D
korDen
parents: 79
diff changeset
178 {
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
179 return cloneThis(this);
82
e95073e26356 fixed a hack I used as a lack of copy ctor in D
korDen
parents: 79
diff changeset
180 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
181
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
182 Scope push()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
183 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
184 //printf("Scope.push()\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
185 Scope s = new Scope(this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
186 assert(this !is s); /// huh?
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
187 return s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
188 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
189
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
190 Scope push(ScopeDsymbol ss)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
191 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
192 //printf("Scope.push(%s)\n", ss.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
193 Scope s = push();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
194 s.scopesym = ss;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
195 return s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
196 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
197
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
198 Scope pop()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
199 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
200 //printf("Scope.pop() %p nofree = %d\n", this, nofree);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
201 Scope enc = enclosing;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
202
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
203 if (enclosing)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
204 enclosing.callSuper |= callSuper;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
205
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
206 if (!nofree)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
207 {
170
96c0fff6897d more global state cleanup
korDen
parents: 135
diff changeset
208 enclosing = global.scope_freelist;
96c0fff6897d more global state cleanup
korDen
parents: 135
diff changeset
209 global.scope_freelist = this;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
210 flags |= SCOPE.SCOPEfree;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
211 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
212
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
213 return enc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
214 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
215
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
216 void mergeCallSuper(Loc loc, uint cs)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
217 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
218 // This does a primitive flow analysis to support the restrictions
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
219 // regarding when and how constructors can appear.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
220 // It merges the results of two paths.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
221 // The two paths are callSuper and cs; the result is merged into callSuper.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
222
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
223 if (cs != callSuper)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
224 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
225 int a;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
226 int b;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
227
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
228 callSuper |= cs & (CSX.CSXany_ctor | CSX.CSXlabel);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
229 if (cs & CSX.CSXreturn)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
230 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
231 ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
232 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
233 else if (callSuper & CSX.CSXreturn)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
234 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
235 callSuper = cs | (callSuper & (CSX.CSXany_ctor | CSX.CSXlabel));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
236 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
237 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
238 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
239 a = (cs & (CSX.CSXthis_ctor | CSX.CSXsuper_ctor)) != 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
240 b = (callSuper & (CSX.CSXthis_ctor | CSX.CSXsuper_ctor)) != 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
241
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
242 if (a != b)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
243 error(loc, "one path skips constructor");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
244 callSuper |= cs;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
245 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
246 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
247 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
248
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
249 Dsymbol search(Loc loc, Identifier ident, Dsymbol* pscopesym)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
250 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
251 Dsymbol s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
252 Scope sc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
253
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
254 //printf("Scope.search(%p, '%s')\n", this, ident.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
255 if (ident is Id.empty)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
256 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
257 // Look for module scope
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
258 for (sc = this; sc; sc = sc.enclosing)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
259 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
260 assert(sc != sc.enclosing);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
261 if (sc.scopesym)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
262 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
263 s = sc.scopesym.isModule();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
264 if (s)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
265 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
266 //printf("\tfound %s.%s\n", s.parent ? s.parent.toChars() : "", s.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
267 if (pscopesym)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
268 *pscopesym = sc.scopesym;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
269 return s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
270 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
271 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
272 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
273 return null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
274 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
275
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
276 for (sc = this; sc; sc = sc.enclosing)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
277 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
278 assert(sc != sc.enclosing);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
279 if (sc.scopesym)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
280 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
281 //printf("\tlooking in scopesym '%s', kind = '%s'\n", sc.scopesym.toChars(), sc.scopesym.kind());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
282 s = sc.scopesym.search(loc, ident, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
283 if (s)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
284 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
285 if ((global.params.warnings ||
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
286 global.params.Dversion > 1) &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
287 ident == Id.length &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
288 sc.scopesym.isArrayScopeSymbol() &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
289 sc.enclosing &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
290 sc.enclosing.search(loc, ident, null))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
291 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
292 warning(s.loc, "array 'length' hides other 'length' name in outer scope");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
293 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
294
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
295 //printf("\tfound %s.%s, kind = '%s'\n", s.parent ? s.parent.toChars() : "", s.toChars(), s.kind());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
296 if (pscopesym)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
297 *pscopesym = sc.scopesym;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
298 return s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
299 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
300 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
301 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
302
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
303 return null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
304 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
305
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
306 Dsymbol insert(Dsymbol s)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
307 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
308 for (Scope sc = this; sc; sc = sc.enclosing)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
309 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
310 //printf("\tsc = %p\n", sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
311 if (sc.scopesym)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
312 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
313 //printf("\t\tsc.scopesym = %p\n", sc.scopesym);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
314 if (!sc.scopesym.symtab)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
315 sc.scopesym.symtab = new DsymbolTable();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
316
79
43073c7c7769 updated to 2.035
Trass3r
parents: 23
diff changeset
317 return sc.scopesym.symtabInsert(s);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
318 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
319 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
320
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
321 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
322 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
323
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
324 ClassDeclaration getClassScope()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
325 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
326 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
327 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
328
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
329 /********************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
330 * Search enclosing scopes for ClassDeclaration.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
331 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
332 AggregateDeclaration getStructClassScope()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
333 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
334 for (Scope sc = this; sc; sc = sc.enclosing)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
335 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
336 AggregateDeclaration ad;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
337
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
338 if (sc.scopesym)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
339 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
340 ad = sc.scopesym.isClassDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
341 if (ad)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
342 return ad;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
343 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
344 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
345 ad = sc.scopesym.isStructDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
346 if (ad)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
347 return ad;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
348 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
349 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
350 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
351
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
352 return null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
353 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
354
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
355 void setNoFree()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
356 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
357 //int i = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
358
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
359 //printf("Scope.setNoFree(this = %p)\n", this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
360 for (Scope sc = this; sc; sc = sc.enclosing)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
361 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
362 //printf("\tsc = %p\n", sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
363 sc.nofree = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
364
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
365 assert(!(flags & SCOPE.SCOPEfree));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
366 //assert(sc != sc.enclosing);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
367 //assert(!sc.enclosing || sc != sc.enclosing.enclosing);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
368 //if (++i == 10)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
369 //assert(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
370 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
371 }
21
26b9f97f6162 Added in some = new OutBuffer();'s to be on the safe side, been getting some issues with null OutBuffers.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
372 }