* 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).




git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52926 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
ko1 2015-12-07 19:01:29 +00:00
Родитель b401937c62
Коммит 7476be4def
3 изменённых файлов: 70 добавлений и 0 удалений

Просмотреть файл

@ -1,3 +1,17 @@
Tue Dec 8 03:56:05 2015 Koichi Sasada <ko1@atdot.net>
* 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 <e@80x24.org> Tue Dec 8 03:45:47 2015 Eric Wong <e@80x24.org>
* doc/extension.rdoc: warn about kwargs performance in C * doc/extension.rdoc: warn about kwargs performance in C

Просмотреть файл

@ -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)

Просмотреть файл

@ -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/profile_test_all' if ENV.has_key?('RUBY_TEST_ALL_PROFILE')
require_relative 'lib/tracepointchecker' require_relative 'lib/tracepointchecker'
require_relative 'lib/zombie_hunter' require_relative 'lib/zombie_hunter'
# require_relative 'lib/iseq_loader_checker'
if ENV['COVERAGE'] if ENV['COVERAGE']
%w[doclie simplecov-html simplecov].each do |f| %w[doclie simplecov-html simplecov].each do |f|