mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
56 lines
1.3 KiB
Ruby
56 lines
1.3 KiB
Ruby
|
|
||
|
require '-test-/iseq_load/iseq_load'
|
||
|
require 'tempfile'
|
||
|
|
||
|
class RubyVM::InstructionSequence
|
||
|
def disasm_if_possible
|
||
|
begin
|
||
|
self.disasm
|
||
|
rescue Encoding::CompatibilityError, EncodingError, SecurityError
|
||
|
nil
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def self.compare_dump_and_load i1, dumper, loader
|
||
|
dump = dumper.call(i1)
|
||
|
return i1 unless dump
|
||
|
i2 = loader.call(dump)
|
||
|
|
||
|
# compare disassembled result
|
||
|
d1 = i1.disasm_if_possible
|
||
|
d2 = i2.disasm_if_possible
|
||
|
|
||
|
if d1 != d2
|
||
|
p i1
|
||
|
return
|
||
|
|
||
|
STDERR.puts "expected:"
|
||
|
STDERR.puts d1
|
||
|
STDERR.puts "actual:"
|
||
|
STDERR.puts d2
|
||
|
|
||
|
t1 = Tempfile.new("expected"); t1.puts d1; t1.close
|
||
|
t2 = Tempfile.new("actual"); t2.puts d2; t2.close
|
||
|
system("diff -u #{t1.path} #{t2.path}") # use diff if available
|
||
|
exit(1)
|
||
|
end
|
||
|
i2
|
||
|
end
|
||
|
|
||
|
def self.translate i1
|
||
|
# check to_a/load_iseq
|
||
|
i2 = compare_dump_and_load(i1,
|
||
|
proc{|iseq|
|
||
|
ary = iseq.to_a
|
||
|
ary[9] == :top ? ary : nil
|
||
|
},
|
||
|
proc{|ary|
|
||
|
RubyVM::InstructionSequence.iseq_load(ary)
|
||
|
})
|
||
|
# return value
|
||
|
i1
|
||
|
end
|
||
|
end
|
||
|
|
||
|
#require_relative 'x'; exit(1)
|