aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-12-07 19:01:29 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-12-07 19:01:29 +0000
commit7476be4defe09d951bdb28b2925be5b461baed5d (patch)
tree01eb15a2aec416b3bb067fbb0b5eaf7748c8d118
parentb401937c627f2aa15c5eb7d6810fd0c049968ecc (diff)
downloadruby-7476be4defe09d951bdb28b2925be5b461baed5d.tar.gz
* 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
-rw-r--r--ChangeLog14
-rw-r--r--test/lib/iseq_loader_checker.rb55
-rw-r--r--test/runner.rb1
3 files changed, 70 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index c44fa1950d..0b2c00d92d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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>
* 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|