cloned singleton method exists but can't be overwritten #4229

Closed
eprothro opened this Issue Oct 14, 2016 · 2 comments

Projects

None yet

2 participants

@eprothro

Likely the same root cause as #4228

Environment

  • jruby 9.1.5.0 (2.3.1) 2016-09-07 036ce39 Java HotSpot(TM) 64-Bit Server VM 25.72-b15 on 1.8.0_72-b15 +jit [darwin-x86_64]
  • Darwin Evans-2015-MacBook-Pro.local 15.6.0 Darwin Kernel Version 15.6.0: Mon Aug 29 20:21:34 PDT 2016; root:xnu-3248.60.11~1/RELEASE_X86_64 x86_64

Expected Behavior

A singleton method that is cloned and then redefined is overwritten, not overridden.

MRI

class Foo
  def bar
    puts 'class method'
  end
end

object = Foo.new
object.define_singleton_method(:bar) do
  puts 'instance method 1'
  super()
end

cloned = object.clone
cloned.define_singleton_method(:bar) do
  puts 'instance method 2'
  super()
end
cloned.bar
#=> instance method 2
#=> class method

Actual Behavior

class Foo
  def bar
    puts 'class method'
  end
end

object = Foo.new
object.define_singleton_method(:bar) do
  puts 'instance method 1'
  super()
end

cloned = object.clone
cloned.define_singleton_method(:bar) do
  puts 'instance method 2'
  super()
end
cloned.bar
#=> instance method 2
#=> instance method 1
#=> class method
@headius
Member
headius commented Oct 18, 2016

Looks like we're not properly cloning the singleton class...probably using the old one as superclass for the new clone.

@headius
Member
headius commented Oct 18, 2016

I created #4233 to test my changes. Your test case passes and I turned it into a spec for ruby/spec. We'll see how it looks in CI.

@headius headius added this to the JRuby 1.7.27 milestone Oct 18, 2016
@headius headius modified the milestone: JRuby 9.1.6.0, JRuby 1.7.27 Oct 18, 2016
@headius headius closed this in afe5e51 Nov 8, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment