Newly overridden methods are not called if the old superclass method has 
already been called
--------------------------------------------------------------------------------------------

                 Key: JRUBY-2921
                 URL: http://jira.codehaus.org/browse/JRUBY-2921
             Project: JRuby
          Issue Type: Bug
          Components: Core Classes/Modules
    Affects Versions: JRuby 1.1.3
         Environment: Demonstrated on Windows, with jruby 1.1.3 (ruby 1.8.6 
patchlevel 114) (2008-07-20 rev 7243) [x86-java]
            Reporter: Peter Olsen


A subclass method that overrides a superclass method is inconsistently called. 
In the code sample below, JRuby does not call the subclass's meth1, but does 
call the subclass's meth2. The difference is whether or not the superclass's 
meth1 was previously called by another method (calling_meth1). MRI Ruby always 
calls the subclass's method.

A consequence of this bug is that Mocha 0.9.0 works inconsistently with JRuby. 
Mocha 0.5.6, unlike 0.9.0, undefines the superclass's method, so it works OK. 
But 0.9.0 mocked methods will not be called if the unmocked method has already 
been called, even if that was in a different test case. This means the order in 
which test cases run changes the results of the tests.

{noformat}
def calling_meth1
  MySub.meth1
end

def calling_meth2
  MySub.meth2
end

class MySuper
  def self.meth1
    puts 'MySuper::meth1'
  end
  def self.meth2
    puts 'MySuper::meth2'
  end
end

class MySub < MySuper
end

puts "# of meth1s = #{MySub.methods.select {|m| m == 'meth1'}.size }"
puts "# of meth2s = #{MySub.methods.select {|m| m == 'meth2'}.size }"
puts 'The following lines should call MySuper methods'
MySub::meth1
calling_meth1
MySub::meth2
puts 'Note: calling_meth2 is not called here'

class MySub
  def self.meth1
    puts 'MySub::meth1'
  end
  def self.meth2
    puts 'MySub::meth2'
  end
end

puts "# of meth1s = #{MySub.methods.select {|m| m == 'meth1'}.size }"  # JRuby 
prints 2, but MRI Ruby prints 1
puts "# of meth2s = #{MySub.methods.select {|m| m == 'meth2'}.size }"
puts 'The following lines should call MySub methods'
MySub::meth1
calling_meth1  # JRuby prints MySuper::meth1 here, but MRI Ruby prints 
MySub::meth1
MySub::meth2
calling_meth2
{noformat}

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply via email to