bitescript 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,674 @@
1
+ require 'test/unit'
2
+ require 'bitescript/bytecode'
3
+
4
+ class TestBytecode < Test::Unit::TestCase
5
+ include BiteScript::Bytecode
6
+ include BiteScript::ASM
7
+
8
+ import java.lang.System
9
+ import java.lang.Integer
10
+ import java.lang.Void
11
+
12
+ class DummyMethod
13
+ def initialize
14
+ @all = []
15
+ end
16
+ def method_missing(sym, *args)
17
+ current = [sym, *args]
18
+ @all << current
19
+ current
20
+ end
21
+
22
+ def all
23
+ @all
24
+ end
25
+
26
+ def single
27
+ old, @all = @all, []
28
+ yield
29
+ result, @all = @all, old
30
+ result[0]
31
+ end
32
+ end
33
+
34
+ def setup
35
+ @dummy = DummyMethod.new
36
+ end
37
+
38
+ def method_visitor
39
+ @dummy
40
+ end
41
+
42
+ def test_var_insns
43
+ assert_equal([:visit_var_insn, Opcodes::ALOAD, :a], @dummy.single {aload :a})
44
+ assert_equal([:visit_var_insn, Opcodes::ILOAD, :a], @dummy.single {iload :a})
45
+ assert_equal([:visit_var_insn, Opcodes::LLOAD, :a], @dummy.single {lload :a})
46
+ assert_equal([:visit_var_insn, Opcodes::FLOAD, :a], @dummy.single {fload :a})
47
+ assert_equal([:visit_var_insn, Opcodes::DLOAD, :a], @dummy.single {dload :a})
48
+ assert_equal([:visit_var_insn, Opcodes::ASTORE, :a], @dummy.single {astore :a})
49
+ assert_equal([:visit_var_insn, Opcodes::ISTORE, :a], @dummy.single {istore :a})
50
+ assert_equal([:visit_var_insn, Opcodes::LSTORE, :a], @dummy.single {lstore :a})
51
+ assert_equal([:visit_var_insn, Opcodes::FSTORE, :a], @dummy.single {fstore :a})
52
+ assert_equal([:visit_var_insn, Opcodes::DSTORE, :a], @dummy.single {dstore :a})
53
+
54
+ assert_equal([:visit_var_insn, Opcodes::RET, :a], @dummy.single {ret :a})
55
+ end
56
+
57
+ def test_ldc
58
+ assert_equal([:visit_ldc_insn, "a"], @dummy.single {ldc :a})
59
+ assert_equal([:visit_ldc_insn, "a"], @dummy.single {ldc "a"})
60
+
61
+ assert_equal([:visit_int_insn, Opcodes::BIPUSH, -2], @dummy.single {ldc(-2)})
62
+ assert_equal([:visit_insn, Opcodes::ICONST_M1], @dummy.single {ldc(-1)})
63
+ assert_equal([:visit_insn, Opcodes::ICONST_0], @dummy.single {ldc(0)})
64
+ assert_equal([:visit_insn, Opcodes::ICONST_1], @dummy.single {ldc(1)})
65
+ assert_equal([:visit_insn, Opcodes::ICONST_2], @dummy.single {ldc(2)})
66
+ assert_equal([:visit_insn, Opcodes::ICONST_3], @dummy.single {ldc(3)})
67
+ assert_equal([:visit_insn, Opcodes::ICONST_4], @dummy.single {ldc(4)})
68
+ assert_equal([:visit_insn, Opcodes::ICONST_5], @dummy.single {ldc(5)})
69
+ assert_equal([:visit_int_insn, Opcodes::BIPUSH, 6], @dummy.single {ldc(6)})
70
+
71
+ assert_equal([:visit_int_insn, Opcodes::SIPUSH, -129], @dummy.single {ldc(-129)})
72
+ assert_equal([:visit_int_insn, Opcodes::SIPUSH, 128], @dummy.single {ldc(128)})
73
+ assert_equal([:visit_ldc_insn, -65537], @dummy.single {ldc(-65537)})
74
+ assert_equal([:visit_ldc_insn, 65536], @dummy.single {ldc(65536)})
75
+ assert_equal([:visit_ldc_insn, java.lang.Integer::MIN_VALUE - 1], @dummy.single {ldc(java.lang.Integer::MIN_VALUE - 1)})
76
+ assert_equal([:visit_ldc_insn, java.lang.Integer::MAX_VALUE + 1], @dummy.single {ldc(java.lang.Integer::MAX_VALUE + 1)})
77
+
78
+ assert_equal([:visit_ldc_insn, java.lang.Integer.new(1)], @dummy.single {ldc_int 1})
79
+ assert_equal([:visit_ldc_insn, java.lang.Long.new(1)], @dummy.single {ldc_long 1})
80
+ assert_equal([:visit_ldc_insn, java.lang.Float.new(1)], @dummy.single {ldc_float 1})
81
+ assert_equal([:visit_ldc_insn, java.lang.Double.new(1)], @dummy.single {ldc_double 1})
82
+ assert_equal([:visit_ldc_insn, java.lang.Double.new(1)], @dummy.single {ldc(1.0)})
83
+
84
+ assert_equal([:visit_ldc_insn, BiteScript::ASM::Type.get_type(System.java_class)], @dummy.single {ldc(System)})
85
+ end
86
+
87
+ def test_int_insns
88
+ assert_equal([:visit_int_insn, Opcodes::BIPUSH, 1], @dummy.single {bipush 1})
89
+ assert_equal([:visit_int_insn, Opcodes::SIPUSH, 1], @dummy.single {sipush 1})
90
+
91
+ assert_equal([:visit_int_insn, Opcodes::BIPUSH, -2], @dummy.single {push_int(-2)})
92
+ assert_equal([:visit_insn, Opcodes::ICONST_M1], @dummy.single {push_int(-1)})
93
+ assert_equal([:visit_insn, Opcodes::ICONST_0], @dummy.single {push_int(0)})
94
+ assert_equal([:visit_insn, Opcodes::ICONST_1], @dummy.single {push_int(1)})
95
+ assert_equal([:visit_insn, Opcodes::ICONST_2], @dummy.single {push_int(2)})
96
+ assert_equal([:visit_insn, Opcodes::ICONST_3], @dummy.single {push_int(3)})
97
+ assert_equal([:visit_insn, Opcodes::ICONST_4], @dummy.single {push_int(4)})
98
+ assert_equal([:visit_insn, Opcodes::ICONST_5], @dummy.single {push_int(5)})
99
+ assert_equal([:visit_int_insn, Opcodes::BIPUSH, 6], @dummy.single {push_int(6)})
100
+
101
+ assert_equal([:visit_int_insn, Opcodes::SIPUSH, -129], @dummy.single {push_int(-129)})
102
+ assert_equal([:visit_int_insn, Opcodes::SIPUSH, 128], @dummy.single {push_int(128)})
103
+ assert_equal([:visit_ldc_insn, -65537], @dummy.single {push_int(-65537)})
104
+ assert_equal([:visit_ldc_insn, 65536], @dummy.single {push_int(65536)})
105
+ assert_equal([:visit_ldc_insn, java.lang.Integer::MIN_VALUE - 1], @dummy.single {push_int(java.lang.Integer::MIN_VALUE - 1)})
106
+ assert_equal([:visit_ldc_insn, java.lang.Integer::MAX_VALUE + 1], @dummy.single {push_int(java.lang.Integer::MAX_VALUE + 1)})
107
+ end
108
+
109
+ def test_method_insns
110
+ assert_equal(
111
+ [:visit_method_insn, Opcodes::INVOKESTATIC, "java/lang/Integer", "b", "(Ljava/lang/System;)Ljava/lang/Integer;"],
112
+ @dummy.single {invokestatic Integer, :b, [Integer, System]})
113
+ assert_equal(
114
+ [:visit_method_insn, Opcodes::INVOKESTATIC, "java/lang/Integer", "b", "()Ljava/lang/Integer;"],
115
+ @dummy.single {invokestatic Integer, :b, Integer})
116
+ assert_equal(
117
+ [:visit_method_insn, Opcodes::INVOKEVIRTUAL, "java/lang/Integer", "b", "(Ljava/lang/System;)Ljava/lang/Integer;"],
118
+ @dummy.single {invokevirtual Integer, :b, [Integer, System]})
119
+ assert_equal(
120
+ [:visit_method_insn, Opcodes::INVOKEINTERFACE, "java/lang/Integer", "b", "(Ljava/lang/System;)Ljava/lang/Integer;"],
121
+ @dummy.single {invokeinterface Integer, :b, [Integer, System]})
122
+ assert_equal(
123
+ [:visit_method_insn, Opcodes::INVOKESPECIAL, "java/lang/Integer", "b", "(Ljava/lang/System;)Ljava/lang/Integer;"],
124
+ @dummy.single {invokespecial Integer, :b, [Integer, System]})
125
+ end
126
+
127
+ def test_return
128
+ assert_equal([:visit_insn, Opcodes::RETURN], @dummy.single {returnvoid})
129
+ end
130
+
131
+ def test_nop
132
+ assert_equal([:visit_insn, Opcodes::NOP], @dummy.single {nop})
133
+ end
134
+
135
+ def test_stack_insns
136
+ assert_equal([:visit_insn, Opcodes::DUP], @dummy.single {dup})
137
+ assert_equal([:visit_insn, Opcodes::SWAP], @dummy.single {swap})
138
+ assert_equal([:visit_insn, Opcodes::POP], @dummy.single {pop})
139
+ assert_equal([:visit_insn, Opcodes::POP2], @dummy.single {pop2})
140
+ assert_equal([:visit_insn, Opcodes::DUP_X1], @dummy.single {dup_x1})
141
+ assert_equal([:visit_insn, Opcodes::DUP_X2], @dummy.single {dup_x2})
142
+ assert_equal([:visit_insn, Opcodes::DUP2], @dummy.single {dup2})
143
+ assert_equal([:visit_insn, Opcodes::DUP2_X1], @dummy.single {dup2_x1})
144
+ assert_equal([:visit_insn, Opcodes::DUP2_X2], @dummy.single {dup2_x2})
145
+ end
146
+
147
+ def test_arraylength
148
+ assert_equal([:visit_insn, Opcodes::ARRAYLENGTH], @dummy.single {arraylength})
149
+ end
150
+
151
+ def test_reference_insns
152
+ assert_equal([:visit_insn, Opcodes::ACONST_NULL], @dummy.single {aconst_null})
153
+ assert_equal([:visit_insn, Opcodes::ARETURN], @dummy.single {areturn})
154
+ assert_equal([:visit_insn, Opcodes::ATHROW], @dummy.single {athrow})
155
+ assert_equal([:visit_insn, Opcodes::AALOAD], @dummy.single {aaload})
156
+ assert_equal([:visit_insn, Opcodes::AASTORE], @dummy.single {aastore})
157
+ end
158
+
159
+ def test_byte_insns
160
+ assert_equal([:visit_insn, Opcodes::BALOAD], @dummy.single {baload})
161
+ assert_equal([:visit_insn, Opcodes::BASTORE], @dummy.single {bastore})
162
+ end
163
+
164
+ def test_char_insns
165
+ assert_equal([:visit_insn, Opcodes::CALOAD], @dummy.single {caload})
166
+ assert_equal([:visit_insn, Opcodes::CASTORE], @dummy.single {castore})
167
+ end
168
+
169
+ def test_short_insns
170
+ assert_equal([:visit_insn, Opcodes::SALOAD], @dummy.single {saload})
171
+ assert_equal([:visit_insn, Opcodes::SASTORE], @dummy.single {sastore})
172
+ end
173
+
174
+ def test_int_insns
175
+ assert_equal([:visit_insn, Opcodes::ICONST_M1], @dummy.single {iconst_m1})
176
+ assert_equal([:visit_insn, Opcodes::ICONST_0], @dummy.single {iconst_0})
177
+ assert_equal([:visit_insn, Opcodes::ICONST_1], @dummy.single {iconst_1})
178
+ assert_equal([:visit_insn, Opcodes::ICONST_2], @dummy.single {iconst_2})
179
+ assert_equal([:visit_insn, Opcodes::ICONST_3], @dummy.single {iconst_3})
180
+ assert_equal([:visit_insn, Opcodes::ICONST_4], @dummy.single {iconst_4})
181
+ assert_equal([:visit_insn, Opcodes::ICONST_5], @dummy.single {iconst_5})
182
+ assert_equal([:visit_insn, Opcodes::IALOAD], @dummy.single {iaload})
183
+ assert_equal([:visit_insn, Opcodes::IASTORE], @dummy.single {iastore})
184
+ assert_equal([:visit_insn, Opcodes::IRETURN], @dummy.single {ireturn})
185
+ assert_equal([:visit_insn, Opcodes::IADD], @dummy.single {iadd})
186
+ assert_equal([:visit_insn, Opcodes::ISUB], @dummy.single {isub})
187
+ assert_equal([:visit_insn, Opcodes::IDIV], @dummy.single {idiv})
188
+ assert_equal([:visit_insn, Opcodes::IMUL], @dummy.single {imul})
189
+ assert_equal([:visit_insn, Opcodes::INEG], @dummy.single {ineg})
190
+ assert_equal([:visit_insn, Opcodes::IAND], @dummy.single {iand})
191
+ assert_equal([:visit_insn, Opcodes::IOR], @dummy.single {ior})
192
+ assert_equal([:visit_insn, Opcodes::IXOR], @dummy.single {ixor})
193
+ assert_equal([:visit_insn, Opcodes::IUSHR], @dummy.single {iushr})
194
+ assert_equal([:visit_insn, Opcodes::ISHL], @dummy.single {ishl})
195
+ assert_equal([:visit_insn, Opcodes::ISHR], @dummy.single {ishr})
196
+ assert_equal([:visit_insn, Opcodes::IREM], @dummy.single {irem})
197
+ assert_equal([:visit_insn, Opcodes::I2L], @dummy.single {i2l})
198
+ assert_equal([:visit_insn, Opcodes::I2S], @dummy.single {i2s})
199
+ assert_equal([:visit_insn, Opcodes::I2B], @dummy.single {i2b})
200
+ assert_equal([:visit_insn, Opcodes::I2C], @dummy.single {i2c})
201
+ assert_equal([:visit_insn, Opcodes::I2D], @dummy.single {i2d})
202
+ assert_equal([:visit_insn, Opcodes::I2F], @dummy.single {i2f})
203
+ end
204
+
205
+ def test_iinc_insn
206
+ assert_equal([:visit_iinc_insn, 0, 1], @dummy.single {iinc 0, 1})
207
+ end
208
+
209
+ def test_long_insns
210
+ assert_equal([:visit_insn, Opcodes::LCONST_0], @dummy.single {lconst_0})
211
+ assert_equal([:visit_insn, Opcodes::LCONST_1], @dummy.single {lconst_1})
212
+ assert_equal([:visit_insn, Opcodes::LALOAD], @dummy.single {laload})
213
+ assert_equal([:visit_insn, Opcodes::LASTORE], @dummy.single {lastore})
214
+ assert_equal([:visit_insn, Opcodes::LRETURN], @dummy.single {lreturn})
215
+ assert_equal([:visit_insn, Opcodes::LADD], @dummy.single {ladd})
216
+ assert_equal([:visit_insn, Opcodes::LSUB], @dummy.single {lsub})
217
+ assert_equal([:visit_insn, Opcodes::LDIV], @dummy.single {ldiv})
218
+ assert_equal([:visit_insn, Opcodes::LMUL], @dummy.single {lmul})
219
+ assert_equal([:visit_insn, Opcodes::LNEG], @dummy.single {lneg})
220
+ assert_equal([:visit_insn, Opcodes::LAND], @dummy.single {land})
221
+ assert_equal([:visit_insn, Opcodes::LOR], @dummy.single {lor})
222
+ assert_equal([:visit_insn, Opcodes::LXOR], @dummy.single {lxor})
223
+ assert_equal([:visit_insn, Opcodes::LUSHR], @dummy.single {lushr})
224
+ assert_equal([:visit_insn, Opcodes::LSHL], @dummy.single {lshl})
225
+ assert_equal([:visit_insn, Opcodes::LSHR], @dummy.single {lshr})
226
+ assert_equal([:visit_insn, Opcodes::LREM], @dummy.single {lrem})
227
+ assert_equal([:visit_insn, Opcodes::L2I], @dummy.single {l2i})
228
+ assert_equal([:visit_insn, Opcodes::L2D], @dummy.single {l2d})
229
+ assert_equal([:visit_insn, Opcodes::L2F], @dummy.single {l2f})
230
+ end
231
+
232
+ def test_float_insns
233
+ assert_equal([:visit_insn, Opcodes::FCONST_0], @dummy.single {fconst_0})
234
+ assert_equal([:visit_insn, Opcodes::FCONST_1], @dummy.single {fconst_1})
235
+ assert_equal([:visit_insn, Opcodes::FCONST_2], @dummy.single {fconst_2})
236
+ assert_equal([:visit_insn, Opcodes::FALOAD], @dummy.single {faload})
237
+ assert_equal([:visit_insn, Opcodes::FASTORE], @dummy.single {fastore})
238
+ assert_equal([:visit_insn, Opcodes::FRETURN], @dummy.single {freturn})
239
+ assert_equal([:visit_insn, Opcodes::FADD], @dummy.single {fadd})
240
+ assert_equal([:visit_insn, Opcodes::FSUB], @dummy.single {fsub})
241
+ assert_equal([:visit_insn, Opcodes::FDIV], @dummy.single {fdiv})
242
+ assert_equal([:visit_insn, Opcodes::FMUL], @dummy.single {fmul})
243
+ assert_equal([:visit_insn, Opcodes::FNEG], @dummy.single {fneg})
244
+ assert_equal([:visit_insn, Opcodes::FREM], @dummy.single {frem})
245
+ assert_equal([:visit_insn, Opcodes::F2L], @dummy.single {f2l})
246
+ assert_equal([:visit_insn, Opcodes::F2D], @dummy.single {f2d})
247
+ assert_equal([:visit_insn, Opcodes::F2I], @dummy.single {f2i})
248
+ end
249
+
250
+ def test_double_insns
251
+ assert_equal([:visit_insn, Opcodes::DCONST_0], @dummy.single {dconst_0})
252
+ assert_equal([:visit_insn, Opcodes::DCONST_1], @dummy.single {dconst_1})
253
+ assert_equal([:visit_insn, Opcodes::DALOAD], @dummy.single {daload})
254
+ assert_equal([:visit_insn, Opcodes::DASTORE], @dummy.single {dastore})
255
+ assert_equal([:visit_insn, Opcodes::DRETURN], @dummy.single {dreturn})
256
+ assert_equal([:visit_insn, Opcodes::DADD], @dummy.single {dadd})
257
+ assert_equal([:visit_insn, Opcodes::DSUB], @dummy.single {dsub})
258
+ assert_equal([:visit_insn, Opcodes::DDIV], @dummy.single {ddiv})
259
+ assert_equal([:visit_insn, Opcodes::DMUL], @dummy.single {dmul})
260
+ assert_equal([:visit_insn, Opcodes::DNEG], @dummy.single {dneg})
261
+ assert_equal([:visit_insn, Opcodes::DREM], @dummy.single {drem})
262
+ assert_equal([:visit_insn, Opcodes::D2L], @dummy.single {d2l})
263
+ assert_equal([:visit_insn, Opcodes::D2F], @dummy.single {d2f})
264
+ assert_equal([:visit_insn, Opcodes::D2I], @dummy.single {d2i})
265
+ end
266
+
267
+ def test_sync_insns
268
+ assert_equal([:visit_insn, Opcodes::MONITORENTER], @dummy.single {monitorenter})
269
+ assert_equal([:visit_insn, Opcodes::MONITOREXIT], @dummy.single {monitorexit})
270
+ end
271
+
272
+ def test_type_insns
273
+ assert_equal([:visit_type_insn, Opcodes::NEW, :a], @dummy.single {new :a})
274
+ assert_equal([:visit_type_insn, Opcodes::ANEWARRAY, :a], @dummy.single {anewarray :a})
275
+ assert_equal([:visit_type_insn, Opcodes::INSTANCEOF, :a], @dummy.single {instanceof :a})
276
+ assert_equal([:visit_type_insn, Opcodes::CHECKCAST, :a], @dummy.single {checkcast :a})
277
+ end
278
+
279
+ def test_newarray_insns
280
+ assert_equal([:visit_int_insn, Opcodes::NEWARRAY, Opcodes::T_BOOLEAN], @dummy.single {newbooleanarray})
281
+ assert_equal([:visit_int_insn, Opcodes::NEWARRAY, Opcodes::T_BYTE], @dummy.single {newbytearray})
282
+ assert_equal([:visit_int_insn, Opcodes::NEWARRAY, Opcodes::T_SHORT], @dummy.single {newshortarray})
283
+ assert_equal([:visit_int_insn, Opcodes::NEWARRAY, Opcodes::T_CHAR], @dummy.single {newchararray})
284
+ assert_equal([:visit_int_insn, Opcodes::NEWARRAY, Opcodes::T_INT], @dummy.single {newintarray})
285
+ assert_equal([:visit_int_insn, Opcodes::NEWARRAY, Opcodes::T_LONG], @dummy.single {newlongarray})
286
+ assert_equal([:visit_int_insn, Opcodes::NEWARRAY, Opcodes::T_FLOAT], @dummy.single {newfloatarray})
287
+ assert_equal([:visit_int_insn, Opcodes::NEWARRAY, Opcodes::T_DOUBLE], @dummy.single {newdoublearray})
288
+ end
289
+
290
+ def test_field_insns
291
+ assert_equal([:visit_field_insn, Opcodes::GETFIELD, "java/lang/Integer", "b", "Ljava/lang/System;"], @dummy.single {getfield Integer, :b, System})
292
+ assert_equal([:visit_field_insn, Opcodes::PUTFIELD, "java/lang/Integer", "b", "Ljava/lang/System;"], @dummy.single {putfield Integer, :b, System})
293
+ assert_equal([:visit_field_insn, Opcodes::GETSTATIC, "java/lang/Integer", "b", "Ljava/lang/System;"], @dummy.single {getstatic Integer, :b, System})
294
+ assert_equal([:visit_field_insn, Opcodes::PUTSTATIC, "java/lang/Integer", "b", "Ljava/lang/System;"], @dummy.single {putstatic Integer, :b, System})
295
+ end
296
+
297
+ def test_trycatch
298
+ a_lbl = label :a
299
+ b_lbl = label :b
300
+ c_lbl = label :c
301
+ assert_equal([:visit_try_catch_block, a_lbl.label, b_lbl.label, c_lbl.label, "java/lang/Integer"], @dummy.single {trycatch :a, :b, :c, Integer})
302
+ assert_equal([:visit_try_catch_block, a_lbl.label, b_lbl.label, c_lbl.label, "java/lang/Integer"], @dummy.single {trycatch a_lbl, b_lbl, c_lbl, Integer})
303
+ end
304
+
305
+ def test_jump_insns
306
+ a_lbl = label :a
307
+ assert_equal([:visit_jump_insn, Opcodes::GOTO, a_lbl.label], @dummy.single {goto a_lbl})
308
+ assert_equal([:visit_jump_insn, Opcodes::IFEQ, a_lbl.label], @dummy.single {ifeq a_lbl})
309
+ assert_equal([:visit_jump_insn, Opcodes::IFNE, a_lbl.label], @dummy.single {ifne a_lbl})
310
+ assert_equal([:visit_jump_insn, Opcodes::IFLE, a_lbl.label], @dummy.single {ifle a_lbl})
311
+ assert_equal([:visit_jump_insn, Opcodes::IFLT, a_lbl.label], @dummy.single {iflt a_lbl})
312
+ assert_equal([:visit_jump_insn, Opcodes::IFGE, a_lbl.label], @dummy.single {ifge a_lbl})
313
+ assert_equal([:visit_jump_insn, Opcodes::IFGT, a_lbl.label], @dummy.single {ifgt a_lbl})
314
+ assert_equal([:visit_jump_insn, Opcodes::IF_ACMPEQ, a_lbl.label], @dummy.single {if_acmpeq a_lbl})
315
+ assert_equal([:visit_jump_insn, Opcodes::IF_ACMPNE, a_lbl.label], @dummy.single {if_acmpne a_lbl})
316
+ assert_equal([:visit_jump_insn, Opcodes::IF_ICMPEQ, a_lbl.label], @dummy.single {if_icmpeq a_lbl})
317
+ assert_equal([:visit_jump_insn, Opcodes::IF_ICMPNE, a_lbl.label], @dummy.single {if_icmpne a_lbl})
318
+ assert_equal([:visit_jump_insn, Opcodes::IF_ICMPLT, a_lbl.label], @dummy.single {if_icmplt a_lbl})
319
+ assert_equal([:visit_jump_insn, Opcodes::IF_ICMPGT, a_lbl.label], @dummy.single {if_icmpgt a_lbl})
320
+ assert_equal([:visit_jump_insn, Opcodes::IF_ICMPLE, a_lbl.label], @dummy.single {if_icmple a_lbl})
321
+ assert_equal([:visit_jump_insn, Opcodes::IF_ICMPGE, a_lbl.label], @dummy.single {if_icmpge a_lbl})
322
+ assert_equal([:visit_jump_insn, Opcodes::IFNULL, a_lbl.label], @dummy.single {ifnull a_lbl})
323
+ assert_equal([:visit_jump_insn, Opcodes::IFNONNULL, a_lbl.label], @dummy.single {ifnonnull a_lbl})
324
+ assert_equal([:visit_jump_insn, Opcodes::JSR, a_lbl.label], @dummy.single {jsr a_lbl})
325
+
326
+ assert_equal([:visit_jump_insn, Opcodes::GOTO, a_lbl.label], @dummy.single {goto :a})
327
+ assert_equal([:visit_jump_insn, Opcodes::IFEQ, a_lbl.label], @dummy.single {ifeq :a})
328
+ assert_equal([:visit_jump_insn, Opcodes::IFNE, a_lbl.label], @dummy.single {ifne :a})
329
+ assert_equal([:visit_jump_insn, Opcodes::IFLE, a_lbl.label], @dummy.single {ifle :a})
330
+ assert_equal([:visit_jump_insn, Opcodes::IFLT, a_lbl.label], @dummy.single {iflt :a})
331
+ assert_equal([:visit_jump_insn, Opcodes::IFGE, a_lbl.label], @dummy.single {ifge :a})
332
+ assert_equal([:visit_jump_insn, Opcodes::IFGT, a_lbl.label], @dummy.single {ifgt :a})
333
+ assert_equal([:visit_jump_insn, Opcodes::IF_ACMPEQ, a_lbl.label], @dummy.single {if_acmpeq :a})
334
+ assert_equal([:visit_jump_insn, Opcodes::IF_ACMPNE, a_lbl.label], @dummy.single {if_acmpne :a})
335
+ assert_equal([:visit_jump_insn, Opcodes::IF_ICMPEQ, a_lbl.label], @dummy.single {if_icmpeq :a})
336
+ assert_equal([:visit_jump_insn, Opcodes::IF_ICMPNE, a_lbl.label], @dummy.single {if_icmpne :a})
337
+ assert_equal([:visit_jump_insn, Opcodes::IF_ICMPLT, a_lbl.label], @dummy.single {if_icmplt :a})
338
+ assert_equal([:visit_jump_insn, Opcodes::IF_ICMPGT, a_lbl.label], @dummy.single {if_icmpgt :a})
339
+ assert_equal([:visit_jump_insn, Opcodes::IF_ICMPLE, a_lbl.label], @dummy.single {if_icmple :a})
340
+ assert_equal([:visit_jump_insn, Opcodes::IF_ICMPGE, a_lbl.label], @dummy.single {if_icmpge :a})
341
+ assert_equal([:visit_jump_insn, Opcodes::IFNULL, a_lbl.label], @dummy.single {ifnull :a})
342
+ assert_equal([:visit_jump_insn, Opcodes::IFNONNULL, a_lbl.label], @dummy.single {ifnonnull :a})
343
+ assert_equal([:visit_jump_insn, Opcodes::JSR, a_lbl.label], @dummy.single {jsr :a})
344
+
345
+ assert_equal([:visit_label, a_lbl.label], @dummy.single {a_lbl.set!})
346
+ end
347
+
348
+ def test_multidim_array
349
+ assert_equal([:visit_multi_anew_array_insn, "Ljava/lang/Integer;", 5], @dummy.single {multianewarray Integer, 5})
350
+ end
351
+
352
+ def test_lookup_switch
353
+ a_lbl = label :a
354
+ b_lbl = label :b
355
+
356
+ # This is kinda hacky because we return a new array instance for to_java each time
357
+ lswitch = @dummy.single {lookupswitch :a, [1], [:b]}
358
+ rest, labels = lswitch[0..-3], lswitch[-2..-1]
359
+ assert_equal([:visit_lookup_switch_insn, a_lbl.label], rest)
360
+ assert_equal(1, labels[0][0])
361
+ assert_equal(b_lbl.label, labels[1][0])
362
+
363
+ lswitch = @dummy.single {lookupswitch a_lbl, [1], [b_lbl]}
364
+ rest, labels = lswitch[0..-3], lswitch[-2..-1]
365
+ assert_equal([:visit_lookup_switch_insn, a_lbl.label], rest)
366
+ assert_equal(1, labels[0][0])
367
+ assert_equal(b_lbl.label, labels[1][0])
368
+ end
369
+
370
+ def test_table_switch
371
+ a_lbl = label :a
372
+ b_lbl = label :b
373
+
374
+ # This is kinda hacky because we return a new array instance for to_java each time
375
+ tswitch = @dummy.single {tableswitch 0, 1, :a, [:b]}
376
+ rest, labels = tswitch[0..-2], tswitch[-1]
377
+ assert_equal([:visit_table_switch_insn, 0, 1, a_lbl.label], rest)
378
+ assert_equal(b_lbl.label, labels[0])
379
+
380
+ tswitch = @dummy.single {tableswitch 0, 1, a_lbl, [b_lbl]}
381
+ rest, labels = tswitch[0..-2], tswitch[-1]
382
+ assert_equal([:visit_table_switch_insn, 0, 1, a_lbl.label], rest)
383
+ assert_equal(b_lbl.label, labels[0])
384
+ end
385
+
386
+ def test_label
387
+ l1 = label
388
+ assert_equal([:visit_label, l1.label], l1.set!)
389
+ end
390
+
391
+ def test_aprintln
392
+ aprintln
393
+ assert_equal(
394
+ [ [:visit_field_insn, Opcodes::GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"],
395
+ [:visit_insn, Opcodes::SWAP],
396
+ [ :visit_method_insn,
397
+ Opcodes::INVOKEVIRTUAL,
398
+ "java/io/PrintStream",
399
+ "println",
400
+ "(Ljava/lang/Object;)V"]], @dummy.all)
401
+ end
402
+
403
+ def test_swap2
404
+ swap2
405
+ assert_equal([[:visit_insn, Opcodes::DUP2_X2], [:visit_insn, Opcodes::POP2]], @dummy.all)
406
+ end
407
+
408
+ def test_var_insns_deltas
409
+ assert_equal(1, (aload :a))
410
+ assert_equal(1, (iload :a))
411
+ assert_equal(2, (lload :a))
412
+ assert_equal(1, (fload :a))
413
+ assert_equal(2, (dload :a))
414
+ assert_equal(-1, (astore :a))
415
+ assert_equal(-1, (istore :a))
416
+ assert_equal(-2, (lstore :a))
417
+ assert_equal(-1, (fstore :a))
418
+ assert_equal(-2, (dstore :a))
419
+
420
+ assert_equal(0, (ret :a))
421
+ end
422
+
423
+ def test_ldc_deltas
424
+ assert_equal(1, (ldc :a))
425
+ assert_equal(1, (ldc "a"))
426
+ assert_equal(1, (ldc_int 1))
427
+ assert_equal(2, (ldc_long 1))
428
+ assert_equal(1, (ldc_float 1))
429
+ assert_equal(2, (ldc_double 1))
430
+ end
431
+
432
+ def test_int_insns_deltas
433
+ assert_equal(1, (bipush 1))
434
+ assert_equal(1, (sipush 1))
435
+
436
+ assert_equal(1, (push_int(-2)))
437
+ assert_equal(1, (push_int(-1)))
438
+ assert_equal(1, (push_int(0)))
439
+ assert_equal(1, (push_int(1)))
440
+ assert_equal(1, (push_int(2)))
441
+ assert_equal(1, (push_int(3)))
442
+ assert_equal(1, (push_int(4)))
443
+ assert_equal(1, (push_int(5)))
444
+ assert_equal(1, (push_int(6)))
445
+
446
+ assert_equal(1, (push_int(-129)))
447
+ assert_equal(1, (push_int(128)))
448
+ assert_equal(1, (push_int(-65537)))
449
+ assert_equal(1, (push_int(65536)))
450
+ end
451
+
452
+ def test_method_insns_deltas
453
+ assert_equal(
454
+ 0,
455
+ (invokestatic Integer, :b, [Integer, System]))
456
+ assert_equal(
457
+ 1,
458
+ (invokestatic Integer, :b, Integer))
459
+ assert_equal(
460
+ -1,
461
+ (invokevirtual Integer, :b, [Integer, System]))
462
+ assert_equal(
463
+ -1,
464
+ (invokeinterface Integer, :b, [Integer, System]))
465
+ assert_equal(
466
+ -1,
467
+ (invokespecial Integer, :b, [Integer, System]))
468
+ end
469
+
470
+ def test_return_deltas
471
+ assert_equal(0, (returnvoid))
472
+ end
473
+
474
+ def test_nop_deltas
475
+ assert_equal(0, (nop))
476
+ end
477
+
478
+ def test_stack_insns_deltas
479
+ assert_equal(1, (dup))
480
+ assert_equal(0, (swap))
481
+ assert_equal(-1, (pop))
482
+ assert_equal(-2, (pop2))
483
+ assert_equal(1, (dup_x1))
484
+ assert_equal(1, (dup_x2))
485
+ assert_equal(2, (dup2))
486
+ assert_equal(2, (dup2_x1))
487
+ assert_equal(2, (dup2_x2))
488
+ end
489
+
490
+ def test_arraylength_deltas
491
+ assert_equal(0, (arraylength))
492
+ end
493
+
494
+ def test_reference_insns_deltas
495
+ assert_equal(1, (aconst_null))
496
+ assert_equal(-1, (areturn))
497
+ assert_equal(-1, (athrow))
498
+ assert_equal(-1, (aaload))
499
+ assert_equal(-3, (aastore))
500
+ end
501
+
502
+ def test_byte_insns_deltas
503
+ assert_equal(-1, (baload))
504
+ assert_equal(-3, (bastore))
505
+ end
506
+
507
+ def test_char_insns_deltas
508
+ assert_equal(-1, (caload))
509
+ assert_equal(-3, (castore))
510
+ end
511
+
512
+ def test_short_insns_deltas
513
+ assert_equal(-1, (saload))
514
+ assert_equal(-3, (sastore))
515
+ end
516
+
517
+ def test_int_insns_deltas
518
+ assert_equal(1, (iconst_m1))
519
+ assert_equal(1, (iconst_0))
520
+ assert_equal(1, (iconst_1))
521
+ assert_equal(1, (iconst_2))
522
+ assert_equal(1, (iconst_3))
523
+ assert_equal(1, (iconst_4))
524
+ assert_equal(1, (iconst_5))
525
+ assert_equal(-1, (iaload))
526
+ assert_equal(-3, (iastore))
527
+ assert_equal(-1, (ireturn))
528
+ assert_equal(-1, (iadd))
529
+ assert_equal(-1, (isub))
530
+ assert_equal(0, (iinc 0, 1))
531
+ assert_equal(-1, (idiv))
532
+ assert_equal(-1, (imul))
533
+ assert_equal(0, (ineg))
534
+ assert_equal(-1, (iand))
535
+ assert_equal(-1, (ior))
536
+ assert_equal(-1, (ixor))
537
+ assert_equal(0, (iushr))
538
+ assert_equal(0, (ishl))
539
+ assert_equal(0, (ishr))
540
+ assert_equal(-1, (irem))
541
+ assert_equal(1, (i2l))
542
+ assert_equal(0, (i2s))
543
+ assert_equal(0, (i2b))
544
+ assert_equal(0, (i2c))
545
+ assert_equal(1, (i2d))
546
+ assert_equal(0, (i2f))
547
+ end
548
+
549
+ def test_long_insns_deltas
550
+ assert_equal(2, (lconst_0))
551
+ assert_equal(2, (lconst_1))
552
+ assert_equal(0, (laload))
553
+ assert_equal(-4, (lastore))
554
+ assert_equal(-2, (lreturn))
555
+ assert_equal(-2, (ladd))
556
+ assert_equal(-2, (lsub))
557
+ assert_equal(-2, (ldiv))
558
+ assert_equal(-2, (lmul))
559
+ assert_equal(0, (lneg))
560
+ assert_equal(-2, (land))
561
+ assert_equal(-2, (lor))
562
+ assert_equal(-2, (lxor))
563
+ assert_equal(0, (lushr))
564
+ assert_equal(0, (lshl))
565
+ assert_equal(0, (lshr))
566
+ assert_equal(-2, (lrem))
567
+ assert_equal(-1, (l2i))
568
+ assert_equal(0, (l2d))
569
+ assert_equal(-1, (l2f))
570
+ end
571
+
572
+ def test_float_insns_deltas
573
+ assert_equal(1, (fconst_0))
574
+ assert_equal(1, (fconst_1))
575
+ assert_equal(1, (fconst_2))
576
+ assert_equal(-1, (faload))
577
+ assert_equal(-3, (fastore))
578
+ assert_equal(-1, (freturn))
579
+ assert_equal(-1, (fadd))
580
+ assert_equal(-1, (fsub))
581
+ assert_equal(-1, (fdiv))
582
+ assert_equal(-1, (fmul))
583
+ assert_equal(0, (fneg))
584
+ assert_equal(-1, (frem))
585
+ assert_equal(1, (f2l))
586
+ assert_equal(1, (f2d))
587
+ assert_equal(0, (f2i))
588
+ end
589
+
590
+ def test_double_insns_deltas
591
+ assert_equal(2, (dconst_0))
592
+ assert_equal(2, (dconst_1))
593
+ assert_equal(0, (daload))
594
+ assert_equal(-4, (dastore))
595
+ assert_equal(-2, (dreturn))
596
+ assert_equal(-2, (dadd))
597
+ assert_equal(-2, (dsub))
598
+ assert_equal(-2, (ddiv))
599
+ assert_equal(-2, (dmul))
600
+ assert_equal(0, (dneg))
601
+ assert_equal(-2, (drem))
602
+ assert_equal(0, (d2l))
603
+ assert_equal(-1, (d2f))
604
+ assert_equal(-1, (d2i))
605
+ end
606
+
607
+ def test_sync_insns_deltas
608
+ assert_equal(-1, (monitorenter))
609
+ assert_equal(-1, (monitorexit))
610
+ end
611
+
612
+ def test_type_insns_deltas
613
+ assert_equal(1, (new :a))
614
+ assert_equal(0, (anewarray :a))
615
+ assert_equal(0, (instanceof :a))
616
+ assert_equal(0, (checkcast :a))
617
+ end
618
+
619
+ def test_newarray_insn_deltas
620
+ assert_equal(0, (newbooleanarray))
621
+ assert_equal(0, (newbytearray))
622
+ assert_equal(0, (newshortarray))
623
+ assert_equal(0, (newchararray))
624
+ assert_equal(0, (newintarray))
625
+ assert_equal(0, (newlongarray))
626
+ assert_equal(0, (newfloatarray))
627
+ assert_equal(0, (newdoublearray))
628
+ end
629
+
630
+ def test_field_insns_deltas
631
+ assert_equal(0, (getfield Integer, :b, System))
632
+ assert_equal(-2, (putfield Integer, :b, System))
633
+ assert_equal(1, (getstatic Integer, :b, System))
634
+ assert_equal(-1, (putstatic Integer, :b, System))
635
+ end
636
+
637
+ def test_jump_insns_deltas
638
+ lbl = label
639
+ assert_equal(0, (goto lbl))
640
+ assert_equal(-1, (ifeq lbl))
641
+ assert_equal(-1, (ifne lbl))
642
+ assert_equal(-1, (ifle lbl))
643
+ assert_equal(-1, (iflt lbl))
644
+ assert_equal(-1, (ifge lbl))
645
+ assert_equal(-1, (ifgt lbl))
646
+ assert_equal(-2, (if_acmpeq lbl))
647
+ assert_equal(-2, (if_acmpne lbl))
648
+ assert_equal(-2, (if_icmpeq lbl))
649
+ assert_equal(-2, (if_icmpne lbl))
650
+ assert_equal(-2, (if_icmplt lbl))
651
+ assert_equal(-2, (if_icmpgt lbl))
652
+ assert_equal(-2, (if_icmple lbl))
653
+ assert_equal(-2, (if_icmpge lbl))
654
+ assert_equal(-1, (ifnull lbl))
655
+ assert_equal(-1, (ifnonnull lbl))
656
+ assert_equal(1, (jsr lbl))
657
+ end
658
+
659
+ def test_multidim_array_deltas
660
+ assert_equal(-5, (multianewarray Integer, 5))
661
+ end
662
+
663
+ def test_lookup_switch_deltas
664
+ label :a
665
+ label :b
666
+ assert_equal(-1, (lookupswitch :a, [1], [:b]))
667
+ end
668
+
669
+ def test_table_switch_deltas
670
+ label :a
671
+ label :b
672
+ assert_equal(-1, (tableswitch 0, 1, :a, [:b]))
673
+ end
674
+ end