bitescript 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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