annotate dmdscript_tango/irstate.d @ 0:55c2951c07be

initial, files origin, premoved tree
author saaadel
date Sun, 24 Jan 2010 12:34:47 +0200
parents
children 8363a4bf6a8f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2 /* Digital Mars DMDScript source code.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
3 * Copyright (c) 2000-2002 by Chromium Communications
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
4 * D version Copyright (c) 2004-2006 by Digital Mars
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
5 * All Rights Reserved
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
6 * written by Walter Bright
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
7 * www.digitalmars.com
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
8 * Use at your own risk. There is no warranty, express or implied.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
9 * License for redistribution is by the GNU General Public License in gpl.txt.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
10 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
11 * A binary, non-exclusive license for commercial use can be
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
12 * purchased from www.digitalmars.com/dscript/buy.html.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
13 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
14 * DMDScript is implemented in the D Programming Language,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
15 * www.digitalmars.com/d/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
16 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
17 * For a C++ implementation of DMDScript, including COM support,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
18 * see www.digitalmars.com/dscript/cppscript.html.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
19 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
20
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
21
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
22 module dmdscript.irstate;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
23
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
24 import std.c.stdarg;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
25 import std.c.stdlib;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
26 import std.c.string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
27 import std.outbuffer;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
28 import std.gc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
29
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
30 import dmdscript.script;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
31 import dmdscript.statement;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
32 import dmdscript.opcodes;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
33 import dmdscript.ir;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
34 import dmdscript.identifier;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
35
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
36 // The state of the interpreter machine as seen by the code generator, not
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
37 // the interpreter.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
38
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
39 struct IRstate
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
40 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
41 OutBuffer codebuf; // accumulate code here
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
42 Statement breakTarget; // current statement that 'break' applies to
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
43 Statement continueTarget; // current statement that 'continue' applies to
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
44 ScopeStatement scopeContext; // current ScopeStatement we're inside
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
45 uint[] fixups;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
46
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
47 //void next(); // close out current Block, and start a new one
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
48
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
49 uint locali = 1; // leave location 0 as our "null"
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
50 uint nlocals = 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
51
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
52 void ctor()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
53 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
54 codebuf = new OutBuffer();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
55 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
56
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
57 void validate()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
58 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
59 assert(codebuf.offset <= codebuf.data.length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
60 if (codebuf.data.length > std.gc.capacity(codebuf.data.ptr))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
61 printf("ptr %p, length %d, capacity %d\n", codebuf.data.ptr, codebuf.data.length, std.gc.capacity(codebuf.data.ptr));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
62 assert(codebuf.data.length <= std.gc.capacity(codebuf.data.ptr));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
63 for (uint u = 0; u < codebuf.offset;)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
64 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
65 IR* code = cast(IR*)(codebuf.data.ptr + u);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
66 assert(code.opcode < IRMAX);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
67 u += IR.size(code.opcode) * 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
68 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
69 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
70
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
71 /**********************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
72 * Allocate a block of local variables, and return an
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
73 * index to them.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
74 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
75
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
76 uint alloc(uint nlocals)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
77 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
78 uint n;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
79
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
80 n = locali;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
81 locali += nlocals;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
82 if (locali > this.nlocals)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
83 this.nlocals = locali;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
84 assert(n);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
85 return n * INDEX_FACTOR;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
86 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
87
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
88 /****************************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
89 * Release this block of n locals starting at local.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
90 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
91
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
92 void release(uint local, uint n)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
93 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
94 /+
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
95 local /= INDEX_FACTOR;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
96 if (local + n == locali)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
97 locali = local;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
98 +/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
99 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
100
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
101 uint mark()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
102 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
103 return locali;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
104 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
105
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
106 void release(uint i)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
107 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
108 //locali = i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
109 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
110
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
111 static uint combine(uint loc, uint opcode)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
112 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
113 return (loc << 16) | opcode;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
114 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
115
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
116 /***************************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
117 * Generate code.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
118 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
119
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
120 void gen0(Loc loc, uint opcode)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
121 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
122 codebuf.write(combine(loc, opcode));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
123 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
124
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
125 void gen1(Loc loc, uint opcode, uint arg)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
126 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
127 codebuf.reserve(2 * uint.sizeof);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
128 version (all)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
129 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
130 // Inline ourselves for speed (compiler doesn't do a good job)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
131 uint *data = cast(uint *)(codebuf.data.ptr + codebuf.offset);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
132 codebuf.offset += 2 * uint.sizeof;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
133 data[0] = combine(loc, opcode);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
134 data[1] = arg;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
135 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
136 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
137 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
138 codebuf.write4n(combine(loc, opcode));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
139 codebuf.write4n(arg);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
140 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
141 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
142
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
143 void gen2(Loc loc, uint opcode, uint arg1, uint arg2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
144 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
145 codebuf.reserve(3 * uint.sizeof);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
146 version (all)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
147 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
148 // Inline ourselves for speed (compiler doesn't do a good job)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
149 uint *data = cast(uint *)(codebuf.data.ptr + codebuf.offset);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
150 codebuf.offset += 3 * uint.sizeof;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
151 data[0] = combine(loc, opcode);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
152 data[1] = arg1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
153 data[2] = arg2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
154 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
155 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
156 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
157 codebuf.write4n(combine(loc, opcode));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
158 codebuf.write4n(arg1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
159 codebuf.write4n(arg2);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
160 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
161 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
162
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
163 void gen3(Loc loc, uint opcode, uint arg1, uint arg2, uint arg3)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
164 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
165 codebuf.reserve(4 * uint.sizeof);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
166 version (all)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
167 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
168 // Inline ourselves for speed (compiler doesn't do a good job)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
169 uint *data = cast(uint *)(codebuf.data.ptr + codebuf.offset);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
170 codebuf.offset += 4 * uint.sizeof;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
171 data[0] = combine(loc, opcode);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
172 data[1] = arg1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
173 data[2] = arg2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
174 data[3] = arg3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
175 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
176 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
177 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
178 codebuf.write4n(combine(loc, opcode));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
179 codebuf.write4n(arg1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
180 codebuf.write4n(arg2);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
181 codebuf.write4n(arg3);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
182 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
183 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
184
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
185 void gen4(Loc loc, uint opcode, uint arg1, uint arg2, uint arg3, uint arg4)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
186 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
187 codebuf.reserve(5 * uint.sizeof);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
188 version (all)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
189 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
190 // Inline ourselves for speed (compiler doesn't do a good job)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
191 uint *data = cast(uint *)(codebuf.data.ptr + codebuf.offset);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
192 codebuf.offset += 5 * uint.sizeof;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
193 data[0] = combine(loc, opcode);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
194 data[1] = arg1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
195 data[2] = arg2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
196 data[3] = arg3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
197 data[4] = arg4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
198 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
199 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
200 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
201 codebuf.write4n(combine(loc, opcode));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
202 codebuf.write4n(arg1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
203 codebuf.write4n(arg2);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
204 codebuf.write4n(arg3);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
205 codebuf.write4n(arg4);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
206 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
207 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
208
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
209 void gen(Loc loc, uint opcode, uint argc, ...)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
210 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
211 codebuf.reserve((1 + argc) * uint.sizeof);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
212 codebuf.write(combine(loc, opcode));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
213 for (uint i = 1; i <= argc; i++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
214 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
215 codebuf.write(va_arg!(uint)(_argptr));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
216 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
217 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
218
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
219 void pops(uint npops)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
220 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
221 while (npops--)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
222 gen0(0, IRpop);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
223 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
224
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
225 /******************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
226 * Get the current "instruction pointer"
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
227 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
228
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
229 uint getIP()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
230 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
231 if (!codebuf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
232 return 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
233 return codebuf.offset / 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
234 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
235
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
236 /******************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
237 * Patch a value into the existing codebuf.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
238 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
239
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
240 void patchJmp(uint index, uint value)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
241 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
242 assert((index + 1) * 4 < codebuf.offset);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
243 (cast(uint *)(codebuf.data))[index + 1] = value - index;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
244 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
245
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
246 /*******************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
247 * Add this IP to list of jump instructions to patch.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
248 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
249
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
250 void addFixup(uint index)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
251 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
252 fixups ~= index;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
253 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
254
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
255 /*******************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
256 * Go through the list of fixups and patch them.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
257 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
258
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
259 void doFixups()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
260 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
261 uint i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
262 uint index;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
263 uint value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
264 Statement s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
265
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
266 for (i = 0; i < fixups.length; i++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
267 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
268 index = fixups[i];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
269 assert((index + 1) * 4 < codebuf.offset);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
270 s = (cast(Statement *)codebuf.data)[index + 1];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
271 value = s.getTarget();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
272 patchJmp(index, value);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
273 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
274 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
275
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
276
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
277 void optimize()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
278 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
279 // Determine the length of the code array
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
280 IR *c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
281 IR *c2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
282 IR *code;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
283 uint length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
284 uint i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
285
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
286 code = cast(IR *) codebuf.data;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
287 for (c = code; c.opcode != IRend; c += IR.size(c.opcode))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
288 { }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
289 length = c - code + 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
290
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
291 // Allocate a bit vector for the array
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
292 bit[] b = new bit[length];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
293
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
294 // Set bit for each target of a jump
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
295 for (c = code; c.opcode != IRend; c += IR.size(c.opcode))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
296 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
297 switch (c.opcode)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
298 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
299 case IRjf:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
300 case IRjt:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
301 case IRjfb:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
302 case IRjtb:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
303 case IRjmp:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
304 case IRjlt:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
305 case IRjle:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
306 case IRjltc:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
307 case IRjlec:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
308 case IRtrycatch:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
309 case IRtryfinally:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
310 //writef("set %d\n", (c - code) + (c + 1).offset);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
311 b[(c - code) + (c + 1).offset] = true;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
312 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
313 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
314 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
315 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
316 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
317
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
318 // Allocate array of IR contents for locals.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
319 IR*[] local;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
320 IR*[] p1 = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
321
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
322 // Allocate on stack for smaller arrays
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
323 IR** plocals;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
324 if (nlocals < 128)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
325 plocals = cast(IR **)alloca(nlocals * local[0].sizeof);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
326
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
327 if (plocals)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
328 { local = plocals[0 .. nlocals];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
329 local[] = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
330 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
331 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
332 { p1 = new IR*[nlocals];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
333 local = p1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
334 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
335
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
336 // Optimize
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
337 for (c = code; c.opcode != IRend; c += IR.size(c.opcode))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
338 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
339 uint offset = (c - code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
340
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
341 if (b[offset]) // if target of jump
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
342 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
343 // Reset contents of locals
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
344 local[] = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
345 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
346
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
347 switch (c.opcode)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
348 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
349 case IRnop:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
350 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
351
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
352 case IRnumber:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
353 case IRstring:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
354 case IRboolean:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
355 local[(c + 1).index / INDEX_FACTOR] = c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
356 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
357
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
358 case IRadd:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
359 case IRsub:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
360 case IRcle:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
361 local[(c + 1).index / INDEX_FACTOR] = c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
362 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
363
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
364 case IRputthis:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
365 local[(c + 1).index / INDEX_FACTOR] = c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
366 goto Lreset;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
367
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
368 case IRputscope:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
369 local[(c + 1).index / INDEX_FACTOR] = c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
370 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
371
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
372 case IRgetscope:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
373 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
374 Identifier* cs = (c + 2).id;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
375 IR *cimax = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
376 for (i = nlocals; i--; )
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
377 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
378 IR *ci = local[i];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
379 if (ci &&
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
380 (ci.opcode == IRgetscope || ci.opcode == IRputscope) &&
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
381 (ci + 2).id.value.string == cs.value.string
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
382 )
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
383 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
384 if (cimax)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
385 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
386 if (cimax < ci)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
387 cimax = ci; // select most recent instruction
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
388 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
389 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
390 cimax = ci;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
391 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
392 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
393 if (1 && cimax)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
394 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
395 //writef("IRgetscope . IRmov %d, %d\n", (c + 1).index, (cimax + 1).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
396 c.opcode = IRmov;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
397 (c + 2).index = (cimax + 1).index;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
398 local[(c + 1).index / INDEX_FACTOR] = cimax;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
399 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
400 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
401 local[(c + 1).index / INDEX_FACTOR] = c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
402 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
403 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
404
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
405 case IRnew:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
406 local[(c + 1).index / INDEX_FACTOR] = c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
407 goto Lreset;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
408
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
409 case IRcallscope:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
410 case IRputcall:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
411 case IRputcalls:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
412 case IRputcallscope:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
413 case IRputcallv:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
414 case IRcallv:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
415 local[(c + 1).index / INDEX_FACTOR] = c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
416 goto Lreset;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
417
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
418 case IRmov:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
419 local[(c + 1).index / INDEX_FACTOR] = local[(c + 2).index / INDEX_FACTOR];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
420 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
421
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
422 case IRput:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
423 case IRpostincscope:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
424 case IRaddassscope:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
425 goto Lreset;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
426
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
427 case IRjf:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
428 case IRjfb:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
429 case IRjtb:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
430 case IRjmp:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
431 case IRjt:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
432 case IRret:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
433 case IRjlt:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
434 case IRjle:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
435 case IRjltc:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
436 case IRjlec:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
437 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
438
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
439 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
440 Lreset:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
441 // Reset contents of locals
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
442 local[] = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
443 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
444 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
445 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
446
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
447 delete p1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
448
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
449 //return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
450 // Remove all IRnop's
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
451 for (c = code; c.opcode != IRend; )
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
452 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
453 uint offset;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
454 uint o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
455 uint c2off;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
456
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
457 if (c.opcode == IRnop)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
458 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
459 offset = (c - code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
460 for (c2 = code; c2.opcode != IRend; c2 += IR.size(c2.opcode))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
461 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
462 switch (c2.opcode)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
463 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
464 case IRjf:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
465 case IRjt:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
466 case IRjfb:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
467 case IRjtb:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
468 case IRjmp:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
469 case IRjlt:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
470 case IRjle:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
471 case IRjltc:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
472 case IRjlec:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
473 case IRnextscope:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
474 case IRtryfinally:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
475 case IRtrycatch:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
476 c2off = c2 - code;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
477 o = c2off + (c2 + 1).offset;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
478 if (c2off <= offset && offset < o)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
479 (c2 + 1).offset--;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
480 else if (c2off > offset && o <= offset)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
481 (c2 + 1).offset++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
482 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
483 /+
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
484 case IRtrycatch:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
485 o = (c2 + 1).offset;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
486 if (offset < o)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
487 (c2 + 1).offset--;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
488 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
489 +/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
490 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
491 continue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
492 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
493 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
494
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
495 length--;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
496 memmove(c, c + 1, (length - offset) * uint.sizeof);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
497 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
498 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
499 c += IR.size(c.opcode);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
500 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
501 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
502 }