annotate dmd/PragmaStatement.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 e28b18c23469
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.PragmaStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 97
diff changeset
3 import dmd.common;
97
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
4 import dmd.expression.Util;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5 import dmd.Statement;
97
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
6 import dmd.StringExp;
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
7 import dmd.Id;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
8 import dmd.Identifier;
97
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
9 import dmd.Dsymbol;
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
10 import dmd.Expression;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
11 import dmd.Loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
12 import dmd.Identifier;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
13 import dmd.Scope;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
14 import dmd.OutBuffer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
15 import dmd.HdrGenState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
16 import dmd.IRState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
17 import dmd.BE;
97
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
18 import dmd.TOK;
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
19 import dmd.WANT;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
20
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
21 class PragmaStatement : Statement
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
22 {
97
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
23 Identifier ident;
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
24 Expressions args; // array of Expression's
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
25 Statement body_;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
26
97
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
27 this(Loc loc, Identifier ident, Expressions args, Statement body_)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
28 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 114
diff changeset
29 register();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30 super(loc);
97
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
31 this.ident = ident;
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
32 this.args = args;
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
33 this.body_ = body_;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
34 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
35
97
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
36 override Statement syntaxCopy()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
37 {
97
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
38 Statement b = null;
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
39 if (body_)
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
40 b = body_.syntaxCopy();
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
41 PragmaStatement s = new PragmaStatement(loc,
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
42 ident, Expression.arraySyntaxCopy(args), b);
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
43 return s;
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
44
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
45 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
46
97
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
47 override Statement semantic(Scope sc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
48 {
97
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
49 // Should be merged with PragmaDeclaration
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
50 //writef("PragmaStatement.semantic() %s\n", toChars());
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
51 //writef("body = %p\n", body_);
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
52 if (ident == Id.msg)
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
53 {
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
54 if (args)
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
55 {
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
56 foreach (Expression e; args)
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
57 {
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
58 e = e.semantic(sc);
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
59 e = e.optimize(WANTvalue | WANTinterpret);
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
60 if (e.op == TOK.TOKstring)
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
61 {
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
62 StringExp se = cast(StringExp)e;
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
63 writef("%.*s", se.len, cast(char*)se.string_);
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
64 }
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
65 else
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
66 writef(e.toChars());
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
67 }
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
68 writef("\n");
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
69 }
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
70 }
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
71 else if (ident == Id.lib)
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
72 {
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
73 static if (true)
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
74 {
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
75 /* Should this be allowed?
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
76 */
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
77 error("pragma(lib) not allowed as statement");
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
78 }
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
79 else
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
80 {
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
81 if (!args || args.dim != 1)
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
82 error("string expected for library name");
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
83 else
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
84 {
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
85 Expression e = args[0];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
86
97
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
87 e = e.semantic(sc);
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
88 e = e.optimize(WANTvalue | WANTinterpret);
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
89 args[0] = e;
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
90 if (e.op != TOKstring)
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
91 error("string expected for library name, not '%s'", e.toChars());
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
92 else if (global.params.verbose)
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
93 {
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
94 StringExp se = cast(StringExp)e;
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
95 writef("library %.*s\n", se.len, se.string_);
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
96 }
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
97 }
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
98 }
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
99 }
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
100 //version(DMDV2) // TODO:
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
101 //{
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
102 else if (ident == Id.startaddress)
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
103 {
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
104 if (!args || args.dim != 1)
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
105 error("function name expected for start address");
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
106 else
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
107 {
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
108 Expression e = args[0];
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
109 e = e.semantic(sc);
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
110 e = e.optimize(WANTvalue | WANTinterpret);
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
111 args[0] = e;
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
112 Dsymbol sa = getDsymbol(e);
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
113 if (!sa || !sa.isFuncDeclaration())
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
114 error("function name expected for start address, not '%s'", e.toChars());
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
115 if (body_)
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
116 {
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
117 body_ = body_.semantic(sc);
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
118 }
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
119 return this;
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
120 }
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
121 }
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
122 //}
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
123 else
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
124 error("unrecognized pragma(%s)", ident.toChars());
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
125
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
126 if (body_)
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
127 {
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
128 body_ = body_.semantic(sc);
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
129 }
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
130 return body_;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
131 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
132
97
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
133 override bool usesEH()
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
134 {
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
135 return body_ && body_.usesEH();
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
136 }
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
137
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
138 override BE blockExit()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
139 {
97
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
140 BE result = BEfallthru;
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
141 static if (false) // currently, no code is generated for Pragma's, so it's just fallthru
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
142 {
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
143 if (arrayExpressionCanThrow(args))
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
144 result |= BEthrow;
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
145 if (body_)
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
146 result |= body_.blockExit();
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
147 }
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
148 return result;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
149 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
150
97
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
151 override void toCBuffer(OutBuffer buf, HdrGenState* hgs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
152 {
97
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
153 buf.writestring("pragma (");
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
154 buf.writestring(ident.toChars());
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
155 if (args && args.dim)
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
156 {
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
157 buf.writestring(", ");
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
158 argsToCBuffer(buf, args, hgs);
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
159 }
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
160 buf.writeByte(')');
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
161 if (body_)
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
162 {
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
163 buf.writenl();
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
164 buf.writeByte('{');
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
165 buf.writenl();
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
166
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
167 body_.toCBuffer(buf, hgs);
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
168
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
169 buf.writeByte('}');
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
170 buf.writenl();
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
171 }
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
172 else
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
173 {
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
174 buf.writeByte(';');
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
175 buf.writenl();
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
176 }
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
177
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
178 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
179
97
d78e4992d6ec implemented most of PragmaStatement
Trass3r
parents: 84
diff changeset
180 override void toIR(IRState* irs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
181 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
182 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
183 }
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 2
diff changeset
184 }