aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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|