root.opcodes = {
0: new root.Opcode 'nop', { execute: -> }
1: new root.Opcode 'aconst_null', { execute: (rs) -> rs.push null }
2: new root.Opcode 'iconst_m1', { execute: (rs) -> rs.push -1 }
3: new root.Opcode 'iconst_0', { execute: (rs) -> rs.push 0 }
4: new root.Opcode 'iconst_1', { execute: (rs) -> rs.push 1 }
5: new root.Opcode 'iconst_2', { execute: (rs) -> rs.push 2 }
6: new root.Opcode 'iconst_3', { execute: (rs) -> rs.push 3 }
7: new root.Opcode 'iconst_4', { execute: (rs) -> rs.push 4 }
8: new root.Opcode 'iconst_5', { execute: (rs) -> rs.push 5 }
9: new root.Opcode 'lconst_0', { execute: (rs) -> rs.push2 gLong.ZERO, null }
10: new root.Opcode 'lconst_1', { execute: (rs) -> rs.push2 gLong.ONE, null }
11: new root.Opcode 'fconst_0', { execute: (rs) -> rs.push 0 }
12: new root.Opcode 'fconst_1', { execute: (rs) -> rs.push 1 }
13: new root.Opcode 'fconst_2', { execute: (rs) -> rs.push 2 }
14: new root.Opcode 'dconst_0', { execute: (rs) -> rs.push2 0, null }
15: new root.Opcode 'dconst_1', { execute: (rs) -> rs.push2 1, null }
16: new root.PushOpcode 'bipush', { byte_count: 1 }
17: new root.PushOpcode 'sipush', { byte_count: 2 }
18: new root.LoadConstantOpcode 'ldc', { byte_count: 1 }
19: new root.LoadConstantOpcode 'ldc_w', { byte_count: 2 }
20: new root.LoadConstantOpcode 'ldc2_w', { byte_count: 2, execute: ((rs) -> rs.push2 @constant.value, null) }
21: new root.LoadVarOpcode 'iload'
22: new root.LoadVarOpcode 'lload'
23: new root.LoadVarOpcode 'fload'
24: new root.LoadVarOpcode 'dload'
25: new root.LoadVarOpcode 'aload'
26: new root.LoadOpcode 'iload_0'
27: new root.LoadOpcode 'iload_1'
28: new root.LoadOpcode 'iload_2'
29: new root.LoadOpcode 'iload_3'
30: new root.LoadOpcode 'lload_0'
31: new root.LoadOpcode 'lload_1'
32: new root.LoadOpcode 'lload_2'
33: new root.LoadOpcode 'lload_3'
34: new root.LoadOpcode 'fload_0'
35: new root.LoadOpcode 'fload_1'
36: new root.LoadOpcode 'fload_2'
37: new root.LoadOpcode 'fload_3'
38: new root.LoadOpcode 'dload_0'
39: new root.LoadOpcode 'dload_1'
40: new root.LoadOpcode 'dload_2'
41: new root.LoadOpcode 'dload_3'
42: new root.LoadOpcode 'aload_0'
43: new root.LoadOpcode 'aload_1'
44: new root.LoadOpcode 'aload_2'
45: new root.LoadOpcode 'aload_3'
46: new root.ArrayLoadOpcode 'iaload'
47: new root.ArrayLoadOpcode 'laload'
48: new root.ArrayLoadOpcode 'faload'
49: new root.ArrayLoadOpcode 'daload'
50: new root.ArrayLoadOpcode 'aaload'
51: new root.ArrayLoadOpcode 'baload'
52: new root.ArrayLoadOpcode 'caload'
53: new root.ArrayLoadOpcode 'saload'
54: new root.StoreVarOpcode 'istore', { execute: (rs) -> rs.put_cl(@var_num,rs.pop()) }
55: new root.StoreVarOpcode 'lstore', { execute: (rs) -> rs.put_cl2(@var_num,rs.pop2()) }
56: new root.StoreVarOpcode 'fstore', { execute: (rs) -> rs.put_cl(@var_num,rs.pop()) }
57: new root.StoreVarOpcode 'dstore', { execute: (rs) -> rs.put_cl2(@var_num,rs.pop2()) }
58: new root.StoreVarOpcode 'astore', { execute: (rs) -> rs.put_cl(@var_num,rs.pop()) }
59: new root.StoreOpcode 'istore_0'
60: new root.StoreOpcode 'istore_1'
61: new root.StoreOpcode 'istore_2'
62: new root.StoreOpcode 'istore_3'
63: new root.StoreOpcode 'lstore_0'
64: new root.StoreOpcode 'lstore_1'
65: new root.StoreOpcode 'lstore_2'
66: new root.StoreOpcode 'lstore_3'
67: new root.StoreOpcode 'fstore_0'
68: new root.StoreOpcode 'fstore_1'
69: new root.StoreOpcode 'fstore_2'
70: new root.StoreOpcode 'fstore_3'
71: new root.StoreOpcode 'dstore_0'
72: new root.StoreOpcode 'dstore_1'
73: new root.StoreOpcode 'dstore_2'
74: new root.StoreOpcode 'dstore_3'
75: new root.StoreOpcode 'astore_0'
76: new root.StoreOpcode 'astore_1'
77: new root.StoreOpcode 'astore_2'
78: new root.StoreOpcode 'astore_3'
79: new root.ArrayStoreOpcode 'iastore'
80: new root.ArrayStoreOpcode 'lastore'
81: new root.ArrayStoreOpcode 'fastore'
82: new root.ArrayStoreOpcode 'dastore'
83: new root.ArrayStoreOpcode 'aastore'
84: new root.ArrayStoreOpcode 'bastore'
85: new root.ArrayStoreOpcode 'castore'
86: new root.ArrayStoreOpcode 'sastore'
87: new root.Opcode 'pop', { execute: (rs) -> rs.pop() }
88: new root.Opcode 'pop2', { execute: (rs) -> rs.pop2() }
89: new root.Opcode 'dup', { execute: (rs) -> v=rs.pop(); rs.push2(v,v) }
90: new root.Opcode 'dup_x1', { execute: (rs) -> v1=rs.pop(); v2=rs.pop(); rs.push_array([v1,v2,v1]) }
91: new root.Opcode 'dup_x2', {execute: (rs) -> [v1,v2,v3]=[rs.pop(),rs.pop(),rs.pop()];rs.push_array([v1,v3,v2,v1])}
92: new root.Opcode 'dup2', {execute: (rs) -> v1=rs.pop(); v2=rs.pop(); rs.push_array([v2,v1,v2,v1])}
93: new root.Opcode 'dup2_x1', {execute: (rs) -> [v1,v2,v3]=[rs.pop(),rs.pop(),rs.pop()];rs.push_array([v2,v1,v3,v2,v1])}
94: new root.Opcode 'dup2_x2', {execute: (rs) -> [v1,v2,v3,v4]=[rs.pop(),rs.pop(),rs.pop(),rs.pop()];rs.push_array([v2,v1,v4,v3,v2,v1])}
95: new root.Opcode 'swap', {execute: (rs) -> v2=rs.pop(); v1=rs.pop(); rs.push2(v2,v1)}
96: new root.Opcode 'iadd', { execute: (rs) -> rs.push (rs.pop()+rs.pop())|0 }
97: new root.Opcode 'ladd', { execute: (rs) -> rs.push2(rs.pop2().add(rs.pop2()), null) }
98: new root.Opcode 'fadd', { execute: (rs) -> rs.push util.wrap_float(rs.pop()+rs.pop()) }
99: new root.Opcode 'dadd', { execute: (rs) -> rs.push2(rs.pop2()+rs.pop2(), null) }
100: new root.Opcode 'isub', { execute: (rs) -> rs.push (-rs.pop()+rs.pop())|0 }
101: new root.Opcode 'lsub', { execute: (rs) -> rs.push2(rs.pop2().negate().add(rs.pop2()), null) }
102: new root.Opcode 'fsub', { execute: (rs) -> rs.push util.wrap_float(-rs.pop()+rs.pop()) }
103: new root.Opcode 'dsub', { execute: (rs) -> rs.push2(-rs.pop2()+rs.pop2(), null) }
104: new root.Opcode 'imul', { execute: (rs) -> rs.push gLong.fromInt(rs.pop()).multiply(gLong.fromInt rs.pop()).toInt() }
105: new root.Opcode 'lmul', { execute: (rs) -> rs.push2(rs.pop2().multiply(rs.pop2()), null) }
106: new root.Opcode 'fmul', { execute: (rs) -> rs.push util.wrap_float(rs.pop()*rs.pop()) }
107: new root.Opcode 'dmul', { execute: (rs) -> rs.push2(rs.pop2()*rs.pop2(), null) }
108: new root.Opcode 'idiv', { execute: (rs) -> v=rs.pop();rs.push(util.int_div rs, rs.pop(), v) }
109: new root.Opcode 'ldiv', { execute: (rs) -> v=rs.pop2();rs.push2(util.long_div(rs, rs.pop2(), v), null) }
110: new root.Opcode 'fdiv', { execute: (rs) -> a=rs.pop();rs.push util.wrap_float(rs.pop()/a) }
111: new root.Opcode 'ddiv', { execute: (rs) -> v=rs.pop2();rs.push2(rs.pop2()/v, null) }
112: new root.Opcode 'irem', { execute: (rs) -> v2=rs.pop(); rs.push util.int_mod(rs,rs.pop(),v2) }
113: new root.Opcode 'lrem', { execute: (rs) -> v2=rs.pop2(); rs.push2 util.long_mod(rs,rs.pop2(),v2), null }
114: new root.Opcode 'frem', { execute: (rs) -> b=rs.pop(); rs.push rs.pop()%b }
115: new root.Opcode 'drem', { execute: (rs) -> v2=rs.pop2(); rs.push2 rs.pop2()%v2, null }
116: new root.Opcode 'ineg', { execute: (rs) -> rs.push -rs.pop()|0 }
117: new root.Opcode 'lneg', { execute: (rs) -> rs.push2 rs.pop2().negate(), null }
118: new root.Opcode 'fneg', { execute: (rs) -> rs.push -rs.pop() }
119: new root.Opcode 'dneg', { execute: (rs) -> rs.push2 -rs.pop2(), null }
120: new root.Opcode 'ishl', { execute: (rs) -> s=rs.pop(); rs.push(rs.pop()<<s) }
121: new root.Opcode 'lshl', { execute: (rs) -> s=rs.pop(); rs.push2(rs.pop2().shiftLeft(gLong.fromInt(s)),null) }
122: new root.Opcode 'ishr', { execute: (rs) -> s=rs.pop(); rs.push(rs.pop()>>s) }
123: new root.Opcode 'lshr', { execute: (rs) -> s=rs.pop(); rs.push2(rs.pop2().shiftRight(gLong.fromInt(s)), null) }
124: new root.Opcode 'iushr', { execute: (rs) -> s=rs.pop(); rs.push(rs.pop()>>>s) }
125: new root.Opcode 'lushr', { execute: (rs) -> s=rs.pop(); rs.push2(rs.pop2().shiftRightUnsigned(gLong.fromInt(s)), null)}
126: new root.Opcode 'iand', { execute: (rs) -> rs.push(rs.pop()&rs.pop()) }
127: new root.Opcode 'land', { execute: (rs) -> rs.push2(rs.pop2().and(rs.pop2()), null) }
128: new root.Opcode 'ior', { execute: (rs) -> rs.push(rs.pop()|rs.pop()) }
129: new root.Opcode 'lor', { execute: (rs) -> rs.push2(rs.pop2().or(rs.pop2()), null) }
130: new root.Opcode 'ixor', { execute: (rs) -> rs.push(rs.pop()^rs.pop()) }
131: new root.Opcode 'lxor', { execute: (rs) -> rs.push2(rs.pop2().xor(rs.pop2()), null) }
132: new root.IIncOpcode 'iinc'
133: new root.Opcode 'i2l', { execute: (rs) -> rs.push2 gLong.fromInt(rs.pop()), null }
134: new root.Opcode 'i2f', { execute: (rs) -> }
135: new root.Opcode 'i2d', { execute: (rs) -> rs.push null }
136: new root.Opcode 'l2i', { execute: (rs) -> rs.push rs.pop2().toInt() }
137: new root.Opcode 'l2f', { execute: (rs) -> rs.push rs.pop2().toNumber() }
138: new root.Opcode 'l2d', { execute: (rs) -> rs.push2 rs.pop2().toNumber(), null }
139: new root.Opcode 'f2i', { execute: (rs) -> rs.push util.float2int rs.pop() }
140: new root.Opcode 'f2l', { execute: (rs) -> rs.push2 gLong.fromNumber(rs.pop()), null }
141: new root.Opcode 'f2d', { execute: (rs) -> rs.push null }
142: new root.Opcode 'd2i', { execute: (rs) -> rs.push util.float2int rs.pop2() }
143: new root.Opcode 'd2l', { execute: (rs) ->
d_val = rs.pop2()
if d_val is Number.POSITIVE_INFINITY
rs.push2 gLong.MAX_VALUE, null
else if d_val is Number.NEGATIVE_INFINITY
rs.push2 gLong.MIN_VALUE, null
else
rs.push2 gLong.fromNumber(d_val), null }
144: new root.Opcode 'd2f', { execute: (rs) -> rs.push util.wrap_float rs.pop2() }
145: new root.Opcode 'i2b', { execute: (rs) -> rs.push (rs.pop() << 24) >> 24 }
146: new root.Opcode 'i2c', { execute: (rs) -> rs.push rs.pop()&0xFFFF }
147: new root.Opcode 'i2s', { execute: (rs) -> rs.push (rs.pop() << 16) >> 16 }
148: new root.Opcode 'lcmp', { execute: (rs) -> v2=rs.pop2(); rs.push rs.pop2().compare(v2) }
149: new root.Opcode 'fcmpl', { execute: (rs) -> v2=rs.pop(); rs.push util.cmp(rs.pop(),v2) ? -1 }
150: new root.Opcode 'fcmpg', { execute: (rs) -> v2=rs.pop(); rs.push util.cmp(rs.pop(),v2) ? 1 }
151: new root.Opcode 'dcmpl', { execute: (rs) -> v2=rs.pop2(); rs.push util.cmp(rs.pop2(),v2) ? -1 }
152: new root.Opcode 'dcmpg', { execute: (rs) -> v2=rs.pop2(); rs.push util.cmp(rs.pop2(),v2) ? 1 }
153: new root.UnaryBranchOpcode 'ifeq', { cmp: (v) -> v == 0 }
154: new root.UnaryBranchOpcode 'ifne', { cmp: (v) -> v != 0 }
155: new root.UnaryBranchOpcode 'iflt', { cmp: (v) -> v < 0 }
156: new root.UnaryBranchOpcode 'ifge', { cmp: (v) -> v >= 0 }
157: new root.UnaryBranchOpcode 'ifgt', { cmp: (v) -> v > 0 }
158: new root.UnaryBranchOpcode 'ifle', { cmp: (v) -> v <= 0 }
159: new root.BinaryBranchOpcode 'if_icmpeq', { cmp: (v1, v2) -> v1 == v2 }
160: new root.BinaryBranchOpcode 'if_icmpne', { cmp: (v1, v2) -> v1 != v2 }
161: new root.BinaryBranchOpcode 'if_icmplt', { cmp: (v1, v2) -> v1 < v2 }
162: new root.BinaryBranchOpcode 'if_icmpge', { cmp: (v1, v2) -> v1 >= v2 }
163: new root.BinaryBranchOpcode 'if_icmpgt', { cmp: (v1, v2) -> v1 > v2 }
164: new root.BinaryBranchOpcode 'if_icmple', { cmp: (v1, v2) -> v1 <= v2 }
165: new root.BinaryBranchOpcode 'if_acmpeq', { cmp: (v1, v2) -> v1 == v2 }
166: new root.BinaryBranchOpcode 'if_acmpne', { cmp: (v1, v2) -> v1 != v2 }
167: new root.BranchOpcode 'goto', { execute: (rs) -> rs.inc_pc(@offset); false }
168: new root.BranchOpcode 'jsr', { execute: jsr }
169: new root.Opcode 'ret', { byte_count: 1, execute: (rs) -> rs.goto_pc rs.cl @args[0]; false }
170: new root.TableSwitchOpcode 'tableswitch'
171: new root.LookupSwitchOpcode 'lookupswitch'
172: new root.Opcode 'ireturn', { execute: (rs) -> cf = rs.meta_stack().pop(); rs.push cf.stack[0]; throw ReturnException }
173: new root.Opcode 'lreturn', { execute: (rs) -> cf = rs.meta_stack().pop(); rs.push2 cf.stack[0], null; throw ReturnException }
174: new root.Opcode 'freturn', { execute: (rs) -> cf = rs.meta_stack().pop(); rs.push cf.stack[0]; throw ReturnException }
175: new root.Opcode 'dreturn', { execute: (rs) -> cf = rs.meta_stack().pop(); rs.push2 cf.stack[0], null; throw ReturnException }
176: new root.Opcode 'areturn', { execute: (rs) -> cf = rs.meta_stack().pop(); rs.push cf.stack[0]; throw ReturnException }
177: new root.Opcode 'return', { execute: (rs) -> rs.meta_stack().pop(); throw ReturnException }
178: new root.FieldOpcode 'getstatic', {execute: (rs)->