From: "zenspider (Ryan Davis)" Date: 2013-01-11T09:37:54+09:00 Subject: [ruby-core:51369] [ruby-trunk - Bug #7564] r38175 introduces incompatibility Issue #7564 has been updated by zenspider (Ryan Davis). =begin This seems highly inconsistent to me. Specifically, MM + RT is the only working solution, but RT implementation is entirely meaningless. It doesn't make sense to me that I need a method table entry that does nothing but super. That should be the same as not existing in the method table. ## # Notes: # # Runtime = Passes Failures # --------------------------------------------------------------------------- # (none) = | 1.8 1.9 2.0 fails #blah (expected) # MM = 1.8 1.9 | 2.0 raises w/ marshal_dump # MM + RT = 1.8 1.9 2.0 | # MM + RTM = 1.8 1.9 | 2.0 raises w/ marshal_dump (doesn't use RTM) # MM + RT + RTM = 1.8 1.9 2.0 | # MM + ARTM = 1.8 | 1.9 SSE, 2.0 raises # MM + RT + ARTM = 1.8 | 1.9 SSE, 2.0 SSE (SystemStackError) # RT = | 1.8 1.9 2.0 fails #blah (expected) # RTM = | 1.8 1.9 2.0 fails #blah (expected) # ARTM = | 1.8 2.0 fails #blah (expected), 1.9 SSE class Sexp < Array def inspect "s(#{map(&:inspect).join ', '})" end def method_missing meth, delete = false x = nil return x if x = find { |o| Sexp === o && o.first == meth } raise "shouldn't be here: #{inspect}.#{meth}" end if ENV["MM"] def respond_to? meth, private = false p :respond_to? => meth if ENV["V"] super end if ENV["RT"] def respond_to_missing? meth, private = false p :respond_to_missing? => meth if ENV["V"] super end if ENV["RTM"] alias respond_to_missing? respond_to? if ENV["ARTM"] end def s *args Sexp.new args end END { puts } p Marshal.load Marshal.dump s(1, 2, 3) p s(1, 2, s(:blah)).blah =end ---------------------------------------- Bug #7564: r38175 introduces incompatibility https://bugs.ruby-lang.org/issues/7564#change-35337 Author: tenderlovemaking (Aaron Patterson) Status: Open Priority: Normal Assignee: mame (Yusuke Endoh) Category: core Target version: 2.0.0 ruby -v: ruby 2.0.0dev (2012-12-15 trunk 38381) [x86_64-darwin12.2.1] r38175 introduces incompatibility with 1.9.3. Before r38175, when looking for _dump, Marshal would not call method_missing. Now marshal calls method_missing when trying to dump. The following example exits with no error on 1.9.3, but on trunk it raises an exception (_dump() must return string (TypeError)): class TR def initialize calls = [] @calls = calls end def method_missing name, *args @calls << [name, args] end end Marshal.dump TR.new I've attached a test case. -- http://bugs.ruby-lang.org/