1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
require 'test/unit'
class TestIseqLoad < Test::Unit::TestCase
require '-test-/iseq_load/iseq_load'
ISeq = RubyVM::InstructionSequence
def test_bug8543
assert_iseq_roundtrip <<-'end;'
puts "tralivali"
def funct(a, b)
a**b
end
3.times { |i| puts "Hello, world#{funct(2,i)}!" }
end;
end
def test_case_when
assert_iseq_roundtrip <<-'end;'
def user_mask(target)
target.each_char.inject(0) do |mask, chr|
case chr
when "u"
mask | 04700
when "g"
mask | 02070
when "o"
mask | 01007
when "a"
mask | 07777
else
raise ArgumentError, "invalid `who' symbol in file mode: #{chr}"
end
end
end
end;
end
def test_splatsplat
assert_iseq_roundtrip('def splatsplat(**); end')
end
def test_hidden
assert_iseq_roundtrip('def x(a, (b, *c), d: false); end')
end
def assert_iseq_roundtrip(src)
a = ISeq.compile(src).to_a
b = ISeq.iseq_load(a).to_a
warn diff(a, b) if a != b
assert_equal a, b
assert_equal a, ISeq.iseq_load(b).to_a
end
def test_next_in_block_in_block
skip "failing due to stack_max mismatch"
assert_iseq_roundtrip <<-'end;'
3.times { 3.times { next } }
end;
end
def test_break_ensure
skip "failing due to exception entry sp mismatch"
assert_iseq_roundtrip <<-'end;'
def m
bad = true
while true
begin
break
ensure
bad = false
end
end
end
end;
end
# FIXME: still failing
def test_require_integration
skip "iseq loader require integration tests still failing"
f = File.expand_path(__FILE__)
# $(top_srcdir)/test/ruby/test_....rb
3.times { f = File.dirname(f) }
Dir[File.join(f, 'ruby', '*.rb')].each do |f|
iseq = ISeq.compile_file(f)
orig = iseq.to_a.freeze
loaded = ISeq.iseq_load(orig).to_a
if loaded != orig
warn f
warn diff(orig, loaded)
end
#assert_equal orig, loaded
end
end
end
|