annotate dmd/statement.h @ 339:385a18242485 trunk

[svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too! Fixed issues with slice initialization (!!!) of multidimensional static arrays. Attempt to fix issue with referencing nested 'this' pointers introduced in DMD 1.033 merge.
author lindquist
date Sun, 13 Jul 2008 01:29:49 +0200
parents aaade6ded589
children a7a26f538d6e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
1
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
2 // Compiler implementation of the D programming language
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
3 // Copyright (c) 1999-2008 by Digital Mars
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
4 // All Rights Reserved
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
5 // written by Walter Bright
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
6 // http://www.digitalmars.com
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
7 // License for redistribution is by either the Artistic License
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
8 // in artistic.txt, or the GNU General Public License in gnu.txt.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
9 // See the included readme.txt for details.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
10
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
11 #ifndef DMD_STATEMENT_H
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
12 #define DMD_STATEMENT_H
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
13
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
14 #ifdef __DMC__
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
15 #pragma once
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
16 #endif /* __DMC__ */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
17
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
18 #include "root.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
19
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
20 #include "arraytypes.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
21 #include "dsymbol.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
22 #include "lexer.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
23
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
24 struct OutBuffer;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
25 struct Scope;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
26 struct Expression;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
27 struct LabelDsymbol;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
28 struct Identifier;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
29 struct IfStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
30 struct DeclarationStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
31 struct DefaultStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
32 struct VarDeclaration;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
33 struct Condition;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
34 struct Module;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
35 struct Token;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
36 struct InlineCostState;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
37 struct InlineDoState;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
38 struct InlineScanState;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
39 struct ReturnStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
40 struct CompoundStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
41 struct Argument;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
42 struct StaticAssert;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
43 struct AsmStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
44 struct AsmBlockStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
45 struct GotoStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
46 struct ScopeStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
47 struct TryCatchStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
48 struct TryFinallyStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
49 struct HdrGenState;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
50 struct InterState;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
51 struct CaseStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
52 struct LabelStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
53 struct VolatileStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
54 struct SynchronizedStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
55
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
56 enum TOK;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
57
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
58 namespace llvm
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
59 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
60 class Value;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
61 class BasicBlock;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
62 class ConstantInt;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
63 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
64
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
65 // Back end
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
66 struct IRState;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
67 struct Blockx;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
68 #if IN_LLVM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
69 struct DValue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
70 typedef DValue elem;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
71 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
72
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
73 #if IN_GCC
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
74 union tree_node; typedef union tree_node block;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
75 //union tree_node; typedef union tree_node elem;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
76 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
77 struct block;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
78 //struct elem;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
79 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
80 struct code;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
81
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
82 /* How a statement exits
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
83 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
84 enum BE
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
85 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
86 BEnone = 0,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
87 BEfallthru = 1,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
88 BEthrow = 2,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
89 BEreturn = 4,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
90 BEgoto = 8,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
91 BEhalt = 0x10,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
92 BEbreak = 0x20,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
93 BEcontinue = 0x40,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
94 BEany = (BEfallthru | BEthrow | BEreturn | BEgoto | BEhalt),
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
95 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
96
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
97 // LLVMDC this is used for tracking try-finally, synchronized and volatile scopes
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
98 // definitions in gen/llvmhelpers.cpp
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
99 struct EnclosingHandler : Object
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
100 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
101 virtual void emitCode(IRState* p) = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
102 virtual EnclosingHandler* getEnclosing() = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
103 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
104 struct EnclosingTryFinally : EnclosingHandler
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
105 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
106 TryFinallyStatement* tf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
107 void emitCode(IRState* p);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
108 EnclosingHandler* getEnclosing();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
109 EnclosingTryFinally(TryFinallyStatement* _tf) : tf(_tf) {}
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
110 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
111 struct EnclosingVolatile : EnclosingHandler
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
112 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
113 VolatileStatement* v;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
114 void emitCode(IRState* p);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
115 EnclosingHandler* getEnclosing();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
116 EnclosingVolatile(VolatileStatement* _tf) : v(_tf) {}
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
117 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
118 struct EnclosingSynchro : EnclosingHandler
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
119 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
120 SynchronizedStatement* s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
121 void emitCode(IRState* p);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
122 EnclosingHandler* getEnclosing();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
123 EnclosingSynchro(SynchronizedStatement* _tf) : s(_tf) {}
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
124 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
125
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
126 struct Statement : Object
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
127 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
128 Loc loc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
129
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
130 Statement(Loc loc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
131 virtual Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
132
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
133 void print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
134 char *toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
135
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
136 void error(const char *format, ...);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
137 virtual void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
138 virtual TryCatchStatement *isTryCatchStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
139 virtual GotoStatement *isGotoStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
140 virtual AsmStatement *isAsmStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
141 virtual AsmBlockStatement *isAsmBlockStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
142 #ifdef _DH
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
143 int incontract;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
144 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
145 virtual ScopeStatement *isScopeStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
146 virtual Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
147 Statement *semanticScope(Scope *sc, Statement *sbreak, Statement *scontinue);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
148 virtual int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
149 virtual int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
150 virtual int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
151 virtual int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
152 virtual int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
153 virtual int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
154 virtual void scopeCode(Statement **sentry, Statement **sexit, Statement **sfinally);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
155 virtual Statements *flatten(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
156 virtual Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
157
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
158 virtual int inlineCost(InlineCostState *ics);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
159 virtual Expression *doInline(InlineDoState *ids);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
160 virtual Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
161
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
162 // Back end
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
163 virtual void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
164
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
165 // Avoid dynamic_cast
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
166 virtual DeclarationStatement *isDeclarationStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
167 virtual CompoundStatement *isCompoundStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
168 virtual ReturnStatement *isReturnStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
169 virtual IfStatement *isIfStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
170 virtual CaseStatement* isCaseStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
171 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
172
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
173 struct ExpStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
174 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
175 Expression *exp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
176
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
177 ExpStatement(Loc loc, Expression *exp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
178 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
179 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
180 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
181 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
182 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
183 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
184
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
185 int inlineCost(InlineCostState *ics);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
186 Expression *doInline(InlineDoState *ids);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
187 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
188
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
189 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
190 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
191
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
192 struct CompileStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
193 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
194 Expression *exp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
195
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
196 CompileStatement(Loc loc, Expression *exp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
197 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
198 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
199 Statements *flatten(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
200 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
201 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
202
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
203 struct DeclarationStatement : ExpStatement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
204 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
205 // Doing declarations as an expression, rather than a statement,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
206 // makes inlining functions much easier.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
207
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
208 DeclarationStatement(Loc loc, Dsymbol *s);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
209 DeclarationStatement(Loc loc, Expression *exp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
210 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
211 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
212 void scopeCode(Statement **sentry, Statement **sexit, Statement **sfinally);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
213
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
214 DeclarationStatement *isDeclarationStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
215 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
216
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
217 struct CompoundStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
218 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
219 Statements *statements;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
220
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
221 CompoundStatement(Loc loc, Statements *s);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
222 CompoundStatement(Loc loc, Statement *s1, Statement *s2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
223 virtual Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
224 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
225 virtual Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
226 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
227 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
228 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
229 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
230 virtual Statements *flatten(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
231 ReturnStatement *isReturnStatement();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
232 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
233
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
234 int inlineCost(InlineCostState *ics);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
235 Expression *doInline(InlineDoState *ids);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
236 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
237
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
238 virtual void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
239
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
240 virtual CompoundStatement *isCompoundStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
241 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
242
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
243 /* The purpose of this is so that continue will go to the next
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
244 * of the statements, and break will go to the end of the statements.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
245 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
246 struct UnrolledLoopStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
247 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
248 Statements *statements;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
249 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
250
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
251 UnrolledLoopStatement(Loc loc, Statements *statements);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
252 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
253 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
254 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
255 int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
256 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
257 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
258 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
259 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
260 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
261 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
262
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
263 int inlineCost(InlineCostState *ics);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
264 Expression *doInline(InlineDoState *ids);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
265 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
266
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
267 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
268 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
269
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
270 struct ScopeStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
271 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
272 Statement *statement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
273
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
274 ScopeStatement(Loc loc, Statement *s);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
275 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
276 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
277 ScopeStatement *isScopeStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
278 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
279 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
280 int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
281 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
282 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
283 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
284 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
285 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
286
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
287 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
288
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
289 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
290 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
291
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
292 struct WhileStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
293 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
294 Expression *condition;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
295 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
296 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
297
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
298 WhileStatement(Loc loc, Expression *c, Statement *b);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
299 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
300 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
301 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
302 int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
303 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
304 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
305 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
306 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
307 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
308 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
309
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
310 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
311
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
312 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
313 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
314
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
315 struct DoStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
316 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
317 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
318 Expression *condition;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
319 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
320
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
321 DoStatement(Loc loc, Statement *b, Expression *c);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
322 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
323 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
324 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
325 int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
326 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
327 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
328 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
329 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
330 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
331 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
332
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
333 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
334
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
335 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
336 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
337
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
338 struct ForStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
339 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
340 Statement *init;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
341 Expression *condition;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
342 Expression *increment;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
343 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
344 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
345
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
346 ForStatement(Loc loc, Statement *init, Expression *condition, Expression *increment, Statement *body);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
347 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
348 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
349 void scopeCode(Statement **sentry, Statement **sexit, Statement **sfinally);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
350 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
351 int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
352 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
353 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
354 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
355 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
356 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
357 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
358
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
359 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
360
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
361 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
362 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
363
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
364 struct ForeachStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
365 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
366 enum TOK op; // TOKforeach or TOKforeach_reverse
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
367 Arguments *arguments; // array of Argument*'s
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
368 Expression *aggr;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
369 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
370 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
371
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
372 VarDeclaration *key;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
373 VarDeclaration *value;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
374
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
375 FuncDeclaration *func; // function we're lexically in
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
376
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
377 Array cases; // put breaks, continues, gotos and returns here
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
378 Array gotos; // forward referenced goto's go here
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
379
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
380 ForeachStatement(Loc loc, enum TOK op, Arguments *arguments, Expression *aggr, Statement *body);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
381 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
382 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
383 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
384 int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
385 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
386 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
387 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
388 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
389 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
390 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
391
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
392 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
393
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
394 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
395 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
396
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
397 #if DMDV2
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
398 struct ForeachRangeStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
399 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
400 enum TOK op; // TOKforeach or TOKforeach_reverse
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
401 Argument *arg; // loop index variable
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
402 Expression *lwr;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
403 Expression *upr;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
404 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
405
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
406 VarDeclaration *key;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
407
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
408 ForeachRangeStatement(Loc loc, enum TOK op, Argument *arg,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
409 Expression *lwr, Expression *upr, Statement *body);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
410 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
411 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
412 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
413 int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
414 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
415 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
416 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
417 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
418 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
419 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
420
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
421 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
422
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
423 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
424 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
425 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
426
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
427 struct IfStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
428 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
429 Argument *arg;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
430 Expression *condition;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
431 Statement *ifbody;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
432 Statement *elsebody;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
433
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
434 VarDeclaration *match; // for MatchExpression results
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
435
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
436 IfStatement(Loc loc, Argument *arg, Expression *condition, Statement *ifbody, Statement *elsebody);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
437 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
438 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
439 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
440 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
441 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
442 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
443 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
444 IfStatement *isIfStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
445
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
446 int inlineCost(InlineCostState *ics);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
447 Expression *doInline(InlineDoState *ids);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
448 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
449
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
450 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
451 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
452
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
453 struct ConditionalStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
454 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
455 Condition *condition;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
456 Statement *ifbody;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
457 Statement *elsebody;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
458
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
459 ConditionalStatement(Loc loc, Condition *condition, Statement *ifbody, Statement *elsebody);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
460 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
461 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
462 Statements *flatten(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
463 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
464
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
465 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
466 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
467
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
468 struct PragmaStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
469 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
470 Identifier *ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
471 Expressions *args; // array of Expression's
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
472 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
473
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
474 PragmaStatement(Loc loc, Identifier *ident, Expressions *args, Statement *body);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
475 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
476 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
477 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
478 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
479 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
480
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
481 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
482 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
483
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
484 struct StaticAssertStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
485 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
486 StaticAssert *sa;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
487
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
488 StaticAssertStatement(StaticAssert *sa);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
489 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
490 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
491
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
492 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
493 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
494
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
495 struct SwitchStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
496 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
497 Expression *condition;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
498 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
499
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
500 DefaultStatement *sdefault;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
501 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
502
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
503 Array gotoCases; // array of unresolved GotoCaseStatement's
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
504 Array *cases; // array of CaseStatement's
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
505 int hasNoDefault; // !=0 if no default statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
506
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
507 SwitchStatement(Loc loc, Expression *c, Statement *b);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
508 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
509 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
510 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
511 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
512 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
513 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
514 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
515 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
516
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
517 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
518
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
519 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
520 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
521
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
522 struct CaseStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
523 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
524 Expression *exp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
525 Statement *statement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
526 int index; // which case it is (since we sort this)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
527 block *cblock; // back end: label for the block
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
528
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
529 CaseStatement(Loc loc, Expression *exp, Statement *s);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
530 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
531 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
532 int compare(Object *obj);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
533 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
534 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
535 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
536 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
537 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
538 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
539
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
540 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
541
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
542 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
543
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
544 CaseStatement* isCaseStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
545
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
546 // LLVMDC
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
547 llvm::BasicBlock* bodyBB;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
548 llvm::ConstantInt* llvmIdx;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
549 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
550
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
551 struct DefaultStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
552 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
553 Statement *statement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
554 #if IN_GCC
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
555 block *cblock; // back end: label for the block
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
556 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
557
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
558 DefaultStatement(Loc loc, Statement *s);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
559 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
560 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
561 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
562 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
563 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
564 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
565 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
566 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
567
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
568 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
569
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
570 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
571
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
572 // LLVMDC
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
573 llvm::BasicBlock* bodyBB;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
574 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
575
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
576 struct GotoDefaultStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
577 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
578 SwitchStatement *sw;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
579 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
580
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
581 GotoDefaultStatement(Loc loc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
582 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
583 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
584 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
585 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
586 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
587 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
588
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
589 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
590 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
591
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
592 struct GotoCaseStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
593 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
594 Expression *exp; // NULL, or which case to goto
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
595 CaseStatement *cs; // case statement it resolves to
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
596 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
597 SwitchStatement *sw;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
598
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
599 GotoCaseStatement(Loc loc, Expression *exp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
600 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
601 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
602 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
603 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
604 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
605 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
606
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
607 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
608 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
609
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
610 struct SwitchErrorStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
611 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
612 SwitchErrorStatement(Loc loc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
613 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
614 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
615 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
616
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
617 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
618 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
619
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
620 struct ReturnStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
621 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
622 Expression *exp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
623 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
624
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
625 ReturnStatement(Loc loc, Expression *exp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
626 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
627 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
628 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
629 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
630 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
631 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
632
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
633 int inlineCost(InlineCostState *ics);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
634 Expression *doInline(InlineDoState *ids);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
635 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
636
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
637 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
638
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
639 ReturnStatement *isReturnStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
640 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
641
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
642 struct BreakStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
643 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
644 Identifier *ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
645 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
646
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
647 BreakStatement(Loc loc, Identifier *ident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
648 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
649 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
650 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
651 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
652 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
653 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
654
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
655 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
656
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
657 // LLVMDC: only set if ident is set: label statement to jump to
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
658 LabelStatement *target;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
659 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
660
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
661 struct ContinueStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
662 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
663 Identifier *ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
664 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
665
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
666 ContinueStatement(Loc loc, Identifier *ident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
667 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
668 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
669 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
670 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
671 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
672 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
673
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
674 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
675
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
676 // LLVMDC: only set if ident is set: label statement to jump to
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
677 LabelStatement *target;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
678 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
679
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
680 struct SynchronizedStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
681 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
682 Expression *exp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
683 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
684 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
685
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
686 SynchronizedStatement(Loc loc, Expression *exp, Statement *body);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
687 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
688 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
689 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
690 int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
691 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
692 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
693 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
694 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
695
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
696 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
697
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
698 // Back end
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
699 elem *esync;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
700 SynchronizedStatement(Loc loc, elem *esync, Statement *body);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
701 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
702 llvm::Value* llsync;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
703 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
704
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
705 struct WithStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
706 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
707 Expression *exp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
708 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
709 VarDeclaration *wthis;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
710
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
711 WithStatement(Loc loc, Expression *exp, Statement *body);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
712 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
713 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
714 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
715 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
716 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
717 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
718
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
719 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
720
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
721 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
722 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
723
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
724 struct TryCatchStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
725 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
726 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
727 Array *catches;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
728
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
729 TryCatchStatement(Loc loc, Statement *body, Array *catches);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
730 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
731 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
732 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
733 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
734 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
735 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
736
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
737 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
738
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
739 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
740 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
741 TryCatchStatement *isTryCatchStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
742 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
743
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
744 struct Catch : Object
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
745 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
746 Loc loc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
747 Type *type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
748 Identifier *ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
749 VarDeclaration *var;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
750 Statement *handler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
751
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
752 Catch(Loc loc, Type *t, Identifier *id, Statement *handler);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
753 Catch *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
754 void semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
755 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
756 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
757 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
758
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
759 struct TryFinallyStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
760 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
761 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
762 Statement *finalbody;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
763 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
764
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
765 TryFinallyStatement(Loc loc, Statement *body, Statement *finalbody);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
766 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
767 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
768 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
769 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
770 int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
771 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
772 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
773 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
774
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
775 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
776
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
777 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
778 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
779
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
780 struct OnScopeStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
781 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
782 TOK tok;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
783 Statement *statement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
784
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
785 OnScopeStatement(Loc loc, TOK tok, Statement *statement);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
786 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
787 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
788 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
789 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
790 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
791 void scopeCode(Statement **sentry, Statement **sexit, Statement **sfinally);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
792
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
793 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
794 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
795
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
796 struct ThrowStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
797 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
798 Expression *exp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
799
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
800 ThrowStatement(Loc loc, Expression *exp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
801 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
802 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
803 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
804 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
805 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
806
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
807 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
808
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
809 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
810 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
811
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
812 struct VolatileStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
813 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
814 Statement *statement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
815 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
816
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
817 VolatileStatement(Loc loc, Statement *statement);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
818 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
819 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
820 Statements *flatten(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
821 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
822 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
823 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
824
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
825 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
826
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
827 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
828 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
829
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
830 struct GotoStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
831 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
832 Identifier *ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
833 LabelDsymbol *label;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
834 TryFinallyStatement *tf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
835 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
836
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
837 GotoStatement(Loc loc, Identifier *ident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
838 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
839 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
840 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
841 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
842 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
843
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
844 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
845 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
846 GotoStatement *isGotoStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
847 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
848
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
849 struct LabelStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
850 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
851 Identifier *ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
852 Statement *statement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
853 TryFinallyStatement *tf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
854 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
855 block *lblock; // back end
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
856 int isReturnLabel;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
857
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
858 LabelStatement(Loc loc, Identifier *ident, Statement *statement);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
859 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
860 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
861 Statements *flatten(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
862 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
863 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
864 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
865 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
866 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
867 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
868
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
869 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
870
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
871 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
872
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
873 // LLVMDC
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
874 llvm::BasicBlock* llvmBB;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
875 bool asmLabel; // for labels inside inline assembler
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
876 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
877
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
878 struct LabelDsymbol : Dsymbol
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
879 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
880 LabelStatement *statement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
881
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
882 LabelDsymbol(Identifier *ident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
883 LabelDsymbol *isLabel();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
884 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
885
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
886 struct AsmStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
887 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
888 Token *tokens;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
889 code *asmcode;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
890 unsigned asmalign; // alignment of this statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
891 unsigned refparam; // !=0 if function parameter is referenced
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
892 unsigned naked; // !=0 if function is to be naked
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
893 unsigned regs; // mask of registers modified
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
894
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
895 AsmStatement(Loc loc, Token *tokens);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
896 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
897 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
898 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
899 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
900
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
901 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
902 virtual AsmStatement *isAsmStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
903
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
904 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
905
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
906 // LLVMDC
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
907 // non-zero if this is a branch, contains the target labels identifier
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
908 Identifier* isBranchToLabel;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
909 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
910
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
911 struct AsmBlockStatement : CompoundStatement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
912 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
913 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
914
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
915 AsmBlockStatement(Loc loc, Statements *s);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
916 Statements *flatten(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
917 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
918 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
919
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
920 CompoundStatement *isCompoundStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
921 AsmBlockStatement *isAsmBlockStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
922
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
923 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
924 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
925
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
926 #endif /* DMD_STATEMENT_H */