Class: IRB::WorkSpace
Relationships & Source Files | |
Inherits: | Object |
Defined in: | lib/irb/workspace.rb, lib/irb/ext/tracer.rb |
Class Method Summary
-
.new(*main) ⇒ WorkSpace
constructor
Internal use only
Creates a new workspace.
Instance Attribute Summary
Instance Method Summary
-
#__evaluate__(context, statements, file = __FILE__, line = __LINE__)
Alias for #evaluate.
- #code_around_binding Internal use only
-
#evaluate(context, statements, file = nil, line = nil)
(also: #__evaluate__)
Internal use only
Evaluate the context of this workspace and use the Tracer library to output the exact lines of code are being executed in chronological order.
-
#filter_backtrace(bt)
Internal use only
error message manipulator.
- #local_variable_get(name) Internal use only
- #local_variable_set(name, value) Internal use only
Constructor Details
.new(*main) ⇒ WorkSpace
This method is for internal use only.
Creates a new workspace.
set self to main if specified, otherwise inherit main from TOPLEVEL_BINDING.
# File 'lib/irb/workspace.rb', line 18
def initialize(*main) if main[0].kind_of?(Binding) @binding = main.shift elsif IRB.conf[:SINGLE_IRB] @binding = TOPLEVEL_BINDING else case IRB.conf[:CONTEXT_MODE] when 0 # binding in proc on TOPLEVEL_BINDING @binding = eval("proc{binding}.call", TOPLEVEL_BINDING, __FILE__, __LINE__) when 1 # binding in loaded file require "tempfile" f = Tempfile.open("irb-binding") f.print <<EOF $binding = binding EOF f.close load f.path @binding = $binding when 2 # binding in loaded file(thread use) unless defined? BINDING_QUEUE IRB.const_set(:BINDING_QUEUE, Thread::SizedQueue.new(1)) Thread.abort_on_exception = true Thread.start do eval "require \"irb/ws-for-case-2\"", TOPLEVEL_BINDING, __FILE__, __LINE__ end Thread.pass end @binding = BINDING_QUEUE.pop when 3 # binding in function on TOPLEVEL_BINDING(default) @binding = eval("def irb_binding; private; binding; end; irb_binding", TOPLEVEL_BINDING, __FILE__, __LINE__ - 3) end end if main.empty? @main = eval("self", @binding) else @main = main[0] IRB.conf[:__MAIN__] = @main case @main when Module @binding = eval("IRB.conf[:__MAIN__].module_eval('binding', __FILE__, __LINE__)", @binding, __FILE__, __LINE__) else begin @binding = eval("IRB.conf[:__MAIN__].instance_eval('binding', __FILE__, __LINE__)", @binding, __FILE__, __LINE__) rescue TypeError IRB.fail CantChangeBinding, @main.inspect end end end @binding.local_variable_set(:_, nil) end
Instance Attribute Details
#binding (readonly)
This method is for internal use only.
The Binding of this workspace
# File 'lib/irb/workspace.rb', line 78
attr_reader :binding
#main (readonly)
This method is for internal use only.
The top-level workspace of this context, also available as IRB.conf[:__MAIN__]
# File 'lib/irb/workspace.rb', line 81
attr_reader :main
Instance Method Details
#__evaluate__(context, statements, file = __FILE__, line = __LINE__)
Alias for #evaluate.
# File 'lib/irb/ext/tracer.rb', line 51
alias __evaluate__ evaluate
#code_around_binding
This method is for internal use only.
[ GitHub ]
# File 'lib/irb/workspace.rb', line 118
def code_around_binding file, pos = @binding.source_location unless defined?(::SCRIPT_LINES__[file]) && lines = ::SCRIPT_LINES__[file] begin lines = File.readlines(file) rescue SystemCallError return end end pos -= 1 start_pos = [pos - 5, 0].max end_pos = [pos + 5, lines.size - 1].min fmt = " %2s %#{end_pos.to_s.length}d: %s" body = (start_pos..end_pos).map do |current_pos| sprintf(fmt, pos == current_pos ? '=>' : '', current_pos + 1, lines[current_pos]) end.join("") "\nFrom: #{file} @ line #{pos + 1} :\n\n#{body}\n" end
#evaluate(context, statements, file = nil, line = nil) Also known as: #__evaluate__
This method is for internal use only.
Evaluate the context of this workspace and use the Tracer library to output the exact lines of code are being executed in chronological order.
See lib/tracer.rb
for more information.
See additional method definition at file lib/irb/workspace.rb line 84.
# File 'lib/irb/ext/tracer.rb', line 56
def evaluate(context, statements, file = __FILE__, line = __LINE__) eval(statements, @binding, file, line) end
#filter_backtrace(bt)
This method is for internal use only.
error message manipulator
# File 'lib/irb/workspace.rb', line 97
def filter_backtrace(bt) case IRB.conf[:CONTEXT_MODE] when 0 return nil if bt =~ /\(irb_local_binding\)/ when 1 if(bt =~ %r!/tmp/irb-binding! or bt =~ %r!irb/.*\.rb! or bt =~ /irb\.rb/) return nil end when 2 return nil if bt =~ /irb\/.*\.rb/ return nil if bt =~ /irb\.rb/ when 3 return nil if bt =~ /irb\/.*\.rb/ return nil if bt =~ /irb\.rb/ bt = bt.sub(/:\s*in `irb_binding'/, '') end bt end
#local_variable_get(name)
This method is for internal use only.
[ GitHub ]
# File 'lib/irb/workspace.rb', line 92
def local_variable_get(name) @binding.local_variable_get(name) end
#local_variable_set(name, value)
This method is for internal use only.
[ GitHub ]
# File 'lib/irb/workspace.rb', line 88
def local_variable_set(name, value) @binding.local_variable_set(name, value) end