44# by Keiju ISHITSUKA([email protected] ) 55#
66
7- require "delegate"
8-
97require_relative "helper_method"
108
119IRB ::TOPLEVEL_BINDING = binding
@@ -16,7 +14,7 @@ class WorkSpace
1614 # set self to main if specified, otherwise
1715 # inherit main from TOPLEVEL_BINDING.
1816 def initialize ( *main )
19- if main [ 0 ] . kind_of? ( Binding )
17+ if Binding === main [ 0 ]
2018 @binding = main . shift
2119 elsif IRB . conf [ :SINGLE_IRB ]
2220 @binding = TOPLEVEL_BINDING
@@ -70,37 +68,16 @@ def initialize(*main)
7068 unless main . empty?
7169 case @main
7270 when Module
73- @binding = eval ( "IRB.conf[:__MAIN__].module_eval('binding', __FILE__, __LINE__)" , @binding , __FILE__ , __LINE__ )
71+ @binding = eval ( ":: IRB.conf[:__MAIN__].module_eval('::Kernel. binding', __FILE__, __LINE__)" , @binding , __FILE__ , __LINE__ )
7472 else
7573 begin
76- @binding = eval ( "IRB.conf[:__MAIN__].instance_eval('binding', __FILE__, __LINE__)" , @binding , __FILE__ , __LINE__ )
74+ @binding = eval ( ":: IRB.conf[:__MAIN__].instance_eval('::Kernel. binding', __FILE__, __LINE__)" , @binding , __FILE__ , __LINE__ )
7775 rescue TypeError
7876 fail CantChangeBinding , @main . inspect
7977 end
8078 end
8179 end
8280
83- case @main
84- when Object
85- use_delegator = @main . frozen?
86- else
87- use_delegator = true
88- end
89-
90- if use_delegator
91- @main = SimpleDelegator . new ( @main )
92- IRB . conf [ :__MAIN__ ] = @main
93- @main . singleton_class . class_eval do
94- private
95- define_method ( :binding , Kernel . instance_method ( :binding ) )
96- define_method ( :local_variables , Kernel . instance_method ( :local_variables ) )
97- # Define empty method to avoid delegator warning, will be overridden.
98- define_method ( :exit ) { |*a , &b | }
99- define_method ( :exit! ) { |*a , &b | }
100- end
101- @binding = eval ( "IRB.conf[:__MAIN__].instance_eval('binding', __FILE__, __LINE__)" , @binding , *@binding . source_location )
102- end
103-
10481 @binding . local_variable_set ( :_ , nil )
10582 end
10683
@@ -111,6 +88,9 @@ def initialize(*main)
11188 attr_reader :main
11289
11390 def load_helper_methods_to_main
91+ # Do not load helper methods to frozen objects and BasicObject
92+ return unless Object === @main && !@main . frozen?
93+
11494 ancestors = class <<main ; ancestors ; end
11595 main . extend ExtendCommandBundle if !ancestors . include? ( ExtendCommandBundle )
11696 main . extend HelpersContainer if !ancestors . include? ( HelpersContainer )
0 commit comments