annotate dmdscript_tango/opcodes.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.opcodes;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
23
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
24 import std.stdio;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
25 import std.string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
26
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
27 import dmdscript.script;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
28 import dmdscript.dobject;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
29 import dmdscript.statement;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
30 import dmdscript.functiondefinition;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
31 import dmdscript.value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
32 import dmdscript.iterator;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
33 import dmdscript.scopex;
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 import dmdscript.ir;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
36 import dmdscript.errmsgs;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
37 import dmdscript.property;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
38 import dmdscript.ddeclaredfunction;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
39 import dmdscript.dfunction;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
40
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
41 //debug=VERIFY; // verify integrity of code
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
42
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
43 version = SCOPECACHING; // turn scope caching on
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
44 //version = SCOPECACHE_LOG; // log statistics on it
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
45
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
46 // Catch & Finally are "fake" Dobjects that sit in the scope
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
47 // chain to implement our exception handling context.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
48
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
49 class Catch : Dobject
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
50 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
51 // This is so scope_get() will skip over these objects
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
52 Value* Get(d_string PropertyName) { return null; }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
53 Value* Get(d_string PropertyName, uint hash) { return null; }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
54
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
55 // This is so we can distinguish between a real Dobject
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
56 // and these fakers
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
57 d_string getTypeof() { return null; }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
58
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
59 uint offset; // offset of CatchBlock
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
60 d_string name; // catch identifier
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
61
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
62 this(uint offset, d_string name)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
63 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
64 super(null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
65 this.offset = offset;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
66 this.name = name;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
67 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
68
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
69 int isCatch() { return true; }
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 class Finally : Dobject
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
73 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
74 Value* Get(d_string PropertyName) { return null; }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
75 Value* Get(d_string PropertyName, uint hash) { return null; }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
76 d_string getTypeof() { return null; }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
77
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
78 IR *finallyblock; // code for FinallyBlock
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
79
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
80 this(IR *finallyblock)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
81 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
82 super(null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
83 this.finallyblock = finallyblock;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
84 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
85
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
86 int isFinally() { return true; }
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
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
90 /************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
91 * Look for identifier in scope.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
92 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
93
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
94 Value* scope_get(Dobject[] scopex, Identifier* id, Dobject *pthis)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
95 { uint d;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
96 Dobject o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
97 Value* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
98
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
99 //writef("scope_get: scope = %p, scope.data = %p\n", scopex, scopex.data);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
100 //writefln("scope_get: scopex = %x, length = %d, id = %s", cast(uint)scopex.ptr, scopex.length, id.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
101 d = scopex.length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
102 for (;;)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
103 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
104 if (!d)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
105 { v = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
106 *pthis = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
107 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
108 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
109 d--;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
110 o = scopex[d];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
111 //writef("o = %x, hash = x%x, s = '%s'\n", o, hash, s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
112 v = o.Get(id);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
113 if (v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
114 { *pthis = o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
115 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
116 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
117 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
118 return v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
119 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
120
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
121 Value* scope_get_lambda(Dobject[] scopex, Identifier* id, Dobject *pthis)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
122 { uint d;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
123 Dobject o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
124 Value* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
125
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
126 //writefln("scope_get_lambda: scope = %x, length = %d, id = %s", cast(uint)scopex.ptr, scopex.length, id.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
127 d = scopex.length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
128 for (;;)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
129 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
130 if (!d)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
131 { v = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
132 *pthis = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
133 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
134 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
135 d--;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
136 o = scopex[d];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
137 //printf("o = %p ", o);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
138 //writefln("o = %s", o);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
139 //printf("o = %x, hash = x%x, s = '%.*s'\n", o, hash, s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
140 //v = o.GetLambda(s, hash);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
141 v = o.Get(id);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
142 if (v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
143 { *pthis = o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
144 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
145 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
146 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
147 //writefln("v = %x", cast(uint)cast(void*)v);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
148 return v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
149 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
150
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
151 Value* scope_get(Dobject[] scopex, Identifier* id)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
152 { uint d;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
153 Dobject o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
154 Value* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
155
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
156 //writefln("scope_get: scopex = %x, length = %d, id = %s", cast(uint)scopex.ptr, scopex.length, id.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
157 d = scopex.length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
158 // 1 is most common case for d
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
159 if (d == 1)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
160 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
161 return scopex[0].Get(id);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
162 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
163 for (;;)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
164 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
165 if (!d)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
166 { v = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
167 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
168 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
169 d--;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
170 o = scopex[d];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
171 //writefln("\to = %s", o);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
172 v = o.Get(id);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
173 if (v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
174 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
175 //writefln("\tnot found");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
176 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
177 return v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
178 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
179
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
180 /************************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
181 * Find last object in scopex, null if none.
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 Dobject scope_tos(Dobject[] scopex)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
185 { uint d;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
186 Dobject o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
187
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
188 for (d = scopex.length; d;)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
189 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
190 d--;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
191 o = scopex[d];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
192 if (o.getTypeof() != null) // if not a Finally or a Catch
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
193 return o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
194 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
195 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
196 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
197
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
198 /*****************************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
199 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
200
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
201 void PutValue(CallContext *cc, d_string s, Value* a)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
202 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
203 // ECMA v3 8.7.2
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
204 // Look for the object o in the scope chain.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
205 // If we find it, put its value.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
206 // If we don't find it, put it into the global object
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
207
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
208 uint d;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
209 uint hash;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
210 Value* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
211 Dobject o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
212
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
213 d = cc.scopex.length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
214 if (d == cc.globalroot)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
215 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
216 o = scope_tos(cc.scopex);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
217 o.Put(s, a, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
218 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
219 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
220
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
221 hash = Value.calcHash(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
222
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
223 for (;; d--)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
224 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
225 assert(d > 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
226 o = cc.scopex[d - 1];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
227 if (d == cc.globalroot)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
228 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
229 o.Put(s, a, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
230 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
231 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
232 v = o.Get(s, hash);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
233 if (v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
234 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
235 // Overwrite existing property with new one
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
236 o.Put(s, a, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
237 break;
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 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
241
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
242
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
243 void PutValue(CallContext *cc, Identifier* id, Value* a)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
244 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
245 // ECMA v3 8.7.2
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
246 // Look for the object o in the scope chain.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
247 // If we find it, put its value.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
248 // If we don't find it, put it into the global object
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
249
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
250 uint d;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
251 Value* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
252 Dobject o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
253
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
254 d = cc.scopex.length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
255 if (d == cc.globalroot)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
256 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
257 o = scope_tos(cc.scopex);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
258 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
259 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
260 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
261 for (;; d--)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
262 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
263 assert(d > 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
264 o = cc.scopex[d - 1];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
265 if (d == cc.globalroot)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
266 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
267 v = o.Get(id);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
268 if (v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
269 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
270 // Overwrite existing property with new one
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
271 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
272 }
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 o.Put(id, a, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
276 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
277
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
278
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
279 /*****************************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
280 * Helper function for Values that cannot be converted to Objects.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
281 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
282
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
283 Value* cannotConvert(Value* b, int linnum)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
284 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
285 ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
286
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
287 errinfo.linnum = linnum;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
288 if (b.isUndefinedOrNull())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
289 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
290 b = Dobject.RuntimeError(&errinfo, errmsgtbl[ERR_CANNOT_CONVERT_TO_OBJECT4],
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
291 b.getType());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
292 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
293 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
294 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
295 b = Dobject.RuntimeError(&errinfo, errmsgtbl[ERR_CANNOT_CONVERT_TO_OBJECT2],
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
296 b.getType(), b.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
297 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
298 return b;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
299 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
300
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
301 const uint INDEX_FACTOR = 16; // or 1
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
302
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
303 struct IR
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
304 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
305 union
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
306 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
307 struct
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
308 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
309 version (LittleEndian)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
310 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
311 ubyte opcode;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
312 ubyte padding;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
313 ushort linnum;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
314 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
315 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
316 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
317 ushort linnum;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
318 ubyte padding;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
319 ubyte opcode;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
320 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
321 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
322 IR* code;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
323 Value* value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
324 uint index; // index into local variable table
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
325 uint hash; // cached hash value
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
326 int offset;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
327 Identifier* id;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
328 d_boolean boolean;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
329 Statement target; // used for backpatch fixups
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
330 Dobject object;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
331 void* ptr;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
332 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
333
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
334 /****************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
335 * This is the main interpreter loop.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
336 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
337
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
338 static void *call(CallContext *cc, Dobject othis,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
339 IR *code, Value* ret, Value* locals)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
340 { Value* a;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
341 Value* b;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
342 Value* c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
343 Value* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
344 Iterator *iter;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
345 Identifier *id;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
346 d_string s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
347 d_string s2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
348 d_number n;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
349 d_boolean bo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
350 d_int32 i32;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
351 d_uint32 u32;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
352 d_boolean res;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
353 tchar[] tx;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
354 tchar[] ty;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
355 Dobject o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
356 Dobject[] scopex;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
357 uint dimsave;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
358 uint offset;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
359 Catch ca;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
360 Finally f;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
361 IR* codestart = code;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
362 d_number inc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
363
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
364 /***************************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
365 * Cache for getscope's
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
366 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
367
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
368 version (SCOPECACHING)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
369 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
370 struct ScopeCache
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
371 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
372 d_string s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
373 Value* v; // never null, and never from a Dcomobject
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
374 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
375 int si;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
376 ScopeCache zero;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
377 ScopeCache[16] scopecache;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
378 version (SCOPECACHE_LOG) int scopecache_cnt = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
379
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
380 uint SCOPECACHE_SI(tchar* s) { return (cast(uint)(s)) & 15; }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
381 void SCOPECACHE_CLEAR() { scopecache[] = zero; }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
382 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
383 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
384 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
385 uint SCOPECACHE_SI(d_string s) { return 0; }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
386 void SCOPECACHE_CLEAR() { }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
387 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
388
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
389 version (all)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
390 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
391 // Eliminate the scale factor of Value.sizeof by computing it at compile time
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
392 Value* GETa(IR* code) { return cast(Value*)(cast(void*)locals + (code + 1).index * (16 / INDEX_FACTOR)); }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
393 Value* GETb(IR* code) { return cast(Value*)(cast(void*)locals + (code + 2).index * (16 / INDEX_FACTOR)); }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
394 Value* GETc(IR* code) { return cast(Value*)(cast(void*)locals + (code + 3).index * (16 / INDEX_FACTOR)); }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
395 Value* GETd(IR* code) { return cast(Value*)(cast(void*)locals + (code + 4).index * (16 / INDEX_FACTOR)); }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
396 Value* GETe(IR* code) { return cast(Value*)(cast(void*)locals + (code + 5).index * (16 / INDEX_FACTOR)); }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
397 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
398 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
399 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
400 Value* GETa(IR* code) { return &locals[(code + 1).index]; }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
401 Value* GETb(IR* code) { return &locals[(code + 2).index]; }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
402 Value* GETc(IR* code) { return &locals[(code + 3).index]; }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
403 Value* GETd(IR* code) { return &locals[(code + 4).index]; }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
404 Value* GETe(IR* code) { return &locals[(code + 5).index]; }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
405 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
406
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
407 uint GETlinnum(IR* code) { return code.linnum; }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
408
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
409 debug (VERIFY) uint checksum = IR.verify(__LINE__, code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
410
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
411 version (none)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
412 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
413 writef("+printfunc\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
414 printfunc(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
415 writef("-printfunc\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
416 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
417 scopex = cc.scopex;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
418 //printf("call: scope = %p, length = %d\n", scopex.ptr, scopex.length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
419 dimsave = scopex.length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
420 //if (logflag)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
421 // writef("IR.call(othis = %p, code = %p, locals = %p)\n",othis,code,locals);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
422
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
423 debug
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
424 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
425 uint debug_scoperoot = cc.scoperoot;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
426 uint debug_globalroot = cc.globalroot;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
427 uint debug_scopedim = scopex.length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
428 uint debug_scopeallocdim = scopex.allocdim;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
429 Dobject debug_global = cc.global;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
430 Dobject debug_variable = cc.variable;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
431
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
432 void** debug_pscoperootdata = cast(void**)mem.malloc((void*).sizeof*debug_scoperoot);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
433 void** debug_pglobalrootdata = cast(void**)mem.malloc((void*).sizeof*debug_globalroot);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
434
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
435 memcpy(debug_pscoperootdata, scopex.data, (void*).sizeof*debug_scoperoot);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
436 memcpy(debug_pglobalrootdata, scopex.data, (void*).sizeof*debug_globalroot);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
437 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
438
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
439 assert(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
440 //Value.copy(ret, &vundefined);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
441 assert(othis);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
442
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
443 Lnext:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
444 //writef("cc = %x, interrupt = %d\n", cc, cc.Interrupt);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
445 if (cc.Interrupt) // see if script was interrupted
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
446 goto Linterrupt;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
447 for (;;)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
448 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
449 version (none)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
450 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
451 writef("%2d:", code - codestart);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
452 print(code - codestart, code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
453 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
454
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
455 debug
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
456 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
457 assert(scopex == cc.scopex);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
458 assert(debug_scoperoot == cc.scoperoot);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
459 assert(debug_globalroot == cc.globalroot);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
460 assert(debug_global == cc.global);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
461 assert(debug_variable == cc.variable);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
462 assert(scopex.length >= debug_scoperoot);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
463 assert(scopex.length >= debug_globalroot);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
464 assert(scopex.length >= debug_scopedim);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
465 assert(scopex.allocdim >= debug_scopeallocdim);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
466 assert(0 == memcmp(debug_pscoperootdata, scopex.data, (void*).sizeof*debug_scoperoot));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
467 assert(0 == memcmp(debug_pglobalrootdata, scopex.data, (void*).sizeof*debug_globalroot));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
468 assert(scopex);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
469 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
470
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
471
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
472 /+
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
473 v = &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
474 tx = v.getType();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
475 assert(tx == TypeUndefined);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
476 +/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
477 //writef("\tIR%d:\n", code.opcode);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
478 switch (code.opcode)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
479 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
480 case IRerror:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
481 assert(0);
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 IRnop:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
485 code++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
486 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
487
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
488 case IRget: // a = b.c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
489 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
490 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
491 o = b.toObject();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
492 if (!o)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
493 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
494 a = cannotConvert(b, GETlinnum(code));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
495 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
496 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
497 c = GETc(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
498 if (c.vtype == V_NUMBER &&
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
499 (i32 = cast(d_int32)c.number) == c.number &&
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
500 i32 >= 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
501 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
502 //writef("IRget %d\n", i32);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
503 v = o.Get(cast(d_uint32)i32, c);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
504 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
505 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
506 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
507 s = c.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
508 v = o.Get(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
509 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
510 if (!v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
511 v = &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
512 Value.copy(a,v);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
513 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
514 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
515
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
516 case IRput: // b.c = a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
517 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
518 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
519 c = GETc(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
520 if (c.vtype == V_NUMBER &&
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
521 (i32 = cast(d_int32)c.number) == c.number &&
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
522 i32 >= 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
523 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
524 //writef("IRput %d\n", i32);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
525 if (b.vtype == V_OBJECT)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
526 a = b.object.Put(cast(d_uint32)i32, c, a, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
527 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
528 a = b.Put(cast(d_uint32)i32, c, a);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
529 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
530 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
531 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
532 s = c.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
533 a = b.Put(s, a);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
534 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
535 if (a) goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
536 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
537 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
538
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
539 case IRgets: // a = b.s
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
540 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
541 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
542 s = (code + 3).id.value.string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
543 o = b.toObject();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
544 if (!o)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
545 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
546 //writef("%s %s.%s cannot convert to Object", b.getType(), b.toString(), s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
547 ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
548 a = Dobject.RuntimeError(&errinfo,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
549 errmsgtbl[ERR_CANNOT_CONVERT_TO_OBJECT3],
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
550 b.getType(), b.toString(),
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
551 s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
552 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
553 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
554 v = o.Get(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
555 if (!v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
556 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
557 //writef("IRgets: %s.%s is undefined\n", b.getType(), d_string_ptr(s));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
558 v = &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
559 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
560 Value.copy(a,v);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
561 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
562 goto Lnext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
563
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
564 case IRgetscope: // a = s
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
565 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
566 id = (code + 2).id;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
567 s = id.value.string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
568 version (SCOPECACHING)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
569 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
570 si = SCOPECACHE_SI(s.ptr);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
571 if (s is scopecache[si].s)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
572 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
573 version (SCOPECACHE_LOG) scopecache_cnt++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
574 Value.copy(a, scopecache[si].v);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
575 code += 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
576 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
577 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
578 //writefln("miss %s, was %s, s.ptr = %x, cache.ptr = %x", s, scopecache[si].s, cast(uint)s.ptr, cast(uint)scopecache[si].s.ptr);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
579 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
580 version (all)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
581 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
582 // Inline scope_get() for speed
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
583 { uint d;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
584
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
585 d = scopex.length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
586 // 1 is most common case for d
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
587 if (d == 1)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
588 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
589 o = scopex[0];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
590 v = o.Get(id);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
591 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
592 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
593 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
594 o = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
595 for (;;)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
596 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
597 if (!d)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
598 { v = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
599 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
600 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
601 d--;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
602 o = scopex[d];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
603 v = o.Get(id);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
604 //writef("o = %x, v = %x\n", o, v);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
605 if (v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
606 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
607 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
608 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
609 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
610 if (!v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
611 v = &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
612 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
613 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
614 version (SCOPECACHING)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
615 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
616 if (1) //!o.isDcomobject())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
617 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
618 scopecache[si].s = s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
619 scopecache[si].v = v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
620 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
621 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
622 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
623 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
624 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
625 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
626 v = scope_get(scopex, id);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
627 if (!v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
628 v = &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
629 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
630 //writef("v = %p\n", v);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
631 //writef("v = %g\n", v.toNumber());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
632 //writef("v = %s\n", d_string_ptr(v.toString()));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
633 Value.copy(a, v);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
634 code += 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
635 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
636
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
637 case IRaddass: // a = (b.c += a)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
638 c = GETc(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
639 s = c.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
640 goto Laddass;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
641
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
642 case IRaddasss: // a = (b.s += a)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
643 s = (code + 3).id.value.string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
644 Laddass:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
645 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
646 v = b.Get(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
647 goto Laddass2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
648
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
649 case IRaddassscope: // a = (s += a)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
650 b = null; // Needed for the b.Put() below to shutup a compiler use-without-init warning
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
651 id = (code + 2).id;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
652 s = id.value.string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
653 version (SCOPECACHING)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
654 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
655 si = SCOPECACHE_SI(s.ptr);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
656 if (s is scopecache[si].s)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
657 v = scopecache[si].v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
658 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
659 v = scope_get(scopex, id);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
660 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
661 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
662 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
663 v = scope_get(scopex, id);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
664 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
665 Laddass2:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
666 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
667 if (!v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
668 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
669 v = &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
670 a.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
671 /+
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
672 if (b)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
673 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
674 a = b.Put(s, v);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
675 //if (a) goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
676 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
677 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
678 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
679 PutValue(cc, s, v);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
680 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
681 +/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
682 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
683 else if (a.vtype == V_NUMBER && v.vtype == V_NUMBER)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
684 { a.number += v.number;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
685 v.number = a.number;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
686 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
687 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
688 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
689 v.toPrimitive(v, null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
690 a.toPrimitive(a, null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
691 if (v.isString())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
692 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
693 s2 = v.toString() ~ a.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
694 a.putVstring(s2);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
695 Value.copy(v, a);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
696 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
697 else if (a.isString())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
698 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
699 s2 = v.toString() ~ a.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
700 a.putVstring(s2);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
701 Value.copy(v, a);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
702 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
703 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
704 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
705 a.putVnumber(a.toNumber() + v.toNumber());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
706 v.number = a.number;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
707 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
708 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
709 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
710 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
711
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
712 case IRputs: // b.s = a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
713 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
714 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
715 o = b.toObject();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
716 if (!o)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
717 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
718 a = cannotConvert(b, GETlinnum(code));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
719 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
720 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
721 a = o.Put((code + 3).id.value.string, a, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
722 if (a) goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
723 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
724 goto Lnext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
725
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
726 case IRputscope: // s = a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
727 PutValue(cc, (code + 2).id, GETa(code));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
728 code += 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
729 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
730
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
731 case IRputdefault: // b = a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
732 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
733 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
734 o = b.toObject();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
735 if (!o)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
736 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
737 ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
738 a = Dobject.RuntimeError(&errinfo,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
739 errmsgtbl[ERR_CANNOT_ASSIGN], a.getType(),
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
740 b.getType());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
741 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
742 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
743 a = o.PutDefault(a);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
744 if (a)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
745 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
746 code += 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
747 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
748
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
749 case IRputthis: // s = a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
750 a = cc.variable.Put((code + 2).id.value.string, GETa(code), 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
751 //if (a) goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
752 code += 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
753 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
754
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
755 case IRmov: // a = b
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
756 Value.copy(GETa(code), GETb(code));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
757 code += 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
758 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
759
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
760 case IRstring: // a = "string"
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
761 GETa(code).putVstring((code + 2).id.value.string);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
762 code += 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
763 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
764
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
765 case IRobject: // a = object
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
766 { FunctionDefinition fd;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
767 fd = cast(FunctionDefinition)(code + 2).ptr;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
768 Dfunction fobject = new DdeclaredFunction(fd);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
769 fobject.scopex = scopex;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
770 GETa(code).putVobject(fobject);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
771 code += 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
772 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
773 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
774
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
775 case IRthis: // a = this
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
776 GETa(code).putVobject(othis);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
777 //writef("IRthis: %s, othis = %x\n", GETa(code).getType(), othis);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
778 code += 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
779 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
780
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
781 case IRnumber: // a = number
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
782 GETa(code).putVnumber(*cast(d_number *)(code + 2));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
783 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
784 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
785
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
786 case IRboolean: // a = boolean
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
787 GETa(code).putVboolean((code + 2).boolean);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
788 code += 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
789 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
790
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
791 case IRnull: // a = null
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
792 GETa(code).putVnull();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
793 code += 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
794 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
795
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
796 case IRundefined: // a = undefined
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
797 GETa(code).putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
798 code += 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
799 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
800
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
801 case IRthisget: // a = othis.ident
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
802 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
803 v = othis.Get((code + 2).id.value.string);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
804 if (!v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
805 v = &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
806 Value.copy(a, v);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
807 code += 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
808 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
809
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
810 case IRneg: // a = -a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
811 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
812 n = a.toNumber();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
813 a.putVnumber(-n);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
814 code += 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
815 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
816
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
817 case IRpos: // a = a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
818 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
819 n = a.toNumber();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
820 a.putVnumber(n);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
821 code += 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
822 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
823
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
824 case IRcom: // a = ~a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
825 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
826 i32 = a.toInt32();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
827 a.putVnumber(~i32);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
828 code += 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
829 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
830
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
831 case IRnot: // a = !a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
832 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
833 a.putVboolean(!a.toBoolean());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
834 code += 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
835 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
836
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
837 case IRtypeof: // a = typeof a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
838 // ECMA 11.4.3 says that if the result of (a)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
839 // is a Reference and GetBase(a) is null,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
840 // then the result is "undefined". I don't know
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
841 // what kind of script syntax will generate this.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
842 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
843 a.putVstring(a.getTypeof());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
844 code += 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
845 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
846
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
847 case IRinstance: // a = b instanceof c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
848 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
849 Dobject co;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
850
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
851 // ECMA v3 11.8.6
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
852
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
853 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
854 o = b.toObject();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
855 c = GETc(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
856 if (c.isPrimitive())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
857 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
858 ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
859 a = Dobject.RuntimeError(&errinfo,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
860 errmsgtbl[ERR_RHS_MUST_BE_OBJECT],
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
861 "instanceof", c.getType());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
862 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
863 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
864 co = c.toObject();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
865 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
866 v = cast(Value*)co.HasInstance(a, b);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
867 if (v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
868 { a = v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
869 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
870 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
871 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
872 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
873 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
874 case IRadd: // a = b + c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
875 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
876 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
877 c = GETc(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
878
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
879 if (b.vtype == V_NUMBER && c.vtype == V_NUMBER)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
880 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
881 a.putVnumber(b.number + c.number);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
882 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
883 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
884 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
885 char vtmpb[Value.sizeof];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
886 Value* vb = cast(Value*)vtmpb;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
887 char vtmpc[Value.sizeof];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
888 Value* vc = cast(Value*)vtmpc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
889
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
890 v = cast(Value*)b.toPrimitive(vb, null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
891 if (v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
892 { a = v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
893 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
894 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
895 v = cast(Value*)c.toPrimitive(vc, null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
896 if (v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
897 { a = v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
898 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
899 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
900 if (vb.isString() || vc.isString())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
901 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
902 s = vb.toString() ~ vc.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
903 a.putVstring(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
904 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
905 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
906 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
907 a.putVnumber(vb.toNumber() + vc.toNumber());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
908 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
909 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
910
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
911 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
912 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
913
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
914 case IRsub: // a = b - c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
915 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
916 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
917 c = GETc(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
918 a.putVnumber(b.toNumber() - c.toNumber());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
919 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
920 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
921
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
922 case IRmul: // a = b * c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
923 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
924 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
925 c = GETc(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
926 a.putVnumber(b.toNumber() * c.toNumber());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
927 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
928 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
929
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
930 case IRdiv: // a = b / c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
931 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
932 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
933 c = GETc(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
934
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
935 //writef("%g / %g = %g\n", b.toNumber() , c.toNumber(), b.toNumber() / c.toNumber());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
936 a.putVnumber(b.toNumber() / c.toNumber());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
937 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
938 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
939
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
940 case IRmod: // a = b % c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
941 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
942 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
943 c = GETc(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
944 a.putVnumber(b.toNumber() % c.toNumber());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
945 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
946 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
947
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
948 case IRshl: // a = b << c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
949 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
950 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
951 c = GETc(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
952 i32 = b.toInt32();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
953 u32 = c.toUint32() & 0x1F;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
954 i32 <<= u32;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
955 a.putVnumber(i32);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
956 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
957 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
958
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
959 case IRshr: // a = b >> c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
960 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
961 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
962 c = GETc(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
963 i32 = b.toInt32();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
964 u32 = c.toUint32() & 0x1F;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
965 i32 >>= cast(d_int32) u32;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
966 a.putVnumber(i32);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
967 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
968 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
969
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
970 case IRushr: // a = b >>> c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
971 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
972 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
973 c = GETc(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
974 i32 = b.toUint32();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
975 u32 = c.toUint32() & 0x1F;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
976 u32 = (cast(d_uint32) i32) >> u32;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
977 a.putVnumber(u32);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
978 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
979 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
980
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
981 case IRand: // a = b & c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
982 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
983 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
984 c = GETc(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
985 a.putVnumber(b.toInt32() & c.toInt32());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
986 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
987 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
988
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
989 case IRor: // a = b | c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
990 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
991 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
992 c = GETc(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
993 a.putVnumber(b.toInt32() | c.toInt32());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
994 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
995 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
996
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
997 case IRxor: // a = b ^ c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
998 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
999 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1000 c = GETc(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1001 a.putVnumber(b.toInt32() ^ c.toInt32());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1002 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1003 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1004
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1005 /********************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1006
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1007 case IRpreinc: // a = ++b.c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1008 c = GETc(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1009 s = c.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1010 goto Lpreinc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1011 case IRpreincs: // a = ++b.s
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1012 s = (code + 3).id.value.string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1013 Lpreinc:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1014 inc = 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1015 Lpre:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1016 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1017 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1018 v = b.Get(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1019 if (!v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1020 v = &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1021 n = v.toNumber();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1022 a.putVnumber(n + inc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1023 b.Put(s, a);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1024 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1025 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1026
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1027 case IRpreincscope: // a = ++s
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1028 inc = 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1029 Lprescope:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1030 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1031 id = (code + 2).id;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1032 s = id.value.string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1033 version (SCOPECACHING)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1034 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1035 si = SCOPECACHE_SI(s.ptr);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1036 if (s is scopecache[si].s)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1037 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1038 v = scopecache[si].v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1039 n = v.toNumber() + inc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1040 v.putVnumber(n);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1041 a.putVnumber(n);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1042 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1043 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1044 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1045 v = scope_get(scopex, id, &o);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1046 if (v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1047 { n = v.toNumber() + inc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1048 v.putVnumber(n);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1049 a.putVnumber(n);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1050 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1051 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1052 a.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1053 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1054 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1055 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1056 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1057 v = scope_get(scopex, id, &o);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1058 if (v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1059 { n = v.toNumber();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1060 v.putVnumber(n + inc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1061 Value.copy(a, v);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1062 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1063 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1064 a.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1065 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1066 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1067 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1068
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1069 case IRpredec: // a = --b.c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1070 c = GETc(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1071 s = c.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1072 goto Lpredec;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1073 case IRpredecs: // a = --b.s
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1074 s = (code + 3).id.value.string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1075 Lpredec:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1076 inc = -1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1077 goto Lpre;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1078
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1079 case IRpredecscope: // a = --s
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1080 inc = -1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1081 goto Lprescope;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1082
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1083 /********************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1084
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1085 case IRpostinc: // a = b.c++
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1086 c = GETc(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1087 s = c.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1088 goto Lpostinc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1089 case IRpostincs: // a = b.s++
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1090 s = (code + 3).id.value.string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1091 Lpostinc:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1092 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1093 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1094 v = b.Get(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1095 if (!v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1096 v = &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1097 n = v.toNumber();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1098 a.putVnumber(n + 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1099 b.Put(s, a);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1100 a.putVnumber(n);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1101 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1102 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1103
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1104 case IRpostincscope: // a = s++
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1105 id = (code + 2).id;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1106 v = scope_get(scopex, id, &o);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1107 if (v && v != &vundefined)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1108 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1109 n = v.toNumber();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1110 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1111 v.putVnumber(n + 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1112 a.putVnumber(n);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1113 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1114 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1115 GETa(code).putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1116 code += 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1117 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1118
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1119 case IRpostdec: // a = b.c--
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1120 c = GETc(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1121 s = c.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1122 goto Lpostdec;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1123 case IRpostdecs: // a = b.s--
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1124 s = (code + 3).id.value.string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1125 Lpostdec:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1126 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1127 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1128 v = b.Get(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1129 if (!v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1130 v = &vundefined;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1131 n = v.toNumber();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1132 a.putVnumber(n - 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1133 b.Put(s, a);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1134 a.putVnumber(n);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1135 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1136 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1137
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1138 case IRpostdecscope: // a = s--
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1139 id = (code + 2).id;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1140 v = scope_get(scopex, id, &o);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1141 if (v && v != &vundefined)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1142 { n = v.toNumber();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1143 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1144 v.putVnumber(n - 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1145 a.putVnumber(n);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1146 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1147 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1148 GETa(code).putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1149 code += 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1150 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1151
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1152 case IRdel: // a = delete b.c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1153 case IRdels: // a = delete b.s
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1154 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1155 if (b.isPrimitive())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1156 bo = true;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1157 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1158 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1159 o = b.toObject();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1160 if (!o)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1161 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1162 a = cannotConvert(b, GETlinnum(code));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1163 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1164 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1165 s = (code.opcode == IRdel)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1166 ? GETc(code).toString()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1167 : (code + 3).id.value.string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1168 if (o.implementsDelete())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1169 bo = o.Delete(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1170 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1171 bo = !o.HasProperty(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1172 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1173 GETa(code).putVboolean(bo);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1174 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1175 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1176
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1177 case IRdelscope: // a = delete s
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1178 id = (code + 2).id;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1179 s = id.value.string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1180 //o = scope_tos(scopex); // broken way
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1181 if (!scope_get(scopex, id, &o))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1182 bo = true;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1183 else if (o.implementsDelete())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1184 bo = o.Delete(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1185 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1186 bo = !o.HasProperty(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1187 GETa(code).putVboolean(bo);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1188 code += 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1189 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1190
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1191 /* ECMA requires that if one of the numeric operands is NAN,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1192 * then the result of the comparison is false. D generates a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1193 * correct test for NAN operands.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1194 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1195
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1196 case IRclt: // a = (b < c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1197 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1198 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1199 c = GETc(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1200 if (b.vtype == V_NUMBER && c.vtype == V_NUMBER)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1201 res = (b.number < c.number);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1202 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1203 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1204 b.toPrimitive(b, TypeNumber);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1205 c.toPrimitive(c, TypeNumber);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1206 if (b.isString() && c.isString())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1207 { d_string x = b.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1208 d_string y = c.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1209
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1210 res = std.string.cmp(x, y) < 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1211 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1212 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1213 res = b.toNumber() < c.toNumber();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1214 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1215 a.putVboolean(res);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1216 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1217 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1218
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1219 case IRcle: // a = (b <= c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1220 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1221 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1222 c = GETc(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1223 if (b.vtype == V_NUMBER && c.vtype == V_NUMBER)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1224 res = (b.number <= c.number);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1225 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1226 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1227 b.toPrimitive(b, TypeNumber);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1228 c.toPrimitive(c, TypeNumber);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1229 if (b.isString() && c.isString())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1230 { d_string x = b.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1231 d_string y = c.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1232
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1233 res = std.string.cmp(x, y) <= 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1234 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1235 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1236 res = b.toNumber() <= c.toNumber();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1237 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1238 a.putVboolean(res);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1239 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1240 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1241
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1242 case IRcgt: // a = (b > c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1243 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1244 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1245 c = GETc(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1246 if (b.vtype == V_NUMBER && c.vtype == V_NUMBER)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1247 res = (b.number > c.number);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1248 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1249 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1250 b.toPrimitive(b, TypeNumber);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1251 c.toPrimitive(c, TypeNumber);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1252 if (b.isString() && c.isString())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1253 { d_string x = b.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1254 d_string y = c.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1255
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1256 res = std.string.cmp(x, y) > 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1257 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1258 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1259 res = b.toNumber() > c.toNumber();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1260 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1261 a.putVboolean(res);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1262 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1263 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1264
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1265
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1266 case IRcge: // a = (b >= c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1267 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1268 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1269 c = GETc(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1270 if (b.vtype == V_NUMBER && c.vtype == V_NUMBER)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1271 res = (b.number >= c.number);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1272 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1273 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1274 b.toPrimitive(b, TypeNumber);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1275 c.toPrimitive(c, TypeNumber);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1276 if (b.isString() && c.isString())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1277 { d_string x = b.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1278 d_string y = c.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1279
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1280 res = std.string.cmp(x, y) >= 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1281 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1282 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1283 res = b.toNumber() >= c.toNumber();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1284 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1285 a.putVboolean(res);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1286 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1287 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1288
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1289 case IRceq: // a = (b == c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1290 case IRcne: // a = (b != c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1291 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1292 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1293 c = GETc(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1294 Lagain:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1295 tx = b.getType();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1296 ty = c.getType();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1297 if (logflag) writef("tx('%s', '%s')\n", tx, ty);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1298 if (tx == ty)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1299 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1300 if (tx == TypeUndefined ||
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1301 tx == TypeNull)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1302 res = true;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1303 else if (tx == TypeNumber)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1304 { d_number x = b.number;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1305 d_number y = c.number;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1306
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1307 res = (x == y);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1308 //writef("x = %g, y = %g, res = %d\n", x, y, res);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1309 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1310 else if (tx == TypeString)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1311 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1312 if (logflag)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1313 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1314 writef("b = %x, c = %x\n", b, c);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1315 writef("cmp('%s', '%s')\n", b.string, c.string);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1316 writef("cmp(%d, %d)\n", b.string.length, c.string.length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1317 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1318 res = (b.string == c.string);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1319 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1320 else if (tx == TypeBoolean)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1321 res = (b.dbool == c.dbool);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1322 else // TypeObject
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1323 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1324 res = b.object == c.object;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1325 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1326 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1327 else if (tx == TypeNull && ty == TypeUndefined)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1328 res = true;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1329 else if (tx == TypeUndefined && ty == TypeNull)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1330 res = true;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1331 else if (tx == TypeNumber && ty == TypeString)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1332 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1333 c.putVnumber(c.toNumber());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1334 goto Lagain;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1335 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1336 else if (tx == TypeString && ty == TypeNumber)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1337 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1338 b.putVnumber(b.toNumber());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1339 goto Lagain;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1340 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1341 else if (tx == TypeBoolean)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1342 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1343 b.putVnumber(b.toNumber());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1344 goto Lagain;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1345 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1346 else if (ty == TypeBoolean)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1347 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1348 c.putVnumber(c.toNumber());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1349 goto Lagain;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1350 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1351 else if (ty == TypeObject)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1352 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1353 v = cast(Value*)c.toPrimitive(c, null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1354 if (v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1355 { a = v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1356 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1357 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1358 goto Lagain;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1359 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1360 else if (tx == TypeObject)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1361 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1362 v = cast(Value*)b.toPrimitive(b, null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1363 if (v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1364 { a = v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1365 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1366 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1367 goto Lagain;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1368 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1369 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1370 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1371 res = false;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1372 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1373
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1374 res ^= (code.opcode == IRcne);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1375 //Lceq:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1376 a.putVboolean(res);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1377 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1378 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1379
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1380 case IRcid: // a = (b === c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1381 case IRcnid: // a = (b !== c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1382 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1383 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1384 c = GETc(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1385 tx = b.getType();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1386 ty = c.getType();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1387 if (tx == ty)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1388 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1389 if (tx == TypeUndefined ||
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1390 tx == TypeNull)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1391 res = true;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1392 else if (tx == TypeNumber)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1393 { d_number x = b.number;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1394 d_number y = c.number;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1395
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1396 // Ensure that a NAN operand produces false
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1397 if (code.opcode == IRcid)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1398 res = (x == y);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1399 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1400 res = (x <> y);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1401 goto Lcid;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1402 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1403 else if (tx == TypeString)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1404 res = (b.string == c.string);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1405 else if (tx == TypeBoolean)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1406 res = (b.dbool == c.dbool);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1407 else // TypeObject
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1408 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1409 res = b.object == c.object;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1410 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1411 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1412 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1413 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1414 res = false;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1415 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1416
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1417 res ^= (code.opcode == IRcnid);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1418 Lcid:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1419 a.putVboolean(res);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1420 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1421 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1422
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1423 case IRjt: // if (b) goto t
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1424 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1425 if (b.toBoolean())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1426 code += (code + 1).offset;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1427 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1428 code += 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1429 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1430
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1431 case IRjf: // if (!b) goto t
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1432 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1433 if (!b.toBoolean())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1434 code += (code + 1).offset;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1435 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1436 code += 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1437 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1438
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1439 case IRjtb: // if (b) goto t
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1440 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1441 if (b.dbool)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1442 code += (code + 1).offset;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1443 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1444 code += 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1445 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1446
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1447 case IRjfb: // if (!b) goto t
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1448 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1449 if (!b.dbool)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1450 code += (code + 1).offset;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1451 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1452 code += 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1453 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1454
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1455 case IRjmp:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1456 code += (code + 1).offset;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1457 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1458
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1459 case IRjlt: // if (b < c) goto c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1460 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1461 c = GETc(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1462 if (b.vtype == V_NUMBER && c.vtype == V_NUMBER)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1463 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1464 if (b.number < c.number)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1465 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1466 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1467 code += (code + 1).offset;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1468 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1469 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1470 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1471 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1472 b.toPrimitive(b, TypeNumber);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1473 c.toPrimitive(c, TypeNumber);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1474 if (b.isString() && c.isString())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1475 { d_string x = b.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1476 d_string y = c.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1477
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1478 res = std.string.cmp(x, y) < 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1479 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1480 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1481 res = b.toNumber() < c.toNumber();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1482 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1483 if (!res)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1484 code += (code + 1).offset;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1485 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1486 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1487 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1488
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1489 case IRjle: // if (b <= c) goto c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1490 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1491 c = GETc(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1492 if (b.vtype == V_NUMBER && c.vtype == V_NUMBER)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1493 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1494 if (b.number <= c.number)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1495 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1496 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1497 code += (code + 1).offset;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1498 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1499 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1500 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1501 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1502 b.toPrimitive(b, TypeNumber);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1503 c.toPrimitive(c, TypeNumber);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1504 if (b.isString() && c.isString())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1505 { d_string x = b.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1506 d_string y = c.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1507
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1508 res = std.string.cmp(x, y) <= 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1509 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1510 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1511 res = b.toNumber() <= c.toNumber();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1512 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1513 if (!res)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1514 code += (code + 1).offset;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1515 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1516 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1517 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1518
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1519 case IRjltc: // if (b < constant) goto c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1520 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1521 res = (b.toNumber() < *cast(d_number *)(code + 3));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1522 if (!res)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1523 code += (code + 1).offset;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1524 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1525 code += 5;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1526 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1527
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1528 case IRjlec: // if (b <= constant) goto c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1529 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1530 res = (b.toNumber() <= *cast(d_number *)(code + 3));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1531 if (!res)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1532 code += (code + 1).offset;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1533 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1534 code += 5;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1535 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1536
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1537 case IRiter: // a = iter(b)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1538 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1539 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1540 o = b.toObject();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1541 if (!o)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1542 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1543 a = cannotConvert(b, GETlinnum(code));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1544 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1545 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1546 a = o.putIterator(a);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1547 if (a)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1548 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1549 code += 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1550 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1551
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1552 case IRnext: // a, b.c, iter
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1553 // if (!(b.c = iter)) goto a; iter = iter.next
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1554 s = GETc(code).toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1555 goto case_next;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1556
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1557 case IRnexts: // a, b.s, iter
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1558 s = (code + 3).id.value.string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1559 case_next:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1560 iter = GETd(code).iter;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1561 v = iter.next();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1562 if (!v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1563 code += (code + 1).offset;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1564 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1565 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1566 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1567 b.Put(s, v);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1568 code += 5;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1569 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1570 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1571
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1572 case IRnextscope: // a, s, iter
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1573 s = (code + 2).id.value.string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1574 iter = GETc(code).iter;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1575 v = iter.next();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1576 if (!v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1577 code += (code + 1).offset;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1578 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1579 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1580 o = scope_tos(scopex);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1581 o.Put(s, v, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1582 code += 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1583 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1584 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1585
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1586 case IRcall: // a = b.c(argc, argv)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1587 s = GETc(code).toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1588 goto case_call;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1589
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1590 case IRcalls: // a = b.s(argc, argv)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1591 s = (code + 3).id.value.string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1592 goto case_call;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1593
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1594 case_call:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1595 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1596 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1597 o = b.toObject();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1598 if (!o)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1599 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1600 goto Lcallerror;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1601 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1602 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1603 //writef("v.call\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1604 v = o.Get(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1605 if (!v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1606 goto Lcallerror;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1607 //writef("calling... '%s'\n", v.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1608 cc.callerothis = othis;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1609 a.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1610 a = cast(Value*)v.Call(cc, o, a, GETe(code)[0 .. (code + 4).index]);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1611 //writef("regular call, a = %x\n", a);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1612 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1613 debug (VERIFY)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1614 assert(checksum == IR.verify(__LINE__, codestart));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1615 if (a)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1616 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1617 code += 6;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1618 goto Lnext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1619
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1620 Lcallerror:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1621 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1622 //writef("%s %s.%s is undefined and has no Call method\n", b.getType(), b.toString(), s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1623 ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1624 a = Dobject.RuntimeError(&errinfo,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1625 errmsgtbl[ERR_UNDEFINED_NO_CALL3],
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1626 b.getType(), b.toString(),
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1627 s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1628 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1629 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1630
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1631 case IRcallscope: // a = s(argc, argv)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1632 id = (code + 2).id;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1633 s = id.value.string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1634 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1635 v = scope_get_lambda(scopex, id, &o);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1636 //writefln("v.toString() = '%s'", v.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1637 if (!v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1638 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1639 ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1640 a = Dobject.RuntimeError(&errinfo, errmsgtbl[ERR_UNDEFINED_NO_CALL2], "property", s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1641 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1642 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1643 // Should we pass othis or o? I think othis.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1644 cc.callerothis = othis; // pass othis to eval()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1645 a.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1646 a = cast(Value*)v.Call(cc, o, a, GETd(code)[0 .. (code + 3).index] );
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1647 //writef("callscope result = %x\n", a);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1648 debug (VERIFY)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1649 assert(checksum == IR.verify(__LINE__, codestart));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1650 if (a)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1651 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1652 code += 5;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1653 goto Lnext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1654
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1655 case IRcallv: // v(argc, argv) = a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1656 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1657 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1658 o = b.toObject();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1659 if (!o)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1660 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1661 //writef("%s %s is undefined and has no Call method\n", b.getType(), b.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1662 ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1663 a = Dobject.RuntimeError(&errinfo,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1664 errmsgtbl[ERR_UNDEFINED_NO_CALL2],
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1665 b.getType(), b.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1666 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1667 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1668 cc.callerothis = othis; // pass othis to eval()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1669 a.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1670 a = cast(Value*)o.Call(cc, o, a, GETd(code)[0 .. (code + 3).index]);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1671 if (a)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1672 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1673 code += 5;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1674 goto Lnext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1675
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1676 case IRputcall: // b.c(argc, argv) = a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1677 s = GETc(code).toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1678 goto case_putcall;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1679
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1680 case IRputcalls: // b.s(argc, argv) = a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1681 s = (code + 3).id.value.string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1682 goto case_putcall;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1683
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1684 case_putcall:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1685 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1686 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1687 o = b.toObject();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1688 if (!o)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1689 goto Lcallerror;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1690 //v = o.GetLambda(s, Value.calcHash(s));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1691 v = o.Get(s, Value.calcHash(s));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1692 if (!v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1693 goto Lcallerror;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1694 //writef("calling... '%s'\n", v.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1695 o = v.toObject();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1696 if (!o)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1697 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1698 ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1699 a = Dobject.RuntimeError(&errinfo,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1700 errmsgtbl[ERR_CANNOT_ASSIGN_TO2],
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1701 b.getType(), s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1702 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1703 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1704 a = cast(Value*)o.put_Value(a, GETe(code)[0 .. (code + 4).index] );
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1705 if (a)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1706 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1707 code += 6;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1708 goto Lnext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1709
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1710 case IRputcallscope: // a = s(argc, argv)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1711 id = (code + 2).id;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1712 s = id.value.string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1713 v = scope_get_lambda(scopex, id, &o);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1714 if (!v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1715 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1716 ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1717 a = Dobject.RuntimeError(&errinfo,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1718 errmsgtbl[ERR_UNDEFINED_NO_CALL2],
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1719 "property", s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1720 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1721 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1722 o = v.toObject();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1723 if (!o)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1724 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1725 ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1726 a = Dobject.RuntimeError(&errinfo,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1727 errmsgtbl[ERR_CANNOT_ASSIGN_TO],
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1728 s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1729 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1730 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1731 a = cast(Value*)o.put_Value(GETa(code), GETd(code)[0 .. (code + 3).index] );
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1732 if (a)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1733 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1734 code += 5;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1735 goto Lnext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1736
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1737 case IRputcallv: // v(argc, argv) = a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1738 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1739 o = b.toObject();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1740 if (!o)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1741 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1742 //writef("%s %s is undefined and has no Call method\n", b.getType(), b.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1743 ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1744 a = Dobject.RuntimeError(&errinfo,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1745 errmsgtbl[ERR_UNDEFINED_NO_CALL2],
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1746 b.getType(), b.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1747 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1748 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1749 a = cast(Value*)o.put_Value(GETa(code), GETd(code)[0 .. (code + 3).index] );
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1750 if (a)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1751 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1752 code += 5;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1753 goto Lnext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1754
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1755 case IRnew: // a = new b(argc, argv)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1756 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1757 b = GETb(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1758 a.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1759 a = cast(Value*)b.Construct(cc, a, GETd(code)[0 .. (code + 3).index] );
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1760 debug (VERIFY)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1761 assert(checksum == IR.verify(__LINE__, codestart));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1762 if (a)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1763 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1764 code += 5;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1765 goto Lnext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1766
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1767 case IRpush:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1768 SCOPECACHE_CLEAR();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1769 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1770 o = a.toObject();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1771 if (!o)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1772 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1773 a = cannotConvert(a, GETlinnum(code));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1774 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1775 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1776 scopex ~= o; // push entry onto scope chain
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1777 cc.scopex = scopex;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1778 code += 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1779 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1780
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1781 case IRpop:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1782 SCOPECACHE_CLEAR();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1783 o = scopex[length - 1];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1784 scopex = scopex[0 .. length - 1]; // pop entry off scope chain
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1785 // If it's a Finally, we need to execute
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1786 // the finally block
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1787 code += 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1788 if (o.isFinally()) // test could be eliminated with virtual func
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1789 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1790 f = cast(Finally)o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1791 cc.finallyret = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1792 a = cast(Value*)call(cc, othis, f.finallyblock, ret, locals);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1793 debug (VERIFY)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1794 assert(checksum == IR.verify(__LINE__, codestart));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1795 if (a)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1796 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1797 if (cc.finallyret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1798 cc.finallyret = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1799 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1800 { // The rest of any unwinding is already done
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1801 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1802 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1803 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1804 goto Lnext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1805
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1806 case IRfinallyret:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1807 cc.finallyret = 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1808 case IRret:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1809 version (SCOPECACHE_LOG)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1810 printf("scopecache_cnt = %d\n", scopecache_cnt);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1811 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1812
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1813 case IRretexp:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1814 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1815 Value.copy(ret, a);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1816 //writef("returns: %s\n", ret.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1817 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1818
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1819 case IRimpret:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1820 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1821 Value.copy(ret, a);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1822 //writef("implicit return: %s\n", ret.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1823 code += 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1824 goto Lnext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1825
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1826 case IRthrow:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1827 a = GETa(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1828 cc.linnum = GETlinnum(code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1829 Lthrow:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1830 //writef("Lthrow: linnum = %d\n", GETlinnum(code));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1831 a.getErrInfo(null, GETlinnum(code));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1832 SCOPECACHE_CLEAR();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1833 for (;;)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1834 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1835 if (scopex.length <= dimsave)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1836 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1837 ret.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1838 // 'a' may be pointing into the stack, which means
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1839 // it gets scrambled on return. Therefore, we copy
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1840 // its contents into a safe area in CallContext.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1841 assert(cc.value.sizeof == Value.sizeof);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1842 Value.copy(cast(Value*)cc.value, a);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1843 return cast(Value*)cc.value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1844 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1845 o = scopex[length - 1];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1846 scopex = scopex[0 .. length - 1]; // pop entry off scope chain
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1847 if (o.isCatch())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1848 { ca = cast(Catch)o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1849 //writef("catch('%s')\n", ca.name);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1850 o = new Dobject(Dobject.getPrototype());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1851 version (JSCRIPT_CATCH_BUG)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1852 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1853 PutValue(cc, ca.name, a);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1854 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1855 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1856 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1857 o.Put(ca.name, a, DontDelete);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1858 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1859 scopex ~= o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1860 cc.scopex = scopex;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1861 code = codestart + ca.offset;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1862 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1863 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1864 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1865 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1866 if (o.isFinally())
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1867 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1868 f = cast(Finally)o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1869 v = cast(Value*)call(cc, othis, f.finallyblock, ret, locals);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1870 if (v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1871 { a = v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1872 //writef("changing a\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1873 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1874 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1875 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1876 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1877 goto Lnext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1878
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1879 case IRtrycatch:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1880 SCOPECACHE_CLEAR();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1881 offset = (code - codestart) + (code + 1).offset;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1882 s = (code + 2).id.value.string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1883 ca = new Catch(offset, s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1884 scopex ~= ca;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1885 cc.scopex = scopex;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1886 code += 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1887 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1888
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1889 case IRtryfinally:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1890 SCOPECACHE_CLEAR();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1891 f = new Finally(code + (code + 1).offset);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1892 scopex ~= f;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1893 cc.scopex = scopex;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1894 code += 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1895 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1896
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1897 case IRassert:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1898 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1899 ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1900 errinfo.linnum = (code + 1).index;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1901 version (all) // Not supported under some com servers
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1902 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1903 a = Dobject.RuntimeError(&errinfo, errmsgtbl[ERR_ASSERT], (code + 1).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1904 goto Lthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1905 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1906 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1907 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1908 RuntimeErrorx(ERR_ASSERT, (code + 1).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1909 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1910 code += 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1911 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1912 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1913
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1914 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1915 //writef("1: Unrecognized IR instruction %d\n", code.opcode);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1916 assert(0); // unrecognized IR instruction
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1917 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1918 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1919
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1920 Linterrupt:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1921 ret.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1922 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1923 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1924
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1925 /*******************************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1926 * This is a 'disassembler' for our interpreted code.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1927 * Useful for debugging.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1928 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1929
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1930 static void print(uint address, IR *code)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1931 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1932 switch (code.opcode)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1933 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1934 case IRerror:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1935 writef("\tIRerror\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1936 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1937
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1938 case IRnop:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1939 writef("\tIRnop\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1940 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1941
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1942 case IRend:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1943 writef("\tIRend\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1944 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1945
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1946 case IRget: // a = b.c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1947 writef("\tIRget %d, %d, %d\n",(code + 1).index, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1948 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1949
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1950 case IRput: // b.c = a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1951 writef("\tIRput %d, %d, %d\n",(code + 1).index, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1952 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1953
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1954 case IRgets: // a = b.s
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1955 writef("\tIRgets %d, %d, '%s'\n",(code + 1).index, (code + 2).index, (code + 3).id.value.string);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1956 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1957
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1958 case IRgetscope: // a = othis.ident
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1959 writef("\tIRgetscope %d, '%s', hash=%d\n",(code + 1).index,(code + 2).id.value.string,(code + 2).id.value.hash);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1960 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1961
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1962 case IRaddass: // b.c += a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1963 writef("\tIRaddass %d, %d, %d\n",(code + 1).index, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1964 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1965
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1966 case IRaddasss: // b.s += a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1967 writef("\tIRaddasss %d, %d, '%s'\n",(code + 1).index, (code + 2).index, (code + 3).id.value.string);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1968 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1969
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1970 case IRaddassscope: // othis.ident += a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1971 writef("\tIRaddassscope %d, '%s', hash=%d\n",(code + 1).index,(code + 2).id.value.string,(code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1972 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1973
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1974 case IRputs: // b.s = a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1975 writef("\tIRputs %d, %d, '%s'\n",(code + 1).index, (code + 2).index, (code + 3).id.value.string);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1976 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1977
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1978 case IRputscope: // s = a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1979 writef("\tIRputscope %d, '%s'\n",(code + 1).index, (code + 2).id.value.string);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1980 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1981
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1982 case IRputdefault: // b = a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1983 writef("\tIRputdefault %d, %d\n",(code + 1).index, (code + 2).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1984 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1985
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1986 case IRputthis: // b = s
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1987 writef("\tIRputthis '%s', %d\n",(code + 2).id.value.string,(code + 1).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1988 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1989
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1990 case IRmov: // a = b
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1991 writef("\tIRmov %d, %d\n", (code + 1).index, (code + 2).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1992 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1993
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1994 case IRstring: // a = "string"
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1995 writef("\tIRstring %d, '%s'\n",(code + 1).index,(code + 2).id.value.string);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1996 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1997
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1998 case IRobject: // a = object
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1999 writef("\tIRobject %d, %x\n",(code + 1).index,cast(void*)(code + 2).object);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2000 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2001
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2002 case IRthis: // a = this
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2003 writef("\tIRthis %d\n",(code + 1).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2004 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2005
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2006 case IRnumber: // a = number
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2007 writef("\tIRnumber %d, %g\n",(code + 1).index,*cast(d_number *)(code + 2));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2008 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2009
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2010 case IRboolean: // a = boolean
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2011 writef("\tIRboolean %d, %d\n",(code + 1).index, (code + 2).boolean);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2012 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2013
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2014 case IRnull: // a = null
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2015 writef("\tIRnull %d\n",(code + 1).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2016 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2017
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2018 case IRundefined: // a = undefined
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2019 writef("\tIRundefined %d\n",(code + 1).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2020 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2021
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2022 case IRthisget: // a = othis.ident
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2023 writef("\tIRthisget %d, '%s'\n",(code + 1).index,(code + 2).id.value.string);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2024 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2025
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2026 case IRneg: // a = -a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2027 writef("\tIRneg %d\n",(code + 1).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2028 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2029
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2030 case IRpos: // a = a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2031 writef("\tIRpos %d\n",(code + 1).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2032 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2033
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2034 case IRcom: // a = ~a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2035 writef("\tIRcom %d\n",(code + 1).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2036 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2037
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2038 case IRnot: // a = !a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2039 writef("\tIRnot %d\n",(code + 1).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2040 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2041
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2042 case IRtypeof: // a = typeof a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2043 writef("\tIRtypeof %d\n", (code + 1).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2044 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2045
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2046 case IRinstance: // a = b instanceof c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2047 writef("\tIRinstance %d, %d, %d\n", (code + 1).index, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2048 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2049
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2050 case IRadd: // a = b + c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2051 writef("\tIRadd %d, %d, %d\n",(code + 1).index, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2052 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2053
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2054 case IRsub: // a = b - c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2055 writef("\tIRsub %d, %d, %d\n",(code + 1).index, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2056 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2057
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2058 case IRmul: // a = b * c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2059 writef("\tIRmul %d, %d, %d\n",(code + 1).index, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2060 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2061
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2062 case IRdiv: // a = b / c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2063 writef("\tIRdiv %d, %d, %d\n",(code + 1).index, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2064 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2065
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2066 case IRmod: // a = b % c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2067 writef("\tIRmod %d, %d, %d\n",(code + 1).index, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2068 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2069
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2070 case IRshl: // a = b << c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2071 writef("\tIRshl %d, %d, %d\n",(code + 1).index, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2072 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2073
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2074 case IRshr: // a = b >> c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2075 writef("\tIRshr %d, %d, %d\n",(code + 1).index, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2076 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2077
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2078 case IRushr: // a = b >>> c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2079 writef("\tIRushr %d, %d, %d\n",(code + 1).index, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2080 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2081
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2082 case IRand: // a = b & c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2083 writef("\tIRand %d, %d, %d\n",(code + 1).index, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2084 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2085
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2086 case IRor: // a = b | c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2087 writef("\tIRor %d, %d, %d\n",(code + 1).index, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2088 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2089
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2090 case IRxor: // a = b ^ c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2091 writef("\tIRxor %d, %d, %d\n",(code + 1).index, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2092 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2093
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2094 case IRpreinc: // a = ++b.c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2095 writef("\tIRpreinc %d, %d, %d\n",(code + 1).index, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2096 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2097
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2098 case IRpreincs: // a = ++b.s
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2099 writef("\tIRpreincs %d, %d, %s\n",(code + 1).index, (code + 2).index, (code + 3).id.value.string);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2100 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2101
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2102 case IRpreincscope: // a = ++s
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2103 writef("\tIRpreincscope %d, '%s', hash=%d\n",(code + 1).index, (code + 2).id.value.string, (code + 3).hash);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2104 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2105
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2106 case IRpredec: // a = --b.c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2107 writef("\tIRpredec %d, %d, %d\n",(code + 1).index, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2108 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2109
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2110 case IRpredecs: // a = --b.s
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2111 writef("\tIRpredecs %d, %d, %s\n",(code + 1).index, (code + 2).index, (code + 3).id.value.string);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2112 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2113
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2114 case IRpredecscope: // a = --s
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2115 writef("\tIRpredecscope %d, '%s', hash=%d\n",(code + 1).index, (code + 2).id.value.string, (code + 3).hash);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2116 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2117
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2118 case IRpostinc: // a = b.c++
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2119 writef("\tIRpostinc %d, %d, %d\n",(code + 1).index, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2120 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2121
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2122 case IRpostincs: // a = b.s++
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2123 writef("\tIRpostincs %d, %d, %s\n",(code + 1).index, (code + 2).index, (code + 3).id.value.string);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2124 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2125
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2126 case IRpostincscope: // a = s++
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2127 writef("\tIRpostincscope %d, %s\n",(code + 1).index, (code + 2).id.value.string);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2128 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2129
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2130 case IRpostdec: // a = b.c--
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2131 writef("\tIRpostdec %d, %d, %d\n",(code + 1).index, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2132 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2133
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2134 case IRpostdecs: // a = b.s--
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2135 writef("\tIRpostdecs %d, %d, %s\n",(code + 1).index, (code + 2).index, (code + 3).id.value.string);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2136 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2137
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2138 case IRpostdecscope: // a = s--
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2139 writef("\tIRpostdecscope %d, %s\n",(code + 1).index, (code + 2).id.value.string);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2140 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2141
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2142 case IRdel: // a = delete b.c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2143 writef("\tIRdel %d, %d, %d\n",(code + 1).index, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2144 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2145
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2146 case IRdels: // a = delete b.s
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2147 writef("\tIRdels %d, %d, '%s'\n",(code + 1).index, (code + 2).index, (code + 3).id.value.string);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2148 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2149
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2150 case IRdelscope: // a = delete s
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2151 writef("\tIRdelscope %d, '%s'\n",(code + 1).index, (code + 2).id.value.string);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2152 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2153
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2154 case IRclt: // a = (b < c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2155 writef("\tIRclt %d, %d, %d\n",(code + 1).index, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2156 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2157
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2158 case IRcle: // a = (b <= c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2159 writef("\tIRcle %d, %d, %d\n",(code + 1).index, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2160 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2161
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2162 case IRcgt: // a = (b > c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2163 writef("\tIRcgt %d, %d, %d\n",(code + 1).index, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2164 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2165
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2166 case IRcge: // a = (b >= c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2167 writef("\tIRcge %d, %d, %d\n",(code + 1).index, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2168 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2169
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2170 case IRceq: // a = (b == c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2171 writef("\tIRceq %d, %d, %d\n",(code + 1).index, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2172 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2173
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2174 case IRcne: // a = (b != c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2175 writef("\tIRcne %d, %d, %d\n",(code + 1).index, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2176 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2177
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2178 case IRcid: // a = (b === c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2179 writef("\tIRcid %d, %d, %d\n",(code + 1).index, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2180 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2181
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2182 case IRcnid: // a = (b !== c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2183 writef("\tIRcnid %d, %d, %d\n",(code + 1).index, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2184 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2185
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2186 case IRjt: // if (b) goto t
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2187 writef("\tIRjt %d, %d\n", (code + 1).index + address, (code + 2).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2188 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2189
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2190 case IRjf: // if (!b) goto t
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2191 writef("\tIRjf %d, %d\n", (code + 1).index + address, (code + 2).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2192 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2193
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2194 case IRjtb: // if (b) goto t
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2195 writef("\tIRjtb %d, %d\n", (code + 1).index + address, (code + 2).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2196 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2197
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2198 case IRjfb: // if (!b) goto t
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2199 writef("\tIRjfb %d, %d\n", (code + 1).index + address, (code + 2).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2200 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2201
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2202 case IRjmp:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2203 writef("\tIRjmp %d\n", (code + 1).offset + address);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2204 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2205
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2206 case IRjlt: // if (b < c) goto t
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2207 writef("\tIRjlt %d, %d, %d\n",(code + 1).index + address, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2208 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2209
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2210 case IRjle: // if (b <= c) goto t
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2211 writef("\tIRjle %d, %d, %d\n",(code + 1).index + address, (code + 2).index, (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2212 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2213
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2214 case IRjltc: // if (b < constant) goto t
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2215 writef("\tIRjltc %d, %d, %g\n",(code + 1).index + address, (code + 2).index, *cast(d_number *)(code + 3));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2216 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2217
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2218 case IRjlec: // if (b <= constant) goto t
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2219 writef("\tIRjlec %d, %d, %g\n",(code + 1).index + address, (code + 2).index, *cast(d_number *)(code + 3));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2220 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2221
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2222 case IRiter: // a = iter(b)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2223 writef("\tIRiter %d, %d\n",(code + 1).index, (code + 2).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2224 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2225
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2226 case IRnext: // a, b.c, iter
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2227 writef("\tIRnext %d, %d, %d, %d\n",
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2228 (code + 1).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2229 (code + 2).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2230 (code + 3).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2231 (code + 4).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2232 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2233
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2234 case IRnexts: // a, b.s, iter
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2235 writef("\tIRnexts %d, %d, '%s', %d\n",
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2236 (code + 1).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2237 (code + 2).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2238 (code + 3).id.value.string,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2239 (code + 4).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2240 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2241
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2242 case IRnextscope: // a, s, iter
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2243 writef
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2244 ("\tIRnextscope %d, '%s', %d\n",
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2245 (code + 1).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2246 (code + 2).id.value.string,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2247 (code + 3).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2248 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2249
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2250 case IRcall: // a = b.c(argc, argv)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2251 writef("\tIRcall %d,%d,%d, argc=%d, argv=%d \n",
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2252 (code + 1).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2253 (code + 2).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2254 (code + 3).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2255 (code + 4).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2256 (code + 5).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2257 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2258
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2259 case IRcalls: // a = b.s(argc, argv)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2260 writef
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2261 ("\tIRcalls %d,%d,'%s', argc=%d, argv=%d \n",
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2262 (code + 1).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2263 (code + 2).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2264 (code + 3).id.value.string,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2265 (code + 4).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2266 (code + 5).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2267 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2268
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2269 case IRcallscope: // a = s(argc, argv)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2270 writef
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2271 ("\tIRcallscope %d,'%s', argc=%d, argv=%d \n",
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2272 (code + 1).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2273 (code + 2).id.value.string,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2274 (code + 3).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2275 (code + 4).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2276 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2277
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2278 case IRputcall: // a = b.c(argc, argv)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2279 writef("\tIRputcall %d,%d,%d, argc=%d, argv=%d \n",
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2280 (code + 1).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2281 (code + 2).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2282 (code + 3).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2283 (code + 4).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2284 (code + 5).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2285 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2286
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2287 case IRputcalls: // a = b.s(argc, argv)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2288 writef
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2289 ("\tIRputcalls %d,%d,'%s', argc=%d, argv=%d \n",
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2290 (code + 1).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2291 (code + 2).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2292 (code + 3).id.value.string,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2293 (code + 4).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2294 (code + 5).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2295 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2296
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2297 case IRputcallscope: // a = s(argc, argv)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2298 writef
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2299 ("\tIRputcallscope %d,'%s', argc=%d, argv=%d \n",
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2300 (code + 1).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2301 (code + 2).id.value.string,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2302 (code + 3).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2303 (code + 4).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2304 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2305
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2306 case IRcallv: // a = v(argc, argv)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2307 writef("\tIRcallv %d, %d(argc=%d, argv=%d)\n",
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2308 (code + 1).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2309 (code + 2).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2310 (code + 3).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2311 (code + 4).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2312 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2313
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2314 case IRputcallv: // a = v(argc, argv)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2315 writef("\tIRputcallv %d, %d(argc=%d, argv=%d)\n",
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2316 (code + 1).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2317 (code + 2).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2318 (code + 3).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2319 (code + 4).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2320 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2321
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2322 case IRnew: // a = new b(argc, argv)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2323 writef("\tIRnew %d,%d, argc=%d, argv=%d \n",
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2324 (code + 1).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2325 (code + 2).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2326 (code + 3).index,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2327 (code + 4).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2328 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2329
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2330 case IRpush:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2331 writef("\tIRpush %d\n",(code + 1).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2332 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2333
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2334 case IRpop:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2335 writef("\tIRpop\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2336 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2337
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2338 case IRret:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2339 writef("\tIRret\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2340 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2341
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2342 case IRretexp:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2343 writef("\tIRretexp %d\n",(code + 1).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2344 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2345
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2346 case IRimpret:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2347 writef("\tIRimpret %d\n",(code + 1).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2348 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2349
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2350 case IRthrow:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2351 writef("\tIRthrow %d\n",(code + 1).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2352 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2353
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2354 case IRassert:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2355 writef("\tIRassert %d\n",(code + 1).index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2356 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2357
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2358 case IRtrycatch:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2359 writef("\tIRtrycatch %d, '%s'\n", (code + 1).offset + address, (code + 2).id.value.string);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2360 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2361
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2362 case IRtryfinally:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2363 writef("\tIRtryfinally %d\n", (code + 1).offset + address);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2364 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2365
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2366 case IRfinallyret:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2367 writef("\tIRfinallyret\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2368 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2369
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2370 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2371 writef("2: Unrecognized IR instruction %d\n", code.opcode);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2372 assert(0); // unrecognized IR instruction
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2373 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2374 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2375
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2376 /*********************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2377 * Give size of opcode.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2378 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2379
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2380 static uint size(uint opcode)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2381 { uint sz = 9999;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2382
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2383 switch (opcode)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2384 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2385 case IRerror:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2386 case IRnop:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2387 case IRend:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2388 sz = 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2389 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2390
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2391 case IRget: // a = b.c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2392 case IRaddass:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2393 sz = 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2394 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2395
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2396 case IRput: // b.c = a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2397 sz = 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2398 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2399
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2400 case IRgets: // a = b.s
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2401 case IRaddasss:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2402 sz = 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2403 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2404
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2405 case IRgetscope: // a = s
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2406 sz = 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2407 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2408
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2409 case IRaddassscope:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2410 sz = 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2411 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2412
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2413 case IRputs: // b.s = a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2414 sz = 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2415 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2416
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2417 case IRputscope: // s = a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2418 case IRputdefault: // b = a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2419 sz = 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2420 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2421
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2422 case IRputthis: // a = s
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2423 sz = 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2424 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2425
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2426 case IRmov: // a = b
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2427 sz = 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2428 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2429
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2430 case IRstring: // a = "string"
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2431 sz = 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2432 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2433
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2434 case IRobject: // a = object
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2435 sz = 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2436 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2437
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2438 case IRthis: // a = this
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2439 sz = 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2440 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2441
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2442 case IRnumber: // a = number
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2443 sz = 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2444 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2445
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2446 case IRboolean: // a = boolean
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2447 sz = 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2448 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2449
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2450 case IRnull: // a = null
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2451 sz = 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2452 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2453
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2454 case IRundefined: // a = undefined
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2455 sz = 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2456 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2457
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2458 case IRthisget: // a = othis.ident
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2459 sz = 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2460 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2461
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2462 case IRneg: // a = -a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2463 case IRpos: // a = a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2464 case IRcom: // a = ~a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2465 case IRnot: // a = !a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2466 case IRtypeof: // a = typeof a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2467 sz = 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2468 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2469
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2470 case IRinstance: // a = b instanceof c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2471 case IRadd: // a = b + c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2472 case IRsub: // a = b - c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2473 case IRmul: // a = b * c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2474 case IRdiv: // a = b / c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2475 case IRmod: // a = b % c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2476 case IRshl: // a = b << c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2477 case IRshr: // a = b >> c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2478 case IRushr: // a = b >>> c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2479 case IRand: // a = b & c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2480 case IRor: // a = b | c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2481 case IRxor: // a = b ^ c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2482 sz = 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2483 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2484
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2485 case IRpreinc: // a = ++b.c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2486 case IRpreincs: // a = ++b.s
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2487 case IRpredec: // a = --b.c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2488 case IRpredecs: // a = --b.s
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2489 case IRpostinc: // a = b.c++
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2490 case IRpostincs: // a = b.s++
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2491 case IRpostdec: // a = b.c--
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2492 case IRpostdecs: // a = b.s--
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2493 sz = 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2494 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2495
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2496 case IRpostincscope: // a = s++
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2497 case IRpostdecscope: // a = s--
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2498 sz = 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2499 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2500
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2501 case IRpreincscope: // a = ++s
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2502 case IRpredecscope: // a = --s
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2503 sz = 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2504 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2505
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2506 case IRdel: // a = delete b.c
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2507 case IRdels: // a = delete b.s
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2508 sz = 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2509 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2510
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2511 case IRdelscope: // a = delete s
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2512 sz = 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2513 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2514
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2515 case IRclt: // a = (b < c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2516 case IRcle: // a = (b <= c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2517 case IRcgt: // a = (b > c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2518 case IRcge: // a = (b >= c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2519 case IRceq: // a = (b == c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2520 case IRcne: // a = (b != c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2521 case IRcid: // a = (b === c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2522 case IRcnid: // a = (b !== c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2523 case IRjlt: // if (b < c) goto t
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2524 case IRjle: // if (b <= c) goto t
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2525 sz = 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2526 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2527
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2528 case IRjltc: // if (b < constant) goto t
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2529 case IRjlec: // if (b <= constant) goto t
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2530 sz = 5;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2531 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2532
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2533 case IRjt: // if (b) goto t
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2534 case IRjf: // if (!b) goto t
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2535 case IRjtb: // if (b) goto t
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2536 case IRjfb: // if (!b) goto t
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2537 sz = 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2538 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2539
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2540 case IRjmp:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2541 sz = 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2542 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2543
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2544 case IRiter: // a = iter(b)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2545 sz = 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2546 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2547
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2548 case IRnext: // a, b.c, iter
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2549 case IRnexts: // a, b.s, iter
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2550 sz = 5;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2551 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2552
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2553 case IRnextscope: // a, s, iter
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2554 sz = 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2555 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2556
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2557 case IRcall: // a = b.c(argc, argv)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2558 case IRcalls: // a = b.s(argc, argv)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2559 case IRputcall: // b.c(argc, argv) = a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2560 case IRputcalls: // b.s(argc, argv) = a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2561 sz = 6;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2562 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2563
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2564 case IRcallscope: // a = s(argc, argv)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2565 case IRputcallscope: // s(argc, argv) = a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2566 case IRcallv:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2567 case IRputcallv:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2568 sz = 5;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2569 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2570
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2571 case IRnew: // a = new b(argc, argv)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2572 sz = 5;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2573 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2574
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2575 case IRpush:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2576 sz = 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2577 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2578
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2579 case IRpop:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2580 sz = 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2581 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2582
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2583 case IRfinallyret:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2584 case IRret:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2585 sz = 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2586 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2587
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2588 case IRretexp:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2589 case IRimpret:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2590 case IRthrow:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2591 sz = 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2592 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2593
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2594 case IRtrycatch:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2595 sz = 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2596 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2597
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2598 case IRtryfinally:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2599 sz = 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2600 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2601
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2602 case IRassert:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2603 sz = 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2604 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2605
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2606 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2607 writef("3: Unrecognized IR instruction %d, IRMAX = %d\n", opcode, IRMAX);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2608 assert(0); // unrecognized IR instruction
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2609 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2610 assert(sz <= 6);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2611 return sz;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2612 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2613
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2614 static void printfunc(IR *code)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2615 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2616 IR *codestart = code;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2617
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2618 for (;;)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2619 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2620 writef("%2d(%d):", code - codestart, code.linnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2621 print(code - codestart, code);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2622 if (code.opcode == IRend)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2623 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2624 code += size(code.opcode);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2625 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2626 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2627
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2628 /***************************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2629 * Verify that it is a correct sequence of code.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2630 * Useful for isolating memory corruption bugs.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2631 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2632
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2633 static uint verify(uint linnum, IR *codestart)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2634 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2635 debug (VERIFY)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2636 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2637 uint checksum = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2638 uint sz;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2639 uint i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2640 IR *code;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2641
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2642 // Verify code
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2643 for (code = codestart;;)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2644 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2645 switch (code.opcode)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2646 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2647 case IRend:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2648 return checksum;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2649
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2650 case IRerror:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2651 writef("verify failure line %u\n", linnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2652 assert(0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2653 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2654
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2655 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2656 if (code.opcode >= IRMAX)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2657 { writef("undefined opcode %d in code %p\n", code.opcode, codestart);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2658 assert(0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2659 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2660 sz = IR.size(code.opcode);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2661 for (i = 0; i < sz; i++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2662 { checksum += code.opcode;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2663 code++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2664 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2665 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2666 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2667 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2668 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2669 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2670 return 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2671 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2672 }