diff options
-rw-r--r-- | ChangeLog | 14 | ||||
-rw-r--r-- | test/lib/iseq_loader_checker.rb | 55 | ||||
-rw-r--r-- | test/runner.rb | 1 |
3 files changed, 70 insertions, 0 deletions
@@ -1,3 +1,17 @@ +Tue Dec 8 03:56:05 2015 Koichi Sasada <[email protected]> + + * test/lib/iseq_loader_checker.rb: add iseq dumper/loader checker. + If you enable this checker (remove `#' in test/runner.rb), + you can see comparison results between an original iseq disassembed + result and dumped and loaded iseq disassembed result. + + There are several bugs around there, because of inexact stack depth + calculation. Now, I leave these bugs because they are not critical + and difficult to solve completely. + + * test/runner.rb: require test/lib/iseq_loader_checker.rb but + disabled at default (commented out). + Tue Dec 8 03:45:47 2015 Eric Wong <[email protected]> * doc/extension.rdoc: warn about kwargs performance in C diff --git a/test/lib/iseq_loader_checker.rb b/test/lib/iseq_loader_checker.rb new file mode 100644 index 0000000000..0c372ca638 --- /dev/null +++ b/test/lib/iseq_loader_checker.rb @@ -0,0 +1,55 @@ + +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) diff --git a/test/runner.rb b/test/runner.rb index bb8e32c46b..c3cb2d8472 100644 --- a/test/runner.rb +++ b/test/runner.rb @@ -22,6 +22,7 @@ ENV["GEM_SKIP"] = ENV["GEM_HOME"] = ENV["GEM_PATH"] = "".freeze require_relative 'lib/profile_test_all' if ENV.has_key?('RUBY_TEST_ALL_PROFILE') require_relative 'lib/tracepointchecker' require_relative 'lib/zombie_hunter' +# require_relative 'lib/iseq_loader_checker' if ENV['COVERAGE'] %w[doclie simplecov-html simplecov].each do |f| |