annotate dmd/inline.c @ 1650:40bd4a0d4870

Update to work with LLVM 2.7. Removed use of dyn_cast, llvm no compiles without exceptions and rtti by default. We do need exceptions for the libconfig stuff, but rtti isn't necessary (anymore). Debug info needs to be rewritten, as in LLVM 2.7 the format has completely changed. To have something to look at while rewriting, the old code has been wrapped inside #ifndef DISABLE_DEBUG_INFO , this means that you have to define this to compile at the moment. Updated tango 0.99.9 patch to include updated EH runtime code, which is needed for LLVM 2.7 as well.
author Tomas Lindquist Olsen
date Wed, 19 May 2010 12:42:32 +0200
parents 9bf06e02070b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1
1640
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1630
diff changeset
2 // Copyright (c) 1999-2010 by Digital Mars
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
3 // All Rights Reserved
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
4 // written by Walter Bright
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
5 // http://www.digitalmars.com
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
6 // License for redistribution is by either the Artistic License
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
7 // in artistic.txt, or the GNU General Public License in gnu.txt.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
8 // See the included readme.txt for details.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
9
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
10 // Routines to perform function inlining
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
11
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
12 #define LOG 0
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
13
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
14 #include <stdio.h>
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
15 #include <stdlib.h>
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
16 #include <assert.h>
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
17
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
18 #include "id.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
19 #include "init.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
20 #include "declaration.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
21 #include "aggregate.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
22 #include "expression.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
23 #include "statement.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
24 #include "mtype.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
25
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
26 /* ========== Compute cost of inlining =============== */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
27
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
28 /* Walk trees to determine if inlining can be done, and if so,
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
29 * if it is too complex to be worth inlining or not.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
30 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
31
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
32 struct InlineCostState
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
33 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
34 int nested;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
35 int hasthis;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
36 int hdrscan; // !=0 if inline scan for 'header' content
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
37 FuncDeclaration *fd;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
38 };
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
39
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
40 const int COST_MAX = 250;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
41
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
42 int Statement::inlineCost(InlineCostState *ics)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
43 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
44 return COST_MAX; // default is we can't inline it
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
45 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
46
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
47 int ExpStatement::inlineCost(InlineCostState *ics)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
48 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
49 return exp ? exp->inlineCost(ics) : 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
50 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
51
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
52 int CompoundStatement::inlineCost(InlineCostState *ics)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
53 { int cost = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
54
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
55 for (size_t i = 0; i < statements->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
56 { Statement *s = (Statement *) statements->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
57 if (s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
58 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
59 cost += s->inlineCost(ics);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
60 if (cost >= COST_MAX)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
61 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
62 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
63 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
64 return cost;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
65 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
66
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
67 int UnrolledLoopStatement::inlineCost(InlineCostState *ics)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
68 { int cost = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
69
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
70 for (size_t i = 0; i < statements->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
71 { Statement *s = (Statement *) statements->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
72 if (s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
73 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
74 cost += s->inlineCost(ics);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
75 if (cost >= COST_MAX)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
76 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
77 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
78 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
79 return cost;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
80 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
81
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
82 int IfStatement::inlineCost(InlineCostState *ics)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
83 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
84 int cost;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
85
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
86 #if !IN_LLVM
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
87 /* Can't declare variables inside ?: expressions, so
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
88 * we cannot inline if a variable is declared.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
89 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
90 if (arg)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
91 return COST_MAX;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
92 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
93
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
94 cost = condition->inlineCost(ics);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
95
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
96 #if !IN_LLVM
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
97 /* Specifically allow:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
98 * if (condition)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
99 * return exp1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
100 * else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
101 * return exp2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
102 * Otherwise, we can't handle return statements nested in if's.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
103 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
104
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
105 if (elsebody && ifbody &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
106 ifbody->isReturnStatement() &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
107 elsebody->isReturnStatement())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
108 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
109 cost += ifbody->inlineCost(ics);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
110 cost += elsebody->inlineCost(ics);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
111 //printf("cost = %d\n", cost);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
112 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
113 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
114 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
115 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
116 ics->nested += 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
117 if (ifbody)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
118 cost += ifbody->inlineCost(ics);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
119 if (elsebody)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
120 cost += elsebody->inlineCost(ics);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
121 ics->nested -= 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
122 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
123 return cost;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
124 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
125
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
126 int ReturnStatement::inlineCost(InlineCostState *ics)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
127 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
128 #if !IN_LLVM
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
129 // Can't handle return statements nested in if's
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
130 if (ics->nested)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
131 return COST_MAX;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
132 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
133 return exp ? exp->inlineCost(ics) : 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
134 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
135
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
136 /* -------------------------- */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
137
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
138 int arrayInlineCost(InlineCostState *ics, Array *arguments)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
139 { int cost = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
140
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
141 if (arguments)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
142 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
143 for (int i = 0; i < arguments->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
144 { Expression *e = (Expression *)arguments->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
145
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
146 if (e)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
147 cost += e->inlineCost(ics);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
148 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
149 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
150 return cost;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
151 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
152
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
153 int Expression::inlineCost(InlineCostState *ics)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
154 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
155 return 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
156 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
157
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
158 int VarExp::inlineCost(InlineCostState *ics)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
159 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
160 //printf("VarExp::inlineCost() %s\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
161 return 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
162 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
163
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
164 int ThisExp::inlineCost(InlineCostState *ics)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
165 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
166 #if !IN_LLVM
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
167 FuncDeclaration *fd = ics->fd;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
168 if (!ics->hdrscan)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
169 if (fd->isNested() || !ics->hasthis)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
170 return COST_MAX;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
171 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
172 return 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
173 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
174
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
175 int SuperExp::inlineCost(InlineCostState *ics)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
176 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
177 #if !IN_LLVM
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
178 FuncDeclaration *fd = ics->fd;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
179 if (!ics->hdrscan)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
180 if (fd->isNested() || !ics->hasthis)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
181 return COST_MAX;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
182 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
183 return 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
184 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
185
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
186 int TupleExp::inlineCost(InlineCostState *ics)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
187 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
188 return 1 + arrayInlineCost(ics, exps);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
189 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
190
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
191 int ArrayLiteralExp::inlineCost(InlineCostState *ics)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
192 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
193 return 1 + arrayInlineCost(ics, elements);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
194 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
195
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
196 int AssocArrayLiteralExp::inlineCost(InlineCostState *ics)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
197 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
198 return 1 + arrayInlineCost(ics, keys) + arrayInlineCost(ics, values);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
199 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
200
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
201 int StructLiteralExp::inlineCost(InlineCostState *ics)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
202 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
203 return 1 + arrayInlineCost(ics, elements);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
204 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
205
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
206 int FuncExp::inlineCost(InlineCostState *ics)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
207 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
208 // This breaks on LDC too, since nested functions have internal linkage
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
209 // and thus can't be referenced from other objects.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
210 // Right now, this makes the function be output to the .obj file twice.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
211 return COST_MAX;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
212 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
213
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
214 int DelegateExp::inlineCost(InlineCostState *ics)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
215 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
216 // This breaks on LDC too, since nested functions have internal linkage
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
217 // and thus can't be referenced from other objects.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
218 return COST_MAX;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
219 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
220
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
221 int DeclarationExp::inlineCost(InlineCostState *ics)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
222 { int cost = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
223 VarDeclaration *vd;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
224
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
225 //printf("DeclarationExp::inlineCost()\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
226 vd = declaration->isVarDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
227 if (vd)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
228 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
229 TupleDeclaration *td = vd->toAlias()->isTupleDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
230 if (td)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
231 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
232 #if 1
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
233 return COST_MAX; // finish DeclarationExp::doInline
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
234 #else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
235 for (size_t i = 0; i < td->objects->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
236 { Object *o = (Object *)td->objects->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
237 if (o->dyncast() != DYNCAST_EXPRESSION)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
238 return COST_MAX;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
239 Expression *eo = (Expression *)o;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
240 if (eo->op != TOKdsymbol)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
241 return COST_MAX;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
242 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
243 return td->objects->dim;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
244 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
245 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
246 // This breaks on LDC too, since nested static variables have internal
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
247 // linkage and thus can't be referenced from other objects.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
248 if (!ics->hdrscan && vd->isDataseg())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
249 return COST_MAX;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
250 cost += 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
251
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
252 // Scan initializer (vd->init)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
253 if (vd->init)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
254 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
255 ExpInitializer *ie = vd->init->isExpInitializer();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
256
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
257 if (ie)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
258 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
259 cost += ie->exp->inlineCost(ics);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
260 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
261 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
262 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
263
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
264 // These can contain functions, which when copied, get output twice.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
265 // These break on LDC too, since nested static variables and functions have
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
266 // internal linkage and thus can't be referenced from other objects.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
267 if (declaration->isStructDeclaration() ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
268 declaration->isClassDeclaration() ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
269 declaration->isFuncDeclaration() ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
270 declaration->isTypedefDeclaration() ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
271 declaration->isTemplateMixin())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
272 return COST_MAX;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
273
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
274 //printf("DeclarationExp::inlineCost('%s')\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
275 return cost;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
276 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
277
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
278 int UnaExp::inlineCost(InlineCostState *ics)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
279 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
280 return 1 + e1->inlineCost(ics);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
281 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
282
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
283 int AssertExp::inlineCost(InlineCostState *ics)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
284 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
285 return 1 + e1->inlineCost(ics) + (msg ? msg->inlineCost(ics) : 0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
286 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
287
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
288 int BinExp::inlineCost(InlineCostState *ics)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
289 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
290 return 1 + e1->inlineCost(ics) + e2->inlineCost(ics);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
291 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
292
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
293 int CallExp::inlineCost(InlineCostState *ics)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
294 {
1640
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1630
diff changeset
295 // Bugzilla 3500: super.func() calls must be devirtualized, and the inliner
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1630
diff changeset
296 // can't handle that at present.
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1630
diff changeset
297 if (e1->op == TOKdotvar && ((DotVarExp *)e1)->e1->op == TOKsuper)
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1630
diff changeset
298 return COST_MAX;
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1630
diff changeset
299
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
300 return 1 + e1->inlineCost(ics) + arrayInlineCost(ics, arguments);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
301 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
302
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
303 int SliceExp::inlineCost(InlineCostState *ics)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
304 { int cost;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
305
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
306 cost = 1 + e1->inlineCost(ics);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
307 if (lwr)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
308 cost += lwr->inlineCost(ics);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
309 if (upr)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
310 cost += upr->inlineCost(ics);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
311 return cost;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
312 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
313
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
314 int ArrayExp::inlineCost(InlineCostState *ics)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
315 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
316 return 1 + e1->inlineCost(ics) + arrayInlineCost(ics, arguments);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
317 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
318
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
319
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
320 int CondExp::inlineCost(InlineCostState *ics)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
321 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
322 return 1 +
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
323 e1->inlineCost(ics) +
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
324 e2->inlineCost(ics) +
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
325 econd->inlineCost(ics);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
326 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
327
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
328
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
329 /* ======================== Perform the inlining ============================== */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
330
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
331 /* Inlining is done by:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
332 * o Converting to an Expression
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
333 * o Copying the trees of the function to be inlined
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
334 * o Renaming the variables
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
335 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
336
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
337 struct InlineDoState
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
338 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
339 VarDeclaration *vthis;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
340 Array from; // old Dsymbols
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
341 Array to; // parallel array of new Dsymbols
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
342 Dsymbol *parent; // new parent
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
343 };
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
344
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
345 Expression *Statement::doInline(InlineDoState *ids)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
346 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
347 assert(0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
348 return NULL; // default is we can't inline it
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
349 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
350
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
351 Expression *ExpStatement::doInline(InlineDoState *ids)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
352 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
353 #if LOG
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
354 if (exp) printf("ExpStatement::doInline() '%s'\n", exp->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
355 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
356 return exp ? exp->doInline(ids) : NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
357 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
358
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
359 Expression *CompoundStatement::doInline(InlineDoState *ids)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
360 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
361 Expression *e = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
362
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
363 //printf("CompoundStatement::doInline() %d\n", statements->dim);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
364 for (size_t i = 0; i < statements->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
365 { Statement *s = (Statement *) statements->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
366 if (s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
367 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
368 Expression *e2 = s->doInline(ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
369 e = Expression::combine(e, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
370 if (s->isReturnStatement())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
371 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
372
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
373 /* Check for:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
374 * if (condition)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
375 * return exp1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
376 * else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
377 * return exp2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
378 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
379 IfStatement *ifs = s->isIfStatement();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
380 if (ifs && ifs->elsebody && ifs->ifbody &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
381 ifs->ifbody->isReturnStatement() &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
382 ifs->elsebody->isReturnStatement()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
383 )
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
384 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
385
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
386 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
387 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
388 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
389 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
390
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
391 Expression *UnrolledLoopStatement::doInline(InlineDoState *ids)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
392 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
393 Expression *e = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
394
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
395 //printf("UnrolledLoopStatement::doInline() %d\n", statements->dim);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
396 for (size_t i = 0; i < statements->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
397 { Statement *s = (Statement *) statements->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
398 if (s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
399 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
400 Expression *e2 = s->doInline(ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
401 e = Expression::combine(e, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
402 if (s->isReturnStatement())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
403 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
404 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
405 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
406 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
407 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
408
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
409 Expression *IfStatement::doInline(InlineDoState *ids)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
410 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
411 Expression *econd;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
412 Expression *e1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
413 Expression *e2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
414 Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
415
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
416 assert(!arg);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
417 econd = condition->doInline(ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
418 assert(econd);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
419 if (ifbody)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
420 e1 = ifbody->doInline(ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
421 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
422 e1 = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
423 if (elsebody)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
424 e2 = elsebody->doInline(ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
425 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
426 e2 = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
427 if (e1 && e2)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
428 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
429 e = new CondExp(econd->loc, econd, e1, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
430 e->type = e1->type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
431 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
432 else if (e1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
433 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
434 e = new AndAndExp(econd->loc, econd, e1);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
435 e->type = Type::tvoid;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
436 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
437 else if (e2)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
438 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
439 e = new OrOrExp(econd->loc, econd, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
440 e->type = Type::tvoid;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
441 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
442 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
443 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
444 e = econd;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
445 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
446 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
447 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
448
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
449 Expression *ReturnStatement::doInline(InlineDoState *ids)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
450 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
451 //printf("ReturnStatement::doInline() '%s'\n", exp ? exp->toChars() : "");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
452 return exp ? exp->doInline(ids) : 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
453 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
454
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
455 /* --------------------------------------------------------------- */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
456
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
457 /******************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
458 * Perform doInline() on an array of Expressions.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
459 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
460
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
461 Expressions *arrayExpressiondoInline(Expressions *a, InlineDoState *ids)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
462 { Expressions *newa = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
463
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
464 if (a)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
465 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
466 newa = new Expressions();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
467 newa->setDim(a->dim);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
468
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
469 for (int i = 0; i < a->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
470 { Expression *e = (Expression *)a->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
471
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
472 if (e)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
473 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
474 e = e->doInline(ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
475 newa->data[i] = (void *)e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
476 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
477 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
478 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
479 return newa;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
480 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
481
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
482 Expression *Expression::doInline(InlineDoState *ids)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
483 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
484 //printf("Expression::doInline(%s): %s\n", Token::toChars(op), toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
485 return copy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
486 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
487
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
488 Expression *SymOffExp::doInline(InlineDoState *ids)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
489 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
490 int i;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
491
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
492 //printf("SymOffExp::doInline(%s)\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
493 for (i = 0; i < ids->from.dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
494 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
495 if (var == (Declaration *)ids->from.data[i])
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
496 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
497 SymOffExp *se = (SymOffExp *)copy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
498
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
499 se->var = (Declaration *)ids->to.data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
500 return se;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
501 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
502 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
503 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
504 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
505
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
506 Expression *VarExp::doInline(InlineDoState *ids)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
507 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
508 int i;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
509
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
510 //printf("VarExp::doInline(%s)\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
511 for (i = 0; i < ids->from.dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
512 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
513 if (var == (Declaration *)ids->from.data[i])
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
514 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
515 VarExp *ve = (VarExp *)copy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
516
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
517 ve->var = (Declaration *)ids->to.data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
518 return ve;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
519 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
520 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
521 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
522 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
523
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
524 Expression *ThisExp::doInline(InlineDoState *ids)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
525 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
526 //if (!ids->vthis)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
527 //error("no 'this' when inlining %s", ids->parent->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
528 if (!ids->vthis)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
529 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
530 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
531 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
532
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
533 VarExp *ve = new VarExp(loc, ids->vthis);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
534 ve->type = type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
535 return ve;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
536 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
537
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
538 Expression *SuperExp::doInline(InlineDoState *ids)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
539 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
540 assert(ids->vthis);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
541
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
542 VarExp *ve = new VarExp(loc, ids->vthis);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
543 ve->type = type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
544 return ve;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
545 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
546
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
547 Expression *DeclarationExp::doInline(InlineDoState *ids)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
548 { DeclarationExp *de = (DeclarationExp *)copy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
549 VarDeclaration *vd;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
550
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
551 //printf("DeclarationExp::doInline(%s)\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
552 vd = declaration->isVarDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
553 if (vd)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
554 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
555 #if 0
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
556 // Need to figure this out before inlining can work for tuples
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
557 TupleDeclaration *td = vd->toAlias()->isTupleDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
558 if (td)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
559 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
560 for (size_t i = 0; i < td->objects->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
561 { DsymbolExp *se = (DsymbolExp *)td->objects->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
562 assert(se->op == TOKdsymbol);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
563 se->s;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
564 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
565 return st->objects->dim;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
566 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
567 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
568 if (vd->isStatic() || vd->isConst())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
569 ;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
570 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
571 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
572 VarDeclaration *vto;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
573
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
574 vto = new VarDeclaration(vd->loc, vd->type, vd->ident, vd->init);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
575 *vto = *vd;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
576 vto->parent = ids->parent;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
577 #if IN_DMD
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
578 vto->csym = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
579 vto->isym = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
580 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
581
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
582 ids->from.push(vd);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
583 ids->to.push(vto);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
584
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
585 if (vd->init)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
586 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
587 if (vd->init->isVoidInitializer())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
588 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
589 vto->init = new VoidInitializer(vd->init->loc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
590 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
591 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
592 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
593 ExpInitializer *ie = vd->init->isExpInitializer();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
594 assert(ie);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
595 vto->init = new ExpInitializer(ie->loc, ie->exp->doInline(ids));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
596 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
597 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
598 de->declaration = (Dsymbol *) (void *)vto;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
599 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
600 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
601 /* This needs work, like DeclarationExp::toElem(), if we are
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
602 * to handle TemplateMixin's. For now, we just don't inline them.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
603 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
604 return de;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
605 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
606
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
607 Expression *NewExp::doInline(InlineDoState *ids)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
608 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
609 //printf("NewExp::doInline(): %s\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
610 NewExp *ne = (NewExp *)copy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
611
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
612 if (thisexp)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
613 ne->thisexp = thisexp->doInline(ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
614 ne->newargs = arrayExpressiondoInline(ne->newargs, ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
615 ne->arguments = arrayExpressiondoInline(ne->arguments, ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
616 return ne;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
617 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
618
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
619 Expression *UnaExp::doInline(InlineDoState *ids)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
620 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
621 UnaExp *ue = (UnaExp *)copy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
622
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
623 ue->e1 = e1->doInline(ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
624 return ue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
625 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
626
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
627 Expression *AssertExp::doInline(InlineDoState *ids)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
628 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
629 AssertExp *ae = (AssertExp *)copy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
630
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
631 ae->e1 = e1->doInline(ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
632 if (msg)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
633 ae->msg = msg->doInline(ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
634 return ae;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
635 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
636
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
637 Expression *BinExp::doInline(InlineDoState *ids)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
638 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
639 BinExp *be = (BinExp *)copy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
640
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
641 be->e1 = e1->doInline(ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
642 be->e2 = e2->doInline(ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
643 return be;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
644 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
645
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
646 Expression *CallExp::doInline(InlineDoState *ids)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
647 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
648 CallExp *ce;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
649
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
650 ce = (CallExp *)copy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
651 ce->e1 = e1->doInline(ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
652 ce->arguments = arrayExpressiondoInline(arguments, ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
653 return ce;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
654 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
655
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
656
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
657 Expression *IndexExp::doInline(InlineDoState *ids)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
658 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
659 IndexExp *are = (IndexExp *)copy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
660
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
661 are->e1 = e1->doInline(ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
662
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
663 if (lengthVar)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
664 { //printf("lengthVar\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
665 VarDeclaration *vd = lengthVar;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
666 ExpInitializer *ie;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
667 ExpInitializer *ieto;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
668 VarDeclaration *vto;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
669
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
670 vto = new VarDeclaration(vd->loc, vd->type, vd->ident, vd->init);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
671 *vto = *vd;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
672 vto->parent = ids->parent;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
673 #if IN_DMD
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
674 vto->csym = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
675 vto->isym = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
676 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
677
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
678 ids->from.push(vd);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
679 ids->to.push(vto);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
680
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
681 if (vd->init)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
682 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
683 ie = vd->init->isExpInitializer();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
684 assert(ie);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
685 ieto = new ExpInitializer(ie->loc, ie->exp->doInline(ids));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
686 vto->init = ieto;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
687 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
688
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
689 are->lengthVar = (VarDeclaration *) (void *)vto;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
690 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
691 are->e2 = e2->doInline(ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
692 return are;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
693 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
694
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
695
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
696 Expression *SliceExp::doInline(InlineDoState *ids)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
697 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
698 SliceExp *are = (SliceExp *)copy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
699
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
700 are->e1 = e1->doInline(ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
701
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
702 if (lengthVar)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
703 { //printf("lengthVar\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
704 VarDeclaration *vd = lengthVar;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
705 ExpInitializer *ie;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
706 ExpInitializer *ieto;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
707 VarDeclaration *vto;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
708
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
709 vto = new VarDeclaration(vd->loc, vd->type, vd->ident, vd->init);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
710 *vto = *vd;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
711 vto->parent = ids->parent;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
712 #if IN_DMD
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
713 vto->csym = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
714 vto->isym = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
715 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
716
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
717 ids->from.push(vd);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
718 ids->to.push(vto);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
719
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
720 if (vd->init)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
721 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
722 ie = vd->init->isExpInitializer();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
723 assert(ie);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
724 ieto = new ExpInitializer(ie->loc, ie->exp->doInline(ids));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
725 vto->init = ieto;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
726 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
727
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
728 are->lengthVar = (VarDeclaration *) (void *)vto;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
729 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
730 if (lwr)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
731 are->lwr = lwr->doInline(ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
732 if (upr)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
733 are->upr = upr->doInline(ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
734 return are;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
735 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
736
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
737
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
738 Expression *TupleExp::doInline(InlineDoState *ids)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
739 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
740 TupleExp *ce;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
741
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
742 ce = (TupleExp *)copy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
743 ce->exps = arrayExpressiondoInline(exps, ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
744 return ce;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
745 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
746
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
747
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
748 Expression *ArrayLiteralExp::doInline(InlineDoState *ids)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
749 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
750 ArrayLiteralExp *ce;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
751
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
752 ce = (ArrayLiteralExp *)copy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
753 ce->elements = arrayExpressiondoInline(elements, ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
754 return ce;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
755 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
756
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
757
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
758 Expression *AssocArrayLiteralExp::doInline(InlineDoState *ids)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
759 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
760 AssocArrayLiteralExp *ce;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
761
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
762 ce = (AssocArrayLiteralExp *)copy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
763 ce->keys = arrayExpressiondoInline(keys, ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
764 ce->values = arrayExpressiondoInline(values, ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
765 return ce;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
766 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
767
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
768
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
769 Expression *StructLiteralExp::doInline(InlineDoState *ids)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
770 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
771 StructLiteralExp *ce;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
772
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
773 ce = (StructLiteralExp *)copy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
774 ce->elements = arrayExpressiondoInline(elements, ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
775 return ce;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
776 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
777
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
778
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
779 Expression *ArrayExp::doInline(InlineDoState *ids)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
780 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
781 ArrayExp *ce;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
782
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
783 ce = (ArrayExp *)copy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
784 ce->e1 = e1->doInline(ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
785 ce->arguments = arrayExpressiondoInline(arguments, ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
786 return ce;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
787 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
788
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
789
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
790 Expression *CondExp::doInline(InlineDoState *ids)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
791 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
792 CondExp *ce = (CondExp *)copy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
793
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
794 ce->econd = econd->doInline(ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
795 ce->e1 = e1->doInline(ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
796 ce->e2 = e2->doInline(ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
797 return ce;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
798 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
799
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
800
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
801 /* ========== Walk the parse trees, and inline expand functions ============= */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
802
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
803 /* Walk the trees, looking for functions to inline.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
804 * Inline any that can be.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
805 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
806
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
807 struct InlineScanState
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
808 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
809 FuncDeclaration *fd; // function being scanned
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
810 };
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
811
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
812 Statement *Statement::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
813 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
814 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
815 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
816
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
817 Statement *ExpStatement::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
818 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
819 #if LOG
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
820 printf("ExpStatement::inlineScan(%s)\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
821 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
822 if (exp)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
823 exp = exp->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
824 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
825 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
826
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
827 Statement *CompoundStatement::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
828 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
829 for (size_t i = 0; i < statements->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
830 { Statement *s = (Statement *) statements->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
831 if (s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
832 statements->data[i] = (void *)s->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
833 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
834 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
835 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
836
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
837 Statement *UnrolledLoopStatement::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
838 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
839 for (size_t i = 0; i < statements->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
840 { Statement *s = (Statement *) statements->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
841 if (s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
842 statements->data[i] = (void *)s->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
843 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
844 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
845 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
846
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
847 Statement *ScopeStatement::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
848 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
849 if (statement)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
850 statement = statement->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
851 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
852 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
853
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
854 Statement *WhileStatement::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
855 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
856 condition = condition->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
857 body = body ? body->inlineScan(iss) : NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
858 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
859 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
860
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
861
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
862 Statement *DoStatement::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
863 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
864 body = body ? body->inlineScan(iss) : NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
865 condition = condition->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
866 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
867 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
868
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
869
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
870 Statement *ForStatement::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
871 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
872 if (init)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
873 init = init->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
874 if (condition)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
875 condition = condition->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
876 if (increment)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
877 increment = increment->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
878 if (body)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
879 body = body->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
880 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
881 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
882
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
883
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
884 Statement *ForeachStatement::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
885 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
886 aggr = aggr->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
887 if (body)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
888 body = body->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
889 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
890 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
891
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
892
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
893 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
894 Statement *ForeachRangeStatement::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
895 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
896 lwr = lwr->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
897 upr = upr->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
898 if (body)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
899 body = body->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
900 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
901 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
902 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
903
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
904
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
905 Statement *IfStatement::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
906 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
907 condition = condition->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
908 if (ifbody)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
909 ifbody = ifbody->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
910 if (elsebody)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
911 elsebody = elsebody->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
912 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
913 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
914
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
915
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
916 Statement *SwitchStatement::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
917 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
918 //printf("SwitchStatement::inlineScan()\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
919 condition = condition->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
920 body = body ? body->inlineScan(iss) : NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
921 if (sdefault)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
922 sdefault = (DefaultStatement *)sdefault->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
923 if (cases)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
924 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
925 for (int i = 0; i < cases->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
926 { Statement *s;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
927
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
928 s = (Statement *) cases->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
929 cases->data[i] = (void *)s->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
930 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
931 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
932 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
933 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
934
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
935
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
936 Statement *CaseStatement::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
937 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
938 //printf("CaseStatement::inlineScan()\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
939 exp = exp->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
940 if (statement)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
941 statement = statement->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
942 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
943 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
944
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
945
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
946 Statement *DefaultStatement::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
947 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
948 if (statement)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
949 statement = statement->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
950 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
951 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
952
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
953
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
954 Statement *ReturnStatement::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
955 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
956 //printf("ReturnStatement::inlineScan()\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
957 if (exp)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
958 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
959 exp = exp->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
960 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
961 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
962 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
963
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
964
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
965 Statement *SynchronizedStatement::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
966 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
967 if (exp)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
968 exp = exp->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
969 if (body)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
970 body = body->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
971 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
972 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
973
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
974
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
975 Statement *WithStatement::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
976 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
977 if (exp)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
978 exp = exp->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
979 if (body)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
980 body = body->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
981 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
982 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
983
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
984
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
985 Statement *TryCatchStatement::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
986 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
987 if (body)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
988 body = body->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
989 if (catches)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
990 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
991 for (int i = 0; i < catches->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
992 { Catch *c = (Catch *)catches->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
993
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
994 if (c->handler)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
995 c->handler = c->handler->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
996 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
997 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
998 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
999 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1000
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1001
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1002 Statement *TryFinallyStatement::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1003 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1004 if (body)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1005 body = body->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1006 if (finalbody)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1007 finalbody = finalbody->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1008 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1009 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1010
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1011
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1012 Statement *ThrowStatement::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1013 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1014 if (exp)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1015 exp = exp->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1016 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1017 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1018
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1019
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1020 Statement *VolatileStatement::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1021 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1022 if (statement)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1023 statement = statement->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1024 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1025 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1026
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1027
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1028 Statement *LabelStatement::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1029 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1030 if (statement)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1031 statement = statement->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1032 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1033 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1034
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1035 /* -------------------------- */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1036
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1037 void arrayInlineScan(InlineScanState *iss, Array *arguments)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1038 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1039 if (arguments)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1040 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1041 for (int i = 0; i < arguments->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1042 { Expression *e = (Expression *)arguments->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1043
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1044 if (e)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1045 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1046 e = e->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1047 arguments->data[i] = (void *)e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1048 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1049 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1050 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1051 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1052
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1053 Expression *Expression::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1054 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1055 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1056 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1057
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1058 void scanVar(Dsymbol *s, InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1059 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1060 VarDeclaration *vd = s->isVarDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1061 if (vd)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1062 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1063 TupleDeclaration *td = vd->toAlias()->isTupleDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1064 if (td)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1065 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1066 for (size_t i = 0; i < td->objects->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1067 { DsymbolExp *se = (DsymbolExp *)td->objects->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1068 assert(se->op == TOKdsymbol);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1069 scanVar(se->s, iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1070 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1071 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1072 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1073 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1074 // Scan initializer (vd->init)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1075 if (vd->init)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1076 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1077 ExpInitializer *ie = vd->init->isExpInitializer();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1078
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1079 if (ie)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1080 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1081 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1082 if (vd->type)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1083 { Type *tb = vd->type->toBasetype();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1084 if (tb->ty == Tstruct)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1085 { StructDeclaration *sd = ((TypeStruct *)tb)->sym;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1086 if (sd->cpctor)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1087 { /* The problem here is that if the initializer is a
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1088 * function call that returns a struct S with a cpctor:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1089 * S s = foo();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1090 * the postblit is done by the return statement in foo()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1091 * in s2ir.c, the intermediate code generator.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1092 * But, if foo() is inlined and now the code looks like:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1093 * S s = x;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1094 * the postblit is not there, because such assignments
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1095 * are rewritten as s.cpctor(&x) by the front end.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1096 * So, the inlining won't get the postblit called.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1097 * Work around by not inlining these cases.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1098 * A proper fix would be to move all the postblit
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1099 * additions to the front end.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1100 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1101 return;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1102 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1103 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1104 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1105 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1106 ie->exp = ie->exp->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1107 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1108 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1109 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1110 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1111 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1112
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1113 Expression *DeclarationExp::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1114 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1115 //printf("DeclarationExp::inlineScan()\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1116 scanVar(declaration, iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1117 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1118 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1119
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1120 Expression *UnaExp::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1121 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1122 e1 = e1->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1123 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1124 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1125
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1126 Expression *AssertExp::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1127 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1128 e1 = e1->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1129 if (msg)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1130 msg = msg->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1131 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1132 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1133
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1134 Expression *BinExp::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1135 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1136 e1 = e1->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1137 e2 = e2->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1138 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1139 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1140
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1141
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1142 Expression *CallExp::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1143 { Expression *e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1144
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1145 //printf("CallExp::inlineScan()\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1146 e1 = e1->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1147 arrayInlineScan(iss, arguments);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1148
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1149 if (e1->op == TOKvar)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1150 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1151 VarExp *ve = (VarExp *)e1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1152 FuncDeclaration *fd = ve->var->isFuncDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1153
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1154 if (fd && fd != iss->fd && fd->canInline(0))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1155 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1156 e = fd->doInline(iss, NULL, arguments);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1157 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1158 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1159 else if (e1->op == TOKdotvar)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1160 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1161 DotVarExp *dve = (DotVarExp *)e1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1162 FuncDeclaration *fd = dve->var->isFuncDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1163
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1164 if (fd && fd != iss->fd && fd->canInline(1))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1165 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1166 if (dve->e1->op == TOKcall &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1167 dve->e1->type->toBasetype()->ty == Tstruct)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1168 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1169 /* To create ethis, we'll need to take the address
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1170 * of dve->e1, but this won't work if dve->e1 is
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1171 * a function call.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1172 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1173 ;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1174 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1175 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1176 e = fd->doInline(iss, dve->e1, arguments);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1177 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1178 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1179
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1180 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1181 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1182
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1183
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1184 Expression *SliceExp::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1185 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1186 e1 = e1->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1187 if (lwr)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1188 lwr = lwr->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1189 if (upr)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1190 upr = upr->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1191 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1192 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1193
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1194
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1195 Expression *TupleExp::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1196 { Expression *e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1197
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1198 //printf("TupleExp::inlineScan()\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1199 arrayInlineScan(iss, exps);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1200
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1201 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1202 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1203
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1204
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1205 Expression *ArrayLiteralExp::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1206 { Expression *e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1207
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1208 //printf("ArrayLiteralExp::inlineScan()\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1209 arrayInlineScan(iss, elements);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1210
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1211 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1212 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1213
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1214
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1215 Expression *AssocArrayLiteralExp::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1216 { Expression *e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1217
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1218 //printf("AssocArrayLiteralExp::inlineScan()\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1219 arrayInlineScan(iss, keys);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1220 arrayInlineScan(iss, values);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1221
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1222 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1223 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1224
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1225
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1226 Expression *StructLiteralExp::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1227 { Expression *e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1228
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1229 //printf("StructLiteralExp::inlineScan()\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1230 arrayInlineScan(iss, elements);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1231
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1232 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1233 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1234
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1235
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1236 Expression *ArrayExp::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1237 { Expression *e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1238
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1239 //printf("ArrayExp::inlineScan()\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1240 e1 = e1->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1241 arrayInlineScan(iss, arguments);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1242
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1243 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1244 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1245
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1246
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1247 Expression *CondExp::inlineScan(InlineScanState *iss)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1248 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1249 econd = econd->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1250 e1 = e1->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1251 e2 = e2->inlineScan(iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1252 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1253 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1254
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1255
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1256 /* ========== =============== */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1257
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1258 void FuncDeclaration::inlineScan()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1259 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1260 InlineScanState iss;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1261
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1262 #if LOG
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1263 printf("FuncDeclaration::inlineScan('%s')\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1264 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1265 memset(&iss, 0, sizeof(iss));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1266 iss.fd = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1267 if (fbody)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1268 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1269 inlineNest++;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1270 fbody = fbody->inlineScan(&iss);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1271 inlineNest--;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1272 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1273 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1274
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1275 int FuncDeclaration::canInline(int hasthis, int hdrscan)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1276 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1277 InlineCostState ics;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1278 int cost;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1279
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1280 #define CANINLINE_LOG 0
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1281
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1282 #if CANINLINE_LOG
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1283 printf("FuncDeclaration::canInline(hasthis = %d, '%s')\n", hasthis, toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1284 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1285
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1286 if (needThis() && !hasthis)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1287 return 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1288
1630
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1587
diff changeset
1289 if (inlineNest || (semanticRun < PASSsemantic3 && !hdrscan))
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1290 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1291 #if CANINLINE_LOG
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1292 printf("\t1: no, inlineNest = %d, semanticRun = %d\n", inlineNest, semanticRun);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1293 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1294 return 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1295 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1296
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1297 switch (inlineStatus)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1298 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1299 case ILSyes:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1300 #if CANINLINE_LOG
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1301 printf("\t1: yes %s\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1302 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1303 return 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1304
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1305 case ILSno:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1306 #if CANINLINE_LOG
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1307 printf("\t1: no %s\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1308 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1309 return 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1310
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1311 case ILSuninitialized:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1312 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1313
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1314 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1315 assert(0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1316 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1317
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1318 if (type)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1319 { assert(type->ty == Tfunction);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1320 TypeFunction *tf = (TypeFunction *)(type);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1321 #if IN_LLVM
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1322 // LDC: Only extern(C) varargs count.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1323 if (tf->linkage != LINKd)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1324 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1325 if (tf->varargs == 1) // no variadic parameter lists
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1326 goto Lno;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1327
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1328 /* Don't inline a function that returns non-void, but has
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1329 * no return expression.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1330 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1331 if (tf->next && tf->next->ty != Tvoid &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1332 !(hasReturnExp & 1) &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1333 !hdrscan)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1334 goto Lno;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1335 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1336 #if !IN_LLVM
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1337 // LDC: Only extern(C) varargs count, and ctors use extern(D).
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1338 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1339 { CtorDeclaration *ctor = isCtorDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1340
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1341 if (ctor && ctor->varargs == 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1342 goto Lno;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1343 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1344 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1345
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1346 if (
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1347 !fbody ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1348 !hdrscan &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1349 (
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1350 #if 0
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1351 isCtorDeclaration() || // cannot because need to convert:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1352 // return;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1353 // to:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1354 // return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1355 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1356 isSynchronized() ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1357 isImportedSymbol() ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1358 #if !IN_LLVM
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1359 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1360 closureVars.dim || // no nested references to this frame
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1361 #else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1362 nestedFrameRef || // no nested references to this frame
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1363 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1364 #endif // !IN_LLVM
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1365 (isVirtual() && !isFinal())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1366 ))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1367 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1368 goto Lno;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1369 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1370
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1371 #if !IN_LLVM
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1372 /* If any parameters are Tsarray's (which are passed by reference)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1373 * or out parameters (also passed by reference), don't do inlining.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1374 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1375 if (parameters)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1376 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1377 for (int i = 0; i < parameters->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1378 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1379 VarDeclaration *v = (VarDeclaration *)parameters->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1380 if (v->isOut() || v->isRef() || v->type->toBasetype()->ty == Tsarray)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1381 goto Lno;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1382 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1383 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1384 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1385
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1386 memset(&ics, 0, sizeof(ics));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1387 ics.hasthis = hasthis;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1388 ics.fd = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1389 ics.hdrscan = hdrscan;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1390 cost = fbody->inlineCost(&ics);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1391 #if CANINLINE_LOG
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1392 printf("cost = %d\n", cost);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1393 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1394 if (cost >= COST_MAX)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1395 goto Lno;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1396
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1397 #if !IN_LLVM
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1398 if (!hdrscan) // Don't scan recursively for header content scan
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1399 inlineScan();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1400 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1401
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1402 Lyes:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1403 if (!hdrscan) // Don't modify inlineStatus for header content scan
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1404 inlineStatus = ILSyes;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1405 #if CANINLINE_LOG
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1406 printf("\t2: yes %s\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1407 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1408 return 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1409
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1410 Lno:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1411 if (!hdrscan) // Don't modify inlineStatus for header content scan
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1412 inlineStatus = ILSno;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1413 #if CANINLINE_LOG
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1414 printf("\t2: no %s\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1415 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1416 return 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1417 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1418
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1419 Expression *FuncDeclaration::doInline(InlineScanState *iss, Expression *ethis, Array *arguments)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1420 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1421 InlineDoState ids;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1422 DeclarationExp *de;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1423 Expression *e = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1424
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1425 #if LOG
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1426 printf("FuncDeclaration::doInline('%s')\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1427 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1428
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1429 memset(&ids, 0, sizeof(ids));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1430 ids.parent = iss->fd;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1431
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1432 // Set up vthis
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1433 if (ethis)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1434 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1435 VarDeclaration *vthis;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1436 ExpInitializer *ei;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1437 VarExp *ve;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1438
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1439 #if STRUCTTHISREF
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1440 if (ethis->type->ty == Tpointer)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1441 { Type *t = ethis->type->nextOf();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1442 ethis = new PtrExp(ethis->loc, ethis);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1443 ethis->type = t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1444 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1445 ei = new ExpInitializer(ethis->loc, ethis);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1446
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1447 vthis = new VarDeclaration(ethis->loc, ethis->type, Id::This, ei);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1448 if (ethis->type->ty != Tclass)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1449 vthis->storage_class = STCref;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1450 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1451 vthis->storage_class = STCin;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1452 #else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1453 if (ethis->type->ty != Tclass && ethis->type->ty != Tpointer)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1454 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1455 ethis = ethis->addressOf(NULL);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1456 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1457
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1458 ei = new ExpInitializer(ethis->loc, ethis);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1459
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1460 vthis = new VarDeclaration(ethis->loc, ethis->type, Id::This, ei);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1461 vthis->storage_class = STCin;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1462 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1463 vthis->linkage = LINKd;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1464 vthis->parent = iss->fd;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1465
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1466 ve = new VarExp(vthis->loc, vthis);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1467 ve->type = vthis->type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1468
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1469 ei->exp = new AssignExp(vthis->loc, ve, ethis);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1470 ei->exp->type = ve->type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1471 #if STRUCTTHISREF
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1472 if (ethis->type->ty != Tclass)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1473 { /* This is a reference initialization, not a simple assignment.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1474 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1475 ei->exp->op = TOKconstruct;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1476 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1477 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1478
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1479 ids.vthis = vthis;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1480 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1481
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1482 // Set up parameters
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1483 if (ethis)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1484 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1485 e = new DeclarationExp(0, ids.vthis);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1486 e->type = Type::tvoid;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1487 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1488
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1489 if (arguments && arguments->dim)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1490 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1491 assert(parameters->dim == arguments->dim);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1492
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1493 for (int i = 0; i < arguments->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1494 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1495 VarDeclaration *vfrom = (VarDeclaration *)parameters->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1496 VarDeclaration *vto;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1497 Expression *arg = (Expression *)arguments->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1498 ExpInitializer *ei;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1499 VarExp *ve;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1500
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1501 ei = new ExpInitializer(arg->loc, arg);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1502
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1503 vto = new VarDeclaration(vfrom->loc, vfrom->type, vfrom->ident, ei);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1504 vto->storage_class |= vfrom->storage_class & (STCin | STCout | STClazy | STCref);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1505 vto->linkage = vfrom->linkage;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1506 vto->parent = iss->fd;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1507 //printf("vto = '%s', vto->storage_class = x%x\n", vto->toChars(), vto->storage_class);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1508 //printf("vto->parent = '%s'\n", iss->fd->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1509
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1510 ve = new VarExp(vto->loc, vto);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1511 //ve->type = vto->type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1512 ve->type = arg->type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1513
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1514 ei->exp = new AssignExp(vto->loc, ve, arg);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1515 ei->exp->type = ve->type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1516 //ve->type->print();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1517 //arg->type->print();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1518 //ei->exp->print();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1519
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1520 ids.from.push(vfrom);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1521 ids.to.push(vto);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1522
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1523 de = new DeclarationExp(0, vto);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1524 de->type = Type::tvoid;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1525
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1526 e = Expression::combine(e, de);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1527 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1528 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1529
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1530 inlineNest++;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1531 Expression *eb = fbody->doInline(&ids);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1532 inlineNest--;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1533 //eb->type->print();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1534 //eb->print();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1535 //eb->dump(0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1536 return Expression::combine(e, eb);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1537 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1538
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1539
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1540