bitescript 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +6 -0
- data/LICENSE.txt +9 -0
- data/Manifest.txt +20 -0
- data/README.txt +56 -0
- data/Rakefile +22 -0
- data/bin/bite +32 -0
- data/bin/bitec +22 -0
- data/examples/fib.bs +79 -0
- data/examples/mixed_bag.rb +73 -0
- data/examples/simple_loop.rb +24 -0
- data/lib/bitescript/asm.rb +17 -0
- data/lib/bitescript/builder.rb +459 -0
- data/lib/bitescript/bytecode.rb +415 -0
- data/lib/bitescript/signature.rb +117 -0
- data/lib/bitescript.rb +20 -0
- data/test/test_bitescript.rb +14 -0
- data/test/test_builder.rb +429 -0
- data/test/test_bytecode.rb +674 -0
- data/test/test_java_class.rb +58 -0
- data/test/test_signature.rb +68 -0
- metadata +91 -0
@@ -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
|