aboutsummaryrefslogtreecommitdiffstats
path: root/lib/irb/workspace.rb
diff options
context:
space:
mode:
authorJeremy Evans <code@jeremyevans.net>2019-08-24 23:18:23 -0700
committeraycabta <aycabta@gmail.com>2019-08-27 00:10:34 +0900
commit7d9c3a5712b00ebe059a63954674c10d247d1ec3 (patch)
treee4b0308ed944d9370e39de70b774064578d5497f /lib/irb/workspace.rb
parentcaeafbe8252d13624a16acac703e4d04fcb19062 (diff)
downloadruby-7d9c3a5712b00ebe059a63954674c10d247d1ec3.tar.gz
Handle binding.irb for frozen objects and BasicObjects using a delegate
Fixes Ruby Bug 13264
Diffstat (limited to 'lib/irb/workspace.rb')
-rw-r--r--lib/irb/workspace.rb31
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