annotate dmd/WithStatement.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 010eb8f0e18d
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.WithStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 72
diff changeset
3 import dmd.common;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4 import dmd.Statement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5 import dmd.Expression;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6 import dmd.VarDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
7 import dmd.Loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
8 import dmd.OutBuffer;
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
9 import dmd.ScopeDsymbol;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
10 import dmd.TypeExp;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
11 import dmd.TOK;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
12 import dmd.Initializer;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
13 import dmd.ExpInitializer;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
14 import dmd.Id;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
15 import dmd.ScopeExp;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
16 import dmd.WithScopeSymbol;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
17 import dmd.TY;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
18 import dmd.Type;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
19 import dmd.HdrGenState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
20 import dmd.InlineScanState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
21 import dmd.IRState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
22 import dmd.Scope;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
23 import dmd.BE;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
24
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
25 import dmd.backend.Symbol;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
26 import dmd.backend.block;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
27 import dmd.backend.Blockx;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
28 import dmd.backend.elem;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
29 import dmd.backend.Util;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
30 import dmd.backend.OPER;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
31
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
32 class WithStatement : Statement
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
33 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
34 Expression exp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
35 Statement body_;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
36 VarDeclaration wthis;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
37
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
38 this(Loc loc, Expression exp, Statement body_)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
39 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 129
diff changeset
40 register();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
41 super(loc);
49
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 0
diff changeset
42 this.exp = exp;
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 0
diff changeset
43 this.body_ = body_;
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 0
diff changeset
44 wthis = null;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
45 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
46
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 49
diff changeset
47 override Statement syntaxCopy()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
48 {
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
49 WithStatement s = new WithStatement(loc, exp.syntaxCopy(), body_ ? body_.syntaxCopy() : null);
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
50 return s;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
51 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
52
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 49
diff changeset
53 override Statement semantic(Scope sc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
54 {
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
55 ScopeDsymbol sym;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
56 Initializer init;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
57
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
58 //printf("WithStatement.semantic()\n");
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
59 exp = exp.semantic(sc);
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
60 exp = resolveProperties(sc, exp);
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
61 if (exp.op == TOKimport)
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
62 {
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
63 ScopeExp es = cast(ScopeExp)exp;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
64
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
65 sym = es.sds;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
66 }
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
67 else if (exp.op == TOKtype)
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
68 {
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
69 TypeExp es = cast(TypeExp)exp;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
70
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
71 sym = es.type.toDsymbol(sc).isScopeDsymbol();
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
72 if (!sym)
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
73 {
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
74 error("%s has no members", es.toChars());
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
75 body_ = body_.semantic(sc);
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
76 return this;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
77 }
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
78 }
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
79 else
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
80 {
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
81 Type t = exp.type;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
82
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
83 assert(t);
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
84 t = t.toBasetype();
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
85 if (t.isClassHandle())
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
86 {
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
87 init = new ExpInitializer(loc, exp);
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
88 wthis = new VarDeclaration(loc, exp.type, Id.withSym, init);
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
89 wthis.semantic(sc);
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
90
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
91 sym = new WithScopeSymbol(this);
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
92 sym.parent = sc.scopesym;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
93 }
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
94 else if (t.ty == Tstruct)
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
95 {
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
96 Expression e = exp.addressOf(sc);
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
97 init = new ExpInitializer(loc, e);
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
98 wthis = new VarDeclaration(loc, e.type, Id.withSym, init);
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
99 wthis.semantic(sc);
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
100 sym = new WithScopeSymbol(this);
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
101 sym.parent = sc.scopesym;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
102 }
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
103 else
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
104 {
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
105 error("with expressions must be class objects, not '%s'", exp.type.toChars());
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
106 return null;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
107 }
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
108 }
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
109 sc = sc.push(sym);
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
110
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
111 if (body_)
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
112 body_ = body_.semantic(sc);
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
113
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
114 sc.pop();
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
115
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
116 return this;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
117 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
118
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 49
diff changeset
119 override void toCBuffer(OutBuffer buf, HdrGenState* hgs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
120 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
121 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
122 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
123
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 49
diff changeset
124 override bool usesEH()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
125 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
126 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
127 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
128
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 49
diff changeset
129 override BE blockExit()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
130 {
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
131 BE result = BEnone;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
132 if (exp.canThrow())
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
133 result = BEthrow;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
134 if (body_)
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
135 result |= body_.blockExit();
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
136 else
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
137 result |= BEfallthru;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
138 return result;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
139 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
140
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 49
diff changeset
141 override Statement inlineScan(InlineScanState* iss)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
142 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
143 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
144 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
145
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 49
diff changeset
146 override void toIR(IRState* irs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
147 {
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
148 Symbol* sp;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
149 elem* e;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
150 elem* ei;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
151 ExpInitializer ie;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
152 Blockx* blx = irs.blx;
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
153
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
154 //printf("WithStatement.toIR()\n");
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
155 if (exp.op == TOKimport || exp.op == TOKtype)
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
156 {
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
157 }
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
158 else
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
159 {
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
160 // Declare with handle
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
161 sp = wthis.toSymbol();
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
162 symbol_add(sp);
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
163
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
164 // Perform initialization of with handle
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
165 ie = wthis.init.isExpInitializer();
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
166 assert(ie);
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
167 ei = ie.exp.toElem(irs);
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
168 e = el_var(sp);
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
169 e = el_bin(OPeq,e.Ety, e, ei);
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
170 elem_setLoc(e, loc);
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
171 incUsage(irs, loc);
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
172 block_appendexp(blx.curblock,e);
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
173 }
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
174 // Execute with block
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
175 if (body_)
010eb8f0e18d further work on dmd test suite
korDen
parents: 114
diff changeset
176 body_.toIR(irs);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
177 }
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 49
diff changeset
178 }