1# 2# irb/workspace-binding.rb - 3# $Release Version: 0.9.6$ 4# $Revision: 38612 $ 5# by Keiju ISHITSUKA(keiju@ruby-lang.org) 6# 7# -- 8# 9# 10# 11module IRB # :nodoc: 12 class WorkSpace 13 # Creates a new workspace. 14 # 15 # set self to main if specified, otherwise 16 # inherit main from TOPLEVEL_BINDING. 17 def initialize(*main) 18 if main[0].kind_of?(Binding) 19 @binding = main.shift 20 elsif IRB.conf[:SINGLE_IRB] 21 @binding = TOPLEVEL_BINDING 22 else 23 case IRB.conf[:CONTEXT_MODE] 24 when 0 # binding in proc on TOPLEVEL_BINDING 25 @binding = eval("proc{binding}.call", 26 TOPLEVEL_BINDING, 27 __FILE__, 28 __LINE__) 29 when 1 # binding in loaded file 30 require "tempfile" 31 f = Tempfile.open("irb-binding") 32 f.print <<EOF 33 $binding = binding 34EOF 35 f.close 36 load f.path 37 @binding = $binding 38 39 when 2 # binding in loaded file(thread use) 40 unless defined? BINDING_QUEUE 41 require "thread" 42 43 IRB.const_set(:BINDING_QUEUE, SizedQueue.new(1)) 44 Thread.abort_on_exception = true 45 Thread.start do 46 eval "require \"irb/ws-for-case-2\"", TOPLEVEL_BINDING, __FILE__, __LINE__ 47 end 48 Thread.pass 49 end 50 @binding = BINDING_QUEUE.pop 51 52 when 3 # binging in function on TOPLEVEL_BINDING(default) 53 @binding = eval("def irb_binding; private; binding; end; irb_binding", 54 TOPLEVEL_BINDING, 55 __FILE__, 56 __LINE__ - 3) 57 end 58 end 59 if main.empty? 60 @main = eval("self", @binding) 61 else 62 @main = main[0] 63 IRB.conf[:__MAIN__] = @main 64 case @main 65 when Module 66 @binding = eval("IRB.conf[:__MAIN__].module_eval('binding', __FILE__, __LINE__)", @binding, __FILE__, __LINE__) 67 else 68 begin 69 @binding = eval("IRB.conf[:__MAIN__].instance_eval('binding', __FILE__, __LINE__)", @binding, __FILE__, __LINE__) 70 rescue TypeError 71 IRB.fail CantChangeBinding, @main.inspect 72 end 73 end 74 end 75 eval("_=nil", @binding) 76 end 77 78 # The Binding of this workspace 79 attr_reader :binding 80 # The top-level workspace of this context, also available as 81 # <code>IRB.conf[:__MAIN__]</code> 82 attr_reader :main 83 84 # Evaluate the given +statements+ within the context of this workspace. 85 def evaluate(context, statements, file = __FILE__, line = __LINE__) 86 eval(statements, @binding, file, line) 87 end 88 89 # error message manipulator 90 def filter_backtrace(bt) 91 case IRB.conf[:CONTEXT_MODE] 92 when 0 93 return nil if bt =~ /\(irb_local_binding\)/ 94 when 1 95 if(bt =~ %r!/tmp/irb-binding! or 96 bt =~ %r!irb/.*\.rb! or 97 bt =~ /irb\.rb/) 98 return nil 99 end 100 when 2 101 return nil if bt =~ /irb\/.*\.rb/ 102 return nil if bt =~ /irb\.rb/ 103 when 3 104 return nil if bt =~ /irb\/.*\.rb/ 105 return nil if bt =~ /irb\.rb/ 106 bt = bt.sub(/:\s*in `irb_binding'/, '') 107 end 108 bt 109 end 110 111 def IRB.delete_caller 112 end 113 end 114end 115