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