-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathiseq.rb
73 lines (59 loc) · 1.4 KB
/
iseq.rb
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
class ISeq
attr_reader :insns
attr_reader :rescue_handlers
attr_reader :ensure_handlers
def initialize(ruby_iseq)
@ruby_iseq = ruby_iseq
reset!
setup_rescue_handlers!
setup_ensure_handlers!
end
def initially_had_insn?(insn)
@ruby_iseq[13].include?(insn)
end
def reset!
@insns = @ruby_iseq[13].dup
end
def file
@ruby_iseq[6]
end
def line
@ruby_iseq[8]
end
def kind
@ruby_iseq[9]
end
def shift_insn
insns.shift
end
def name
@ruby_iseq[5]
end
def lvar_names
@ruby_iseq[10]
end
def args_info
@ruby_iseq[11]
end
def pretty
"#{kind} #{name} at #{file}:#{line}"
end
def setup_rescue_handlers!
@rescue_handlers = @ruby_iseq[12]
.select { |handler| handler[0] == :rescue }
.map { |(_, iseq, begin_label, end_label, exit_label)| Handler.new(iseq, begin_label, end_label, exit_label) }
end
def setup_ensure_handlers!
@ensure_handlers = @ruby_iseq[12]
.select { |handler| handler[0] == :ensure }
.map { |(_, iseq, begin_label, end_label, exit_label)| Handler.new(iseq, begin_label, end_label, exit_label) }
end
class Handler
attr_reader :iseq
attr_reader :begin_label, :end_label, :exit_label
def initialize(iseq, begin_label, end_label, exit_label)
@iseq = iseq
@begin_label, @end_label, @exit_label = begin_label, end_label, exit_label
end
end
end