diff --git a/lib/irb/helper_method/base.rb b/lib/irb/helper_method/base.rb index dc74b046da..a68001ed28 100644 --- a/lib/irb/helper_method/base.rb +++ b/lib/irb/helper_method/base.rb @@ -1,6 +1,10 @@ +require "singleton" + module IRB module HelperMethod class Base + include Singleton + class << self def description(description = nil) @description = description if description diff --git a/lib/irb/workspace.rb b/lib/irb/workspace.rb index dd92d99014..d24d1cc38d 100644 --- a/lib/irb/workspace.rb +++ b/lib/irb/workspace.rb @@ -179,7 +179,7 @@ EOF def self.install_helper_methods HelperMethod.helper_methods.each do |name, helper_method_class| define_method name do |*args, **opts, &block| - helper_method_class.new.execute(*args, **opts, &block) + helper_method_class.instance.execute(*args, **opts, &block) end unless method_defined?(name) end end diff --git a/test/irb/test_helper_method.rb b/test/irb/test_helper_method.rb index 5174e5ceb2..291278c16a 100644 --- a/test/irb/test_helper_method.rb +++ b/test/irb/test_helper_method.rb @@ -97,13 +97,38 @@ module TestIRB RUBY output = run_ruby_file do - type <<~INPUT - my_helper - INPUT + type "my_helper" type "exit" end assert_include(output, 'Hello from MyHelper') end + + def test_helper_method_instances_are_memoized + write_ruby <<~RUBY + require "irb/helper_method" + + class MyHelper < IRB::HelperMethod::Base + description "This is a test helper" + + def execute(val) + @val ||= val + end + end + + IRB::HelperMethod.register(:my_helper, MyHelper) + + binding.irb + RUBY + + output = run_ruby_file do + type "my_helper(100)" + type "my_helper(200)" + type "exit" + end + + assert_include(output, '=> 100') + assert_not_include(output, '=> 200') + end end end