diff options
author | Jeremy Evans <code@jeremyevans.net> | 2019-08-24 23:18:23 -0700 |
---|---|---|
committer | aycabta <aycabta@gmail.com> | 2019-08-27 00:10:34 +0900 |
commit | 7d9c3a5712b00ebe059a63954674c10d247d1ec3 (patch) | |
tree | e4b0308ed944d9370e39de70b774064578d5497f /lib/irb | |
parent | caeafbe8252d13624a16acac703e4d04fcb19062 (diff) | |
download | ruby-7d9c3a5712b00ebe059a63954674c10d247d1ec3.tar.gz |
Handle binding.irb for frozen objects and BasicObjects using a delegate
Fixes Ruby Bug 13264
Diffstat (limited to 'lib/irb')
-rw-r--r-- | lib/irb/workspace.rb | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/lib/irb/workspace.rb b/lib/irb/workspace.rb index 595e654f07..54e37c9741 100644 --- a/lib/irb/workspace.rb +++ b/lib/irb/workspace.rb @@ -9,6 +9,9 @@ # # # + +require "delegate" + module IRB # :nodoc: class WorkSpace # Creates a new workspace. @@ -55,11 +58,15 @@ EOF __LINE__ - 3) end end + if main.empty? @main = eval("self", @binding) else @main = main[0] - IRB.conf[:__MAIN__] = @main + end + IRB.conf[:__MAIN__] = @main + + unless main.empty? case @main when Module @binding = eval("IRB.conf[:__MAIN__].module_eval('binding', __FILE__, __LINE__)", @binding, __FILE__, __LINE__) @@ -71,6 +78,28 @@ EOF end end end + + case @main + when Object + use_delegator = @main.frozen? + else + use_delegator = true + end + + if use_delegator + @main = SimpleDelegator.new(@main) + IRB.conf[:__MAIN__] = @main + @main.singleton_class.class_eval do + private + define_method(:exit) do |*a, &b| + # Do nothing, will be overridden + end + define_method(:binding, Kernel.instance_method(:binding)) + define_method(:local_variables, Kernel.instance_method(:local_variables)) + end + @binding = eval("IRB.conf[:__MAIN__].instance_eval('binding', __FILE__, __LINE__)", @binding, *@binding.source_location) + end + @binding.local_variable_set(:_, nil) end |