git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2627 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
keiju 2002-07-09 11:17:17 +00:00
Родитель 93602810e9
Коммит af064b04b1
36 изменённых файлов: 1286 добавлений и 497 удалений

Просмотреть файл

@ -1,3 +1,7 @@
Tue Jul 9 20:03:55 2002 Keiju Ishitsuka <keiju@ishitsuka.com>
* irb 0.9
Fri Jul 5 08:59:15 2002 Michal Rokos <michal@ruby-lang.org>
* enum.c: Fix bug in enum_sort_by and some code indents

Просмотреть файл

@ -1,6 +1,6 @@
#
# irb.rb - irb main module
# $Release Version: 0.7.4 $
# $Release Version: 0.9 $
# $Revision$
# $Date$
# by Keiju ISHITSUKA(keiju@ishitsuka.com)
@ -14,7 +14,7 @@ require "e2mmap"
require "irb/init"
require "irb/context"
require "irb/extend-command"
require "irb/workspace"
#require "irb/workspace"
require "irb/ruby-lex"
require "irb/input-method"
@ -43,13 +43,15 @@ module IRB
@CONF[:VERSION] = format("irb %s(%s)", rv, @LAST_UPDATE_DATE)
end
def IRB.CurrentContext
IRB.conf[:MAIN_CONTEXT]
end
# initialize IRB and start TOP_LEVEL irb
def IRB.start(ap_path = nil)
$0 = File::basename(ap_path, ".rb") if ap_path
IRB.initialize(ap_path)
IRB.parse_opts
IRB.load_modules
if @CONF[:SCRIPT]
irb = Irb.new(nil, @CONF[:SCRIPT])
@ -67,7 +69,7 @@ module IRB
catch(:IRB_EXIT) do
irb.eval_input
end
print "\n"
# print "\n"
end
def IRB.irb_exit(irb, ret)
@ -88,7 +90,7 @@ module IRB
class Irb
def initialize(workspace = nil, input_method = nil)
@context = Context.new(self, workspace, input_method)
@context.main.extend ExtendCommand
@context.main.extend ExtendCommandBundle
@signal_status = :IN_IRB
@scanner = RubyLex.new
@ -98,9 +100,36 @@ module IRB
attr_accessor :scanner
def eval_input
@scanner.set_prompt do
|ltype, indent, continue, line_no|
if ltype
f = @context.prompt_s
elsif continue
f = @context.prompt_c
else @context.prompt_i
f = @context.prompt_i
end
f = "" unless f
if @context.prompting?
@context.io.prompt = p = prompt(f, ltype, indent, line_no)
else
@context.io.prompt = p = ""
end
if @context.auto_indent_mode
unless ltype
ind = prompt(@context.prompt_i, ltype, indent, line_no).size +
indent * 2 - p.size
ind += 2 if continue
@context.io.prompt = p + " " * ind if ind > 0
end
end
end
@scanner.set_input(@context.io) do
signal_status(:IN_INPUT) do
unless l = @context.io.gets
if l = @context.io.gets
print l if @context.verbose?
else
if @context.ignore_eof? and @context.io.readable_atfer_eof?
l = "\n"
if @context.verbose?
@ -112,43 +141,12 @@ module IRB
end
end
@scanner.set_prompt do
|ltype, indent, continue, line_no|
if ltype
f = @context.prompt_s
elsif continue
f = @context.prompt_c
else @context.prompt_i
f = @context.prompt_i
end
f = "" unless f
@context.io.prompt = p = prompt(f, ltype, indent, line_no)
if @context.auto_indent_mode
unless ltype
ind = prompt(@context.prompt_i, ltype, indent, line_no).size +
indent * 2 - p.size
ind += 2 if continue
@context.io.prompt = p + " " * ind if ind > 0
end
end
end
@scanner.each_top_level_statement do
|line, line_no|
signal_status(:IN_EVAL) do
begin
trace_in do
@context._ = @context.workspace.evaluate(line,
@context.irb_path,
line_no)
# @context._ = irb_eval(line, @context.bind, @context.irb_path, line_no)
end
if @context.inspect?
printf @context.return_format, @context._.inspect
else
printf @context.return_format, @context._
end
@context.evaluate(line, line_no)
output_value if @context.echo?
rescue StandardError, ScriptError, Abort
$! = RuntimeError.new("unknown exception raised") unless $!
print $!.type, ": ", $!, "\n"
@ -186,19 +184,44 @@ module IRB
end
end
# def irb_eval(line, bind, path, line_no)
# id, str = catch(:IRB_TOPLEVEL_EVAL){
# return eval(line, bind, path, line_no)
# }
# case id
# when :EVAL_TOPLEVEL
# eval(str, bind, "(irb_internal)", 1)
# when :EVAL_CONTEXT
# @context.instance_eval(str)
# else
# IRB.fail IllegalParameter
# end
# end
def suspend_name(path = nil, name = nil)
@context.irb_path, back_path = path, @context.irb_path if path
@context.irb_name, back_name = name, @context.irb_name if name
begin
yield back_path, back_name
ensure
@context.irb_path = back_path if path
@context.irb_name = back_name if name
end
end
def suspend_workspace(workspace)
@context.workspace, back_workspace = workspace, @context.workspace
begin
yield back_workspace
ensure
@context.workspace = back_workspace
end
end
def suspend_input_method(input_method)
back_io = @context.io
@context.instance_eval{@io = input_method}
begin
yield back_io
ensure
@context.instance_eval{@io = back_io}
end
end
def suspend_context(context)
@context, back_context = context, @context
begin
yield back_context
ensure
@context = back_context
end
end
def signal_handle
unless @context.ignore_sigint?
@ -233,15 +256,6 @@ module IRB
end
end
def trace_in
Tracer.on if @context.use_tracer?
begin
yield
ensure
Tracer.off if @context.use_tracer?
end
end
def prompt(prompt, ltype, indent, line_no)
p = prompt.dup
p.gsub!(/%([0-9]+)?([a-zA-Z])/) do
@ -273,6 +287,14 @@ module IRB
p
end
def output_value
if @context.inspect?
printf @context.return_format, @context.last_value.inspect
else
printf @context.return_format, @context.last_value
end
end
def inspect
ary = []
for iv in instance_variables
@ -296,8 +318,8 @@ module IRB
array = []
for k, v in sort{|a1, a2| a1[0].id2name <=> a2[0].id2name}
case k
when :MAIN_CONTEXT
next
when :MAIN_CONTEXT, :__TMP__EHV__
array.push format("CONF[:%s]=...myself...", k.id2name)
when :PROMPT
s = v.collect{
|kk, vv|

33
lib/irb/cmd/chws.rb Normal file
Просмотреть файл

@ -0,0 +1,33 @@
#
# change-ws.rb -
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(Nihon Rational Software Co.,Ltd)
#
# --
#
#
#
require "irb/cmd/nop.rb"
require "irb/ext/change-ws.rb"
module IRB
module ExtendCommand
class CurrentWorkingWorkspace<Nop
def execute(*obj)
irb_context.main
end
end
class ChangeWorkspace<Nop
def execute(*obj)
irb_context.change_workspace(*obj)
irb_context.main
end
end
end
end

25
lib/irb/cmd/fork.rb Normal file
Просмотреть файл

@ -0,0 +1,25 @@
module IRB
module ExtendCommand
class Fork<Nop
def execute(&block)
pid = send ExtendCommand.irb_original_method_name("fork")
unless pid
class<<self
alias_method :exit, ExtendCommand.irb_original_method_name('exit')
end
if iterator?
begin
yield
ensure
exit
end
end
end
pid
end
end
end
end

67
lib/irb/cmd/load.rb Normal file
Просмотреть файл

@ -0,0 +1,67 @@
#
# load.rb -
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(Nihon Rational Software Co.,Ltd)
#
# --
#
#
#
require "irb/cmd/nop.rb"
require "irb/ext/loader"
module IRB
module ExtendCommand
class Load<Nop
include IrbLoader
def execute(file_name, priv = nil)
# return ruby_load(file_name) unless IRB.conf[:USE_LOADER]
return irb_load(file_name, priv)
end
end
class Require<Nop
include IrbLoader
def execute(file_name)
# return ruby_require(file_name) unless IRB.conf[:USE_LOADER]
rex = Regexp.new("#{Regexp.quote(file_name)}(\.o|\.rb)?")
return false if $".find{|f| f =~ rex}
case file_name
when /\.rb$/
begin
if irb_load(file_name)
$".push file_name
return true
end
rescue LoadError
end
when /\.(so|o|sl)$/
return ruby_require(file_name)
end
begin
irb_load(f = file_name + ".rb")
$".push f
return true
rescue LoadError
return ruby_require(file_name)
end
end
end
class Source<Nop
include IrbLoader
def execute(file_name)
source_file(file_name)
end
end
end
end

39
lib/irb/cmd/nop.rb Normal file
Просмотреть файл

@ -0,0 +1,39 @@
#
# nop.rb -
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(Nihon Rational Software Co.,Ltd)
#
# --
#
#
#
module IRB
module ExtendCommand
class Nop
@RCS_ID='-$Id$-'
def self.execute(conf, *opts)
command = new(conf)
command.execute(*opts)
end
def initialize(conf)
@irb_context = conf
end
attr_reader :irb_context
def irb
@irb_context.irb
end
def execute(*opts)
#nop
end
end
end
end

39
lib/irb/cmd/pushws.rb Normal file
Просмотреть файл

@ -0,0 +1,39 @@
#
# change-ws.rb -
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(Nihon Rational Software Co.,Ltd)
#
# --
#
#
#
require "irb/cmd/nop.rb"
require "irb/ext/workspaces.rb"
module IRB
module ExtendCommand
class Workspaces<Nop
def execute(*obj)
irb_context.workspaces.collect{|ws| ws.main}
end
end
class PushWorkspace<Workspaces
def execute(*obj)
irb_context.push_workspace(*obj)
super
end
end
class PopWorkspace<Workspaces
def execute(*obj)
irb_context.pop_workspace(*obj)
super
end
end
end
end

43
lib/irb/cmd/subirb.rb Normal file
Просмотреть файл

@ -0,0 +1,43 @@
#!/usr/local/bin/ruby
#
# multi.rb -
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(Nihon Rational Software Co.,Ltd)
#
# --
#
#
#
require "irb/cmd/nop.rb"
require "irb/ext/multi-irb"
module IRB
module ExtendCommand
class IrbCommand<Nop
def execute(*obj)
IRB.irb(nil, *obj)
end
end
class Jobs<Nop
def execute
IRB.JobManager
end
end
class Foreground<Nop
def execute(key)
IRB.JobManager.switch(key)
end
end
class Kill<Nop
def execute(*keys)
IRB.JobManager.kill(*keys)
end
end
end
end

Просмотреть файл

@ -1,6 +1,6 @@
#
# irb/completor.rb -
# $Release Version: 0.7.1$
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(keiju@ishitsuka.com)
@ -36,6 +36,9 @@ module IRB
CompletionProc = proc { |input|
bind = IRB.conf[:MAIN_CONTEXT].workspace.binding
# puts "input: #{input}"
case input
when /^(\/[^\/]*\/)\.([^.]*)$/
# Regexp
@ -61,11 +64,11 @@ module IRB
candidates = Proc.instance_methods(true) | Hash.instance_methods(true)
select_message(receiver, message, candidates)
when /^(:[^:]*)$/
when /^(:[^:.]*)$/
# Symbol
if Symbol.respond_to?(:all_symbols)
sym = $1
candidates = Symbol.all_symbols.collect{|s| s.id2name}
candidates = Symbol.all_symbols.collect{|s| ":" + s.id2name}
candidates.grep(/^#{sym}/)
else
[]
@ -88,7 +91,7 @@ module IRB
end
candidates.grep(/^#{message}/).collect{|e| receiver + "::" + e}
when /^(:[^.]+)\.([^.]*)$/
when /^(:[^:.]+)\.([^.]*)$/
# Symbol
receiver = $1
message = Regexp.quote($2)
@ -108,6 +111,9 @@ module IRB
end
select_message(receiver, message, candidates)
when /^(\$[^.]*)$/
candidates = global_variables.grep Regexp.new(Regexp.quote($1))
# when /^(\$?(\.?[^.]+)+)\.([^.]*)$/
when /^((\.?[^.]+)+)\.([^.]*)$/
# variable
@ -132,7 +138,8 @@ module IRB
# func1.func2
candidates = []
ObjectSpace.each_object(Module){|m|
next if /^(IRB|SLex|RubyLex|RubyToken)/ =~ m.name
next if m.name != "IRB::Context" and
/^(IRB|SLex|RubyLex|RubyToken)/ =~ m.name
candidates.concat m.instance_methods
}
candidates.sort!
@ -174,4 +181,8 @@ module IRB
end
end
if Readline.respond_to?("basic_word_break_characters=")
Readline.basic_word_break_characters= "\t\n\"\\'`><=;|&{("
end
Readline.completion_append_character = nil
Readline.completion_proc = IRB::InputCompletor::CompletionProc

Просмотреть файл

@ -1,6 +1,6 @@
#
# irb/context.rb - irb context
# $Release Version: 0.7.3$
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(keiju@ishitsuka.com)
@ -9,6 +9,8 @@
#
#
#
require "irb/workspace"
module IRB
class Context
#
@ -22,33 +24,30 @@ module IRB
if workspace
@workspace = workspace
else
@workspace = WorkSpace.new unless workspace
@workspace = WorkSpace.new
end
@thread = Thread.current if defined? Thread
@irb_level = 0
# @irb_level = 0
# copy of default configuration
@ap_name = IRB.conf[:AP_NAME]
@rc = IRB.conf[:RC]
@load_modules = IRB.conf[:LOAD_MODULES]
self.math_mode = IRB.conf[:MATH_MODE]
@use_readline = IRB.conf[:USE_READLINE]
@inspect_mode = IRB.conf[:INSPECT_MODE]
self.use_tracer = IRB.conf[:USE_TRACER]
# @use_loader = IRB.conf[:USE_LOADER]
self.prompt_mode = IRB.conf[:PROMPT_MODE]
self.math_mode = IRB.conf[:MATH_MODE] if IRB.conf[:MATH_MODE]
self.use_tracer = IRB.conf[:USE_TRACER] if IRB.conf[:USE_TRASER]
self.use_loader = IRB.conf[:USE_LOADER] if IRB.conf[:USE_LOADER]
self.eval_history = IRB.conf[:EVAL_HISTORY] if IRB.conf[:EVEL_HISTORY]
@ignore_sigint = IRB.conf[:IGNORE_SIGINT]
@ignore_eof = IRB.conf[:IGNORE_EOF]
@back_trace_limit = IRB.conf[:BACK_TRACE_LIMIT]
debug_level = IRB.conf[:DEBUG_LEVEL]
@verbose = IRB.conf[:VERBOSE]
@tracer_initialized = false
self.prompt_mode = IRB.conf[:PROMPT_MODE]
if IRB.conf[:SINGLE_IRB] or !defined?(JobManager)
@irb_name = IRB.conf[:IRB_NAME]
@ -59,7 +58,7 @@ module IRB
case input_method
when nil
if (use_readline.nil? && IRB.conf[:PROMPT_MODE] != :INF_RUBY ||
if (use_readline.nil? && IRB.conf[:PROMPT_MODE] != :INF_RUBY && STDIN.tty? ||
use_readline?)
@io = ReadlineInputMethod.new
else
@ -72,18 +71,24 @@ module IRB
else
@io = input_method
end
@verbose = IRB.conf[:VERBOSE]
@echo = IRB.conf[:ECHO]
if @echo.nil?
@echo = true
end
@debug_level = IRB.conf[:DEBUG_LEVEL]
end
def main
@workspace.main
end
attr_reader :workspace_home
attr_accessor :workspace
attr_reader :thread
attr_accessor :io
attr_reader :_
attr_accessor :irb
attr_accessor :ap_name
attr_accessor :rc
@ -91,14 +96,8 @@ module IRB
attr_accessor :irb_name
attr_accessor :irb_path
attr_accessor :math_mode
attr_accessor :use_readline
attr_reader :inspect_mode
attr_reader :use_tracer
# attr :use_loader
attr_reader :debug_level
attr_accessor :verbose
attr_reader :prompt_mode
attr_accessor :prompt_i
@ -109,33 +108,43 @@ module IRB
attr_accessor :ignore_sigint
attr_accessor :ignore_eof
attr_accessor :echo
attr_accessor :verbose
attr_reader :debug_level
attr_accessor :back_trace_limit
# alias use_loader? use_loader
alias use_tracer? use_tracer
alias use_readline? use_readline
alias rc? rc
alias math? math_mode
alias verbose? verbose
alias ignore_sigint? ignore_sigint
alias ignore_eof? ignore_eof
alias echo? echo
def _=(value)
@_ = value
@workspace.evaluate "_ = IRB.conf[:MAIN_CONTEXT]._"
end
def irb_name
if @irb_level == 0
@irb_name
elsif @irb_name =~ /#[0-9]*$/
@irb_name + "." + @irb_level.to_s
else
@irb_name + "#0." + @irb_level.to_s
def verbose?
if @verbose.nil?
if defined?(ReadlineInputMethod) && @io.kind_of?(ReadlineInputMethod)
false
elsif !STDIN.tty? or @io.kind_of?(FileInputMethod)
true
else
false
end
end
end
def prompting?
verbose? || (STDIN.tty? && @io.kind_of?(StdioInputMethod) ||
(defined?(ReadlineInputMethod) && @io.kind_of?(ReadlineInputMethod)))
end
attr_reader :last_value
def set_last_value(value)
@last_value = value
end
attr_reader :irb_name
def prompt_mode=(mode)
@prompt_mode = mode
pconf = IRB.conf[:PROMPT][mode]
@ -151,42 +160,13 @@ module IRB
end
def inspect?
@inspect_mode.nil? && !@math_mode or @inspect_mode
@inspect_mode.nil? or @inspect_mode
end
def file_input?
@io.type == FileInputMethod
end
def use_tracer=(opt)
if opt
IRB.initialize_tracer
unless @tracer_initialized
Tracer.set_get_line_procs(@irb_path) {
|line_no|
@io.line(line_no)
}
@tracer_initialized = true
end
elsif !opt && @use_tracer
Tracer.off
end
@use_tracer=opt
end
def use_loader
IRB.conf[:USE_LOADER]
end
def use_loader=(opt)
IRB.conf[:USE_LOADER] = opt
if opt
IRB.initialize_loader
end
print "Switch to load/require#{unless use_loader; ' non';end} trace mode.\n" if verbose?
opt
end
def inspect_mode=(opt)
if opt
@inspect_mode = opt
@ -197,20 +177,6 @@ module IRB
@inspect_mode
end
def math_mode=(opt)
if @math_mode == true && opt == false
IRB.fail CantRetuenNormalMode
return
end
@math_mode = opt
if math_mode
IRB.initialize_mathn
main.instance_eval("include Math")
print "start math mode\n" if verbose?
end
end
def use_readline=(opt)
@use_readline = opt
print "use readline module\n" if @use_readline
@ -226,41 +192,19 @@ module IRB
@debug_level > 0
end
def change_binding(*_main)
back = @workspace
@workspace = WorkSpace.new(*_main)
unless _main.empty?
begin
main.extend ExtendCommand
rescue
print "can't change binding to: ", main.inspect, "\n"
@workspace = back
return nil
end
end
@irb_level += 1
begin
catch(:SU_EXIT) do
@irb.eval_input
end
ensure
@irb_level -= 1
@workspace = back
end
def evaluate(line, line_no)
@line_no = line_no
set_last_value(@workspace.evaluate(self, line, irb_path, line_no))
# @workspace.evaluate("_ = IRB.conf[:MAIN_CONTEXT]._")
# @_ = @workspace.evaluate(line, irb_path, line_no)
end
alias change_workspace change_binding
alias __exit__ exit
def exit(ret = 0)
if @irb_level == 0
IRB.irb_exit(@irb, ret)
else
throw :SU_EXIT, ret
end
IRB.irb_exit(@irb, ret)
end
NOPRINTING_IVARS = ["@_"]
NOPRINTING_IVARS = ["@last_value"]
NO_INSPECTING_IVARS = ["@irb", "@io"]
IDNAME_IVARS = ["@prompt_mode"]
@ -272,7 +216,7 @@ module IRB
val = instance_eval(ivar)
case ivar
when *NOPRINTING_IVARS
next
array.push format("conf.%s=%s", name, "...")
when *NO_INSPECTING_IVARS
array.push format("conf.%s=%s", name, val.to_s)
when *IDNAME_IVARS

62
lib/irb/ext/change-ws.rb Normal file
Просмотреть файл

@ -0,0 +1,62 @@
#
# irb/ext/cb.rb -
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(Nihon Rational Software Co.,Ltd)
#
# --
#
#
#
module IRB
class Context
def home_workspace
if defined? @home_workspace
@home_workspace
else
@home_workspace = @workspace
end
end
def change_workspace(*_main)
if _main.empty?
@workspace = home_workspace
return main
end
@workspace = WorkSpace.new(_main[0])
if !(class<<main;ancestors;end).include?(ExtendCommandBundle)
main.extend ExtendCommandBundle
end
end
# def change_binding(*_main)
# back = @workspace
# @workspace = WorkSpace.new(*_main)
# unless _main.empty?
# begin
# main.extend ExtendCommandBundle
# rescue
# print "can't change binding to: ", main.inspect, "\n"
# @workspace = back
# return nil
# end
# end
# @irb_level += 1
# begin
# catch(:SU_EXIT) do
# @irb.eval_input
# end
# ensure
# @irb_level -= 1
# @workspace = back
# end
# end
# alias change_workspace change_binding
end
end

110
lib/irb/ext/history.rb Normal file
Просмотреть файл

@ -0,0 +1,110 @@
#
# history.rb -
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(Nihon Rational Software Co.,Ltd)
#
# --
#
#
#
module IRB
class Context
NOPRINTING_IVARS.push "@eval_history_values"
alias _set_last_value set_last_value
def set_last_value(value)
_set_last_value(value)
@workspace.evaluate self, "_ = IRB.CurrentContext.last_value"
if @eval_history #and !@eval_history_values.equal?(llv)
@eval_history_values.push @line_no, @last_value
@workspace.evaluate self, "__ = IRB.CurrentContext.instance_eval{@eval_history_values}"
end
@last_value
end
attr_reader :eval_history
def eval_history=(no)
if no
if @eval_history
@eval_history_values.size(no)
else
@eval_history_values = History.new(no)
IRB.conf[:__TMP__EHV__] = @eval_history_values
@workspace.evaluate(self, "__ = IRB.conf[:__TMP__EHV__]")
IRB.conf.delete(:__TMP_EHV__)
end
else
@eval_history_values = nil
end
@eval_history = no
end
end
class History
@RCS_ID='-$Id$-'
def initialize(size = 16)
@size = size
@contents = []
end
def size(size)
if size != 0 && size < @size
@contents = @contents[@size - size .. @size]
end
@size = size
end
def [](idx)
begin
if idx >= 0
@contents.find{|no, val| no == idx}[1]
else
@contents[idx][1]
end
rescue NameError
nil
end
end
def push(no, val)
@contents.push [no, val]
@contents.shift if @size != 0 && @contents.size > @size
end
alias real_inspect inspect
def inspect
if @contents.empty?
return real_inspect
end
unless (last = @contents.pop)[1].equal?(self)
@contents.push last
last = nil
end
str = @contents.collect{|no, val|
if val.equal?(self)
"#{no} ...self-history..."
else
"#{no} #{val.inspect}"
end
}.join("\n")
if str == ""
str = "Empty."
end
@contents.push last if last
str
end
end
end

106
lib/irb/ext/loader.rb Normal file
Просмотреть файл

@ -0,0 +1,106 @@
module IRB
class LoadAbort < Exception;end
module IrbLoader
@RCS_ID='-$Id$-'
alias ruby_load load
alias ruby_require require
def irb_load(fn, priv = nil)
path = search_file_from_ruby_path(fn)
raise LoadError, "No such file to load -- #{fn}" unless path
load_file(path, priv)
end
def search_file_from_ruby_path(fn)
if /^#{Regexp.quote(File::Separator)}/ =~ fn
return fn if File.exist?(fn)
return nil
end
for path in $:
if File.exist?(f = File.join(path, fn))
return f
end
end
return nil
end
def source_file(path)
irb.suspend_name(path, File.basename(path)) do
irb.suspend_input_method(FileInputMethod.new(path)) do
|back_io|
irb.signal_status(:IN_LOAD) do
if back_io.kind_of?(FileInputMethod)
irb.eval_input
else
begin
irb.eval_input
rescue LoadAbort
print "load abort!!\n"
end
end
end
end
end
end
def load_file(path, priv = nil)
irb.suspend_name(path, File.basename(path)) do
if priv
ws = WorkSpace.new(Module.new)
else
ws = WorkSpace.new
end
irb.suspend_workspace(ws) do
irb.suspend_input_method(FileInputMethod.new(path)) do
|back_io|
irb.signal_status(:IN_LOAD) do
# p irb.conf
if back_io.kind_of?(FileInputMethod)
irb.eval_input
else
begin
irb.eval_input
rescue LoadAbort
print "load abort!!\n"
end
end
end
end
end
end
end
def old
back_io = @io
back_path = @irb_path
back_name = @irb_name
back_scanner = @irb.scanner
begin
@io = FileInputMethod.new(path)
@irb_name = File.basename(path)
@irb_path = path
@irb.signal_status(:IN_LOAD) do
if back_io.kind_of?(FileInputMethod)
@irb.eval_input
else
begin
@irb.eval_input
rescue LoadAbort
print "load abort!!\n"
end
end
end
ensure
@io = back_io
@irb_name = back_name
@irb_path = back_path
@irb.scanner = back_scanner
end
end
end
end

37
lib/irb/ext/math-mode.rb Normal file
Просмотреть файл

@ -0,0 +1,37 @@
#
# math-mode.rb -
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(Nihon Rational Software Co.,Ltd)
#
# --
#
#
#
require "mathn"
module IRB
class Context
attr_reader :math_mode
alias math? math_mode
def math_mode=(opt)
if @math_mode == true && opt == false
IRB.fail CantRetuenNormalMode
return
end
@math_mode = opt
if math_mode
main.extend Math
print "start math mode\n" if verbose?
end
end
def inspect?
@inspect_mode.nil? && !@math_mode or @inspect_mode
end
end
end

Просмотреть файл

@ -1,6 +1,6 @@
#
# irb/multi-irb.rb - multiple irb module
# $Release Version: 0.7.3$
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(keiju@ishitsuka.com)
@ -140,6 +140,10 @@ module IRB
@JobManager
end
def IRB.CurrentContext
IRB.JobManager.irb(Thread.current).context
end
# invoke multi-irb
def IRB.irb(file = nil, *main)
workspace = WorkSpace.new(*main)
@ -183,19 +187,24 @@ module IRB
@JobManager.current_job = @JobManager.irb(Thread.current)
end
class Context
def _=(value)
@_ = value
@workspace.evaluate "_ = IRB.JobManager.irb(Thread.current).context._"
end
end
# class Context
# def set_last_value(value)
# @last_value = value
# @workspace.evaluate "_ = IRB.JobManager.irb(Thread.current).context.last_value"
# if @eval_history #and !@__.equal?(@last_value)
# @eval_history_values.push @line_no, @last_value
# @workspace.evaluate "__ = IRB.JobManager.irb(Thread.current).context.instance_eval{@eval_history_values}"
# end
# @last_value
# end
# end
module ExtendCommand
def irb_context
IRB.JobManager.irb(Thread.current).context
end
# alias conf irb_context
end
# module ExtendCommand
# def irb_context
# IRB.JobManager.irb(Thread.current).context
# end
# # alias conf irb_context
# end
@CONF[:SINGLE_IRB_MODE] = false
@JobManager.insert(@CONF[:MAIN_CONTEXT].irb)
@ -219,7 +228,7 @@ module IRB
when :IN_IRB
# ignore
else
# ignore
# ignore other cases as well
end
end
end

61
lib/irb/ext/tracer.rb Normal file
Просмотреть файл

@ -0,0 +1,61 @@
#
# irb/lib/tracer.rb -
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(Nihon Rational Software Co.,Ltd)
#
# --
#
#
#
require "tracer"
module IRB
# initialize tracing function
def IRB.initialize_tracer
Tracer.verbose = false
Tracer.add_filter {
|event, file, line, id, binding, *rests|
/^#{Regexp.quote(@CONF[:IRB_LIB_PATH])}/ !~ file and
File::basename(file) != "irb.rb"
}
end
class Context
attr_reader :use_tracer
alias use_tracer? use_tracer
def use_tracer=(opt)
if opt
Tracer.set_get_line_procs(@irb_path) {
|line_no, *rests|
@io.line(line_no)
}
elsif !opt && @use_tracer
Tracer.off
end
@use_tracer=opt
end
end
class WorkSpace
alias __evaluate__ evaluate
def evaluate(context, statements, file = nil, line = nil)
if context.use_tracer? && file != nil && line != nil
Tracer.on
begin
__evaluate__(context, statements, file, line)
ensure
Tracer.off
end
else
__evaluate__(context, statements, file || __FILE__, line || __LINE__)
end
end
end
IRB.initialize_tracer
end

65
lib/irb/ext/use-loader.rb Normal file
Просмотреть файл

@ -0,0 +1,65 @@
#
# use-loader.rb -
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(Nihon Rational Software Co.,Ltd)
#
# --
#
#
#
require "irb/cmd/load"
require "irb/ext/loader"
class Object
alias __original__load__IRB_use_loader__ load
alias __original__require__IRB_use_loader__ require
end
module IRB
module ExtendCommandBundle
def irb_load(*opts, &b)
ExtendCommand::Load.execute(irb_context, *opts, &b)
end
def irb_require(*opts, &b)
ExtendCommand::Require.execute(irb_context, *opts, &b)
end
end
class Context
IRB.conf[:USE_LOADER] = false
def use_loader
IRB.conf[:USE_LOADER]
end
alias use_loader? use_loader
def use_loader=(opt)
if IRB.conf[:USE_LOADER] != opt
IRB.conf[:USE_LOADER] = opt
if opt
if !$".include?("irb/cmd/load")
end
(class<<@workspace.main;self;end).instance_eval {
alias_method :load, :irb_load
alias_method :require, :irb_require
}
else
(class<<@workspace.main;self;end).instance_eval {
alias_method :load, :__original__load__IRB_use_loader__
alias_method :require, :__original__require__IRB_use_loader__
}
end
end
print "Switch to load/require#{unless use_loader; ' non';end} trace mode.\n" if verbose?
opt
end
end
end

56
lib/irb/ext/workspaces.rb Normal file
Просмотреть файл

@ -0,0 +1,56 @@
#
# push-ws.rb -
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(Nihon Rational Software Co.,Ltd)
#
# --
#
#
#
module IRB
class Context
def irb_level
workspace_stack.size
end
def workspaces
if defined? @workspaces
@workspaces
else
@workspaces = []
end
end
def push_workspace(*_main)
if _main.empty?
if workspaces.empty?
print "No other workspace\n"
return nil
end
ws = workspaces.pop
workspaces.push @workspace
@workspace = ws
return workspaces
end
workspaces.push @workspace
@workspace = WorkSpace.new(@workspace.binding, _main[0])
if !(class<<main;ancestors;end).include?(ExtendCommandBundle)
main.extend ExtendCommandBundle
end
end
def pop_workspace
if workspaces.empty?
print "workspace stack empty\n"
return
end
@workspace = workspaces.pop
end
end
end

Просмотреть файл

@ -1,6 +1,6 @@
#
# irb/extend-command.rb - irb command extend
# $Release Version: 0.7.3$
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(keiju@ishitsuka.com)
@ -13,104 +13,149 @@ module IRB
#
# IRB extended command
#
module ExtendCommand
# include Loader
def irb_exit(ret = 0)
irb_context.exit(ret)
end
alias irb_quit irb_exit
module ExtendCommandBundle
EXCB = ExtendCommandBundle
def irb_fork(&block)
pid = send ExtendCommand.irb_original_method_name("fork")
unless pid
class<<self
alias_method :exit, ExtendCommand.irb_original_method_name('exit')
end
if iterator?
begin
yield
ensure
exit
end
end
end
pid
end
def irb_change_binding(*main)
irb_context.change_binding(*main)
end
alias irb_change_workspace irb_change_binding
def irb_source(file)
irb_context.source(file)
end
def irb(*obj)
require "irb/multi-irb"
IRB.irb(nil, *obj)
end
def irb_context
IRB.conf[:MAIN_CONTEXT]
end
def irb_jobs
require "irb/multi-irb"
IRB.JobManager
end
def irb_fg(key)
require "irb/multi-irb"
IRB.JobManager.switch(key)
end
def irb_kill(*keys)
require "irb/multi-irb"
IRB.JobManager.kill(*keys)
end
# extend command functions
def ExtendCommand.extend_object(obj)
super
unless (class<<obj;ancestors;end).include?(ExtendCommand)
obj.install_aliases
end
end
OVERRIDE_NOTHING = 0
NO_OVERRIDE = 0
OVERRIDE_PRIVATE_ONLY = 0x01
OVERRIDE_ALL = 0x02
def install_aliases(override = OVERRIDE_NOTHING)
install_alias_method(:exit, :irb_exit, override | OVERRIDE_PRIVATE_ONLY)
install_alias_method(:quit, :irb_quit, override | OVERRIDE_PRIVATE_ONLY)
install_alias_method(:fork, :irb_fork, override | OVERRIDE_PRIVATE_ONLY)
install_alias_method(:kill, :irb_kill, override | OVERRIDE_PRIVATE_ONLY)
install_alias_method(:irb_cb, :irb_change_binding, override)
install_alias_method(:irb_ws, :irb_change_workspace, override)
install_alias_method(:source, :irb_source, override)
install_alias_method(:conf, :irb_context, override)
install_alias_method(:jobs, :irb_jobs, override)
install_alias_method(:fg, :irb_fg, override)
def irb_exit(ret = 0)
irb_context.exit(ret)
end
# override = {OVERRIDE_NOTHING, OVERRIDE_PRIVATE_ONLY, OVERRIDE_ALL}
def install_alias_method(to, from, override = OVERRIDE_NOTHING)
def irb_context
IRB.CurrentContext
end
@ALIASES = [
[:context, :irb_context, NO_OVERRIDE],
[:conf, :irb_context, NO_OVERRIDE],
[:irb_quit, :irb_exit, OVERRIDE_PRIVATE_ONLY],
[:exit, :irb_exit, OVERRIDE_PRIVATE_ONLY],
[:quit, :irb_exit, OVERRIDE_PRIVATE_ONLY],
]
@EXTEND_COMMANDS = [
[:irb_current_working_workspace, :CurrentWorkingWorkspace, "irb/cmd/chws",
[:irb_print_working_workspace, OVERRIDE_ALL],
[:irb_cwws, OVERRIDE_ALL],
[:irb_pwws, OVERRIDE_ALL],
# [:irb_cww, OVERRIDE_ALL],
# [:irb_pww, OVERRIDE_ALL],
[:cwws, NO_OVERRIDE],
[:pwws, NO_OVERRIDE],
# [:cww, NO_OVERRIDE],
# [:pww, NO_OVERRIDE],
[:irb_current_working_binding, OVERRIDE_ALL],
[:irb_print_working_binding, OVERRIDE_ALL],
[:irb_cwb, OVERRIDE_ALL],
[:irb_pwb, OVERRIDE_ALL],
# [:cwb, NO_OVERRIDE],
# [:pwb, NO_OVERRIDE]
],
[:irb_change_workspace, :ChangeWorkspace, "irb/cmd/chws",
[:irb_chws, OVERRIDE_ALL],
# [:irb_chw, OVERRIDE_ALL],
[:irb_cws, OVERRIDE_ALL],
# [:irb_cw, OVERRIDE_ALL],
[:chws, NO_OVERRIDE],
# [:chw, NO_OVERRIDE],
[:cws, NO_OVERRIDE],
# [:cw, NO_OVERRIDE],
[:irb_change_binding, OVERRIDE_ALL],
[:irb_cb, OVERRIDE_ALL],
[:cb, NO_OVERRIDE]],
[:irb_workspaces, :Workspaces, "irb/cmd/pushws",
[:workspaces, NO_OVERRIDE],
[:irb_bindings, OVERRIDE_ALL],
[:bindings, NO_OVERRIDE]],
[:irb_push_workspace, :PushWorkspace, "irb/cmd/pushws",
[:irb_pushws, OVERRIDE_ALL],
# [:irb_pushw, OVERRIDE_ALL],
[:pushws, NO_OVERRIDE],
# [:pushw, NO_OVERRIDE],
[:irb_push_binding, OVERRIDE_ALL],
[:irb_pushb, OVERRIDE_ALL],
[:pushb, NO_OVERRIDE]],
[:irb_pop_workspace, :PopWorkspace, "irb/cmd/pushws",
[:irb_popws, OVERRIDE_ALL],
# [:irb_popw, OVERRIDE_ALL],
[:popws, NO_OVERRIDE],
# [:popw, NO_OVERRIDE],
[:irb_pop_binding, OVERRIDE_ALL],
[:irb_popb, OVERRIDE_ALL],
[:popb, NO_OVERRIDE]],
[:irb_load, :Load, "irb/cmd/load"],
[:irb_require, :Require, "irb/cmd/load"],
[:irb_source, :Source, "irb/cmd/load",
[:source, NO_OVERRIDE]],
[:irb, :IrbCommand, "irb/cmd/subirb"],
[:irb_jobs, :Jobs, "irb/cmd/subirb",
[:jobs, NO_OVERRIDE]],
[:irb_fg, :Foreground, "irb/cmd/subirb",
[:fg, NO_OVERRIDE]],
[:irb_kill, :Kill, "irb/cmd/subirb",
[:kill, OVERRIDE_PRIVATE_ONLY]],
]
def EXCB.install_extend_commands
for args in @EXTEND_COMMANDS
def_extend_command *args
end
end
# aliases = [commans_alias, flag], ...
def EXCB.def_extend_command(cmd_name, cmd_class, load_file = nil, *aliases)
case cmd_class
when Symbol
cmd_class = cmd_class.id2name
when String
when Class
cmd_class = cmd_class.name
end
if load_file
eval %[
def #{cmd_name}(*opts, &b)
require "#{load_file}"
eval %[
def #{cmd_name}(*opts, &b)
ExtendCommand::#{cmd_class}.execute(irb_context, *opts, &b)
end
]
send :#{cmd_name}, *opts, &b
end
]
else
eval %[
def #{cmd_name}(*opts, &b)
ExtendCommand::#{cmd_class}.execute(irb_context, *opts, &b)
end
]
end
for ali, flag in aliases
@ALIASES.push [ali, cmd_name, flag]
end
end
# override = {NO_OVERRIDE, OVERRIDE_PRIVATE_ONLY, OVERRIDE_ALL}
def install_alias_method(to, from, override = NO_OVERRIDE)
to = to.id2name unless to.kind_of?(String)
from = from.id2name unless from.kind_of?(String)
if override == OVERRIDE_ALL or
(override == OVERRIDE_PRIVATE_ONLY) && !respond_to?(to) or
(override == OVERRIDE_NOTHING) && !respond_to?(to, true)
(override == NO_OVERRIDE) && !respond_to?(to, true)
target = self
(class<<self;self;end).instance_eval{
if target.respond_to?(to, true) &&
!target.respond_to?(ExtendCommand.irb_original_method_name(to), true)
alias_method(ExtendCommand.irb_original_method_name(to), to)
!target.respond_to?(EXCB.irb_original_method_name(to), true)
alias_method(EXCB.irb_original_method_name(to), to)
end
alias_method to, from
}
@ -122,5 +167,49 @@ module IRB
def self.irb_original_method_name(method_name)
"irb_" + method_name + "_org"
end
def EXCB.extend_object(obj)
unless (class<<obj;ancestors;end).include?(EXCB)
super
for ali, com, flg in @ALIASES
obj.install_alias_method(ali, com, flg)
end
end
end
install_extend_commands
end
# extension support for Context
module ContextExtender
CE = ContextExtender
@EXTEND_COMMANDS = [
[:eval_history=, "irb/ext/history.rb"],
[:use_tracer=, "irb/ext/tracer.rb"],
[:math_mode=, "irb/ext/math-mode.rb"],
[:use_loader=, "irb/ext/use-loader.rb"],
]
def CE.install_extend_commands
for args in @EXTEND_COMMANDS
def_extend_command *args
end
end
def CE.def_extend_command(cmd_name, load_file, *aliases)
Context.module_eval %[
def #{cmd_name}(*opts, &b)
require "#{load_file}"
send :#{cmd_name}, *opts, &b
end
for ali in aliases
alias_method ali, cmd_name
end
]
end
CE.install_extend_commands
end
end

Просмотреть файл

@ -1,6 +1,6 @@
#
# frame.rb -
# $Release Version: 0.7.1$
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(Nihon Rational Software Co.,Ltd)

Просмотреть файл

@ -1,6 +1,6 @@
#
# irb/help.rb - print usase module
# $Release Version: 0.7.3$
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(keiju@ishitsuka.com)

Просмотреть файл

@ -1,6 +1,6 @@
#
# irb/init.rb - irb initialize module
# $Release Version: 0.7.3$
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(keiju@ishitsuka.com)
@ -16,14 +16,19 @@ module IRB
def IRB.initialize(ap_path)
IRB.init_config(ap_path)
IRB.init_error
IRB.parse_opts
IRB.run_config
IRB.load_modules
unless @CONF[:PROMPT][@CONF[:PROMPT_MODE]]
IRB.fail(UndefinedPromptMode, @CONF[:PROMPT_MODE])
end
end
# @CONF default setting
def IRB.init_config(ap_path)
# class instance variables
@TRACER_INITIALIZED = false
@MATHN_INITIALIZED = false
# default configurations
unless ap_path and @CONF[:AP_NAME]
@ -45,6 +50,10 @@ module IRB
@CONF[:USE_LOADER] = false
@CONF[:IGNORE_SIGINT] = true
@CONF[:IGNORE_EOF] = false
@CONF[:ECHO] = nil
@CONF[:VERBOSE] = nil
@CONF[:EVAL_HISTORY] = nil
@CONF[:BACK_TRACE_LIMIT] = 16
@ -92,7 +101,6 @@ module IRB
@CONF[:LC_MESSAGES] = Locale.new
@CONF[:DEBUG_LEVEL] = 1
@CONF[:VERBOSE] = true
end
def IRB.init_error
@ -104,7 +112,6 @@ module IRB
while opt = ARGV.shift
case opt
when "-f"
opt = ARGV.shift
@CONF[:RC] = false
when "-m"
@CONF[:MATH_MODE] = true
@ -113,6 +120,8 @@ module IRB
when "-r"
opt = ARGV.shift
@CONF[:LOAD_MODULES].push opt if opt
when /^-K(.)/
$KCODE = $1
when "--inspect"
@CONF[:INSPECT_MODE] = true
when "--noinspect"
@ -121,11 +130,16 @@ module IRB
@CONF[:USE_READLINE] = true
when "--noreadline"
@CONF[:USE_READLINE] = false
when "--echo"
@CONF[:ECHO] = true
when "--noecho"
@CONF[:ECHO] = false
when "--verbose"
@CONF[:VERBOSE] = true
when "--noverbose"
@CONF[:VERBOSE] = false
when "--prompt-mode", "--prompt"
prompt_mode = ARGV.shift.upcase.tr("-", "_").intern
IRB.fail(UndefinedPromptMode,
prompt_mode.id2name) unless @CONF[:PROMPT][prompt_mode]
@CONF[:PROMPT_MODE] = prompt_mode
when "--noprompt"
@CONF[:PROMPT_MODE] = :NULL
@ -133,7 +147,6 @@ module IRB
@CONF[:PROMPT_MODE] = :INF_RUBY
when "--sample-book-mode", "--simple-prompt"
@CONF[:PROMPT_MODE] = :SIMPLE
when "--tracer"
@CONF[:USE_TRACER] = true
when "--back-trace-limit"
@ -154,7 +167,6 @@ module IRB
when /^-/
IRB.fail UnrecognizedSwitch, opt
else
@CONF[:USE_READLINE] = false
@CONF[:SCRIPT] = opt
$0 = opt
break
@ -201,32 +213,4 @@ module IRB
end
end
# initialize tracing function
def IRB.initialize_tracer
unless @TRACER_INITIALIZED
require("tracer")
Tracer.verbose = false
Tracer.add_filter {
|event, file, line, id, binding|
File::dirname(file) != @CONF[:IRB_LIB_PATH]
}
@TRACER_INITIALIZED = true
end
end
# initialize mathn function
def IRB.initialize_mathn
unless @MATHN_INITIALIZED
require "mathn"
@MATHN_INITIALIZED = true
end
end
# initialize loader function
def IRB.initialize_loader
unless @LOADER_INITIALIZED
require "irb/loader"
@LOADER_INITIALIZED = true
end
end
end

Просмотреть файл

@ -1,6 +1,6 @@
#
# irb/input-method.rb - input methods using irb
# $Release Version: 0.7.3$
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(keiju@ishitsuka.com)
@ -74,8 +74,9 @@ module IRB
end
def gets
print @prompt
l = @io.gets
print @prompt, l
# print @prompt, l
l
end
end
@ -94,6 +95,7 @@ module IRB
def gets
if l = readline(@prompt, true)
HISTORY.pop if l.empty?
@line[@line_no += 1] = l + "\n"
else
@eof = true

Просмотреть файл

@ -1,6 +1,6 @@
#
# irb/lc/error.rb -
# $Release Version: 0.7.3$
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(keiju@ishitsuka.com)

Просмотреть файл

@ -1,6 +1,6 @@
#
# irb/lc/help-message.rb -
# $Release Version: 0.7.3$
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(keiju@ishitsuka.com)

Просмотреть файл

@ -1,6 +1,6 @@
#
# irb/lc/ja/error.rb -
# $Release Version: 0.7.3$
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(keiju@ishitsuka.com)

Просмотреть файл

@ -1,6 +1,6 @@
#
# irb/lc/ja/help-message.rb -
# $Release Version: 0.7.3$
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(keiju@ishitsuka.com)

Просмотреть файл

@ -1,118 +0,0 @@
#
# irb/loader.rb - irb loader
# $Release Version: 0.7.3$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(keiju@ishitsuka.com)
#
# --
#
#
#
module IRB
class LoadAbort < GlobalExit;end
module Loader
@RCS_ID='-$Id$-'
alias ruby_load load
alias ruby_require require
def irb_load(file_name)
return ruby_load(file_name) unless IRB.conf[:USE_LOADER]
load_sub(file_name)
return true
end
def irb_require(file_name)
return ruby_require(file_name) unless IRB.conf[:USE_LOADER]
rex = Regexp.new("#{Regexp.quote(file_name)}(\.o|\.rb)?")
return false if $".find{|f| f =~ rex}
case file_name
when /\.rb$/
begin
load_sub(file_name)
$".push file_name
return true
rescue LoadError
end
when /\.(so|o|sl)$/
return ruby_require(file_name)
end
begin
load_sub(f = file_name + ".rb")
$".push f
return true
rescue LoadError
return ruby_require(file_name)
end
end
def load_sub(fn)
if fn =~ /^#{Regexp.quote(File::Separator)}/
return false unless File.exist?(fn)
return irb_context.load_file(fn)
end
for path in $:
if File.exist?(f = File.join(path, fn))
return irb_context.load_file(f)
end
end
raise LoadError, "No such file to load -- #{file_name}"
end
alias load irb_load
alias require irb_require
end
# class Context
# def load_from(file_name)
# io = FileInputMethod.new(file_name)
# @irb.signal_status(:IN_LOAD) do
# switch_io(io, file_name) do
# eval_input
# end
# end
# end
# end
class Context
def load_file(path)
back_io = @io
back_path = @irb_path
back_name = @irb_name
back_scanner = @irb.scanner
begin
@io = FileInputMethod.new(path)
@irb_name = File.basename(path)
@irb_path = path
@irb.signal_status(:IN_LOAD) do
if back_io.kind_of?(FileInputMethod)
@irb.eval_input
else
begin
@irb.eval_input
rescue LoadAbort
print "load abort!!\n"
end
end
end
ensure
@io = back_io
@irb_name = back_name
@irb_path = back_path
@irb.scanner = back_scanner
end
end
end
module ExtendCommand
include Loader
end
end

Просмотреть файл

@ -1,6 +1,6 @@
#
# irb/locale.rb - internationalization module
# $Release Version: 0.7.4$
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(keiju@ishitsuka.com)
@ -135,6 +135,7 @@ module IRB
end
lc_file.close
toplevel_load lc_file.path, priv
lc_file.close(true)
end
private :real_load

Просмотреть файл

@ -1,6 +1,6 @@
#
# irb/ruby-lex.rb - ruby lexcal analizer
# $Release Version: 0.7.3$
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(keiju@ishitsuka.com)
@ -50,6 +50,7 @@ class RubyLex
@here_readed = []
@indent = 0
@indent_stack = []
@skip_space = false
@readed_auto_clean_up = false
@ -200,6 +201,7 @@ class RubyLex
@ltype = nil
@quoted = nil
@indent = 0
@indent_stack = []
@lex_state = EXPR_BEG
@space_seen = false
@here_header = false
@ -235,6 +237,7 @@ class RubyLex
@exp_line_no = @line_no
@indent = 0
@indent_stack = []
prompt
rescue TerminateLineInput
initialize_input
@ -250,6 +253,7 @@ class RubyLex
!@continue or
tk.nil?)
#p tk
#p @lex_state
#p self
end
line = get_readed
@ -356,6 +360,11 @@ class RubyLex
else
@continue = false
@lex_state = EXPR_BEG
until (@indent_stack.empty? ||
[TkLPAREN, TkLBRACK, TkLBRACE,
TkfLPAREN, TkfLBRACK, TkfLBRACE].include?(@indent_stack.last))
@indent_stack.pop
end
end
@here_header = false
@here_readed = []
@ -363,26 +372,44 @@ class RubyLex
end
@OP.def_rules("*", "**",
"!", "!=", "!~",
"=", "==", "===",
"=~", "<=>",
"<", "<=",
">", ">=", ">>") do
|op, io|
@lex_state = EXPR_BEG
case @lex_state
when EXPR_FNAME, EXPR_DOT
@lex_state = EXPR_ARG
else
@lex_state = EXPR_BEG
end
Token(op)
end
@OP.def_rules("!", "!=", "!~") do
|op, io|
#@lex_state = EXPR_BEG
Token(op)
end
@OP.def_rules("<<") do
|op, io|
tk = nil
if @lex_state != EXPR_END && @lex_state != EXPR_CLASS &&
(@lex_state != EXPR_ARG || @space_seen)
c = peek(0)
if /\S/ =~ c && (/["'`]/ =~ c || /[\w_]/ =~ c || c == "-")
tk = identify_here_document
end
else
tk = Token(op)
end
unless tk
tk = Token(op)
case @lex_state
when EXPR_FNAME, EXPR_DOT
@lex_state = EXPR_ARG
else
@lex_state = EXPR_BEG
end
end
tk
end
@ -408,7 +435,7 @@ class RubyLex
Token(TkQUESTION)
else
ch = getc
if @lex_state == EXPR_ARG && ch !~ /\s/
if @lex_state == EXPR_ARG && ch =~ /\s/
ungetc
@lex_state = EXPR_BEG;
Token(TkQUESTION)
@ -437,11 +464,13 @@ class RubyLex
end
@OP.def_rule("+@", proc{@lex_state == EXPR_FNAME}) do
Token(TkUPLUS)
|op, io|
Token(op)
end
@OP.def_rule("-@", proc{@lex_state == EXPR_FNAME}) do
Token(TkUMINUS)
|op, io|
Token(op)
end
@OP.def_rules("+", "-") do
@ -488,6 +517,7 @@ class RubyLex
|op, io|
@lex_state = EXPR_END
@indent -= 1
@indent_stack.pop
Token(op)
end
@ -519,7 +549,7 @@ class RubyLex
elsif peek(0) == '='
getc
@lex_state = EXPR_BEG
Token(TkOPASGN, :/) #/)
Token(TkOPASGN, "/") #/)
elsif @lex_state == EXPR_ARG and @space_seen and peek(0) !~ /\s/
identify_string(op)
else
@ -538,18 +568,29 @@ class RubyLex
# Token(OP_ASGN, :^)
# end
@OP.def_rules(",", ";") do
@OP.def_rules(",") do
|op, io|
@lex_state = EXPR_BEG
Token(op)
end
@OP.def_rules(";") do
|op, io|
@lex_state = EXPR_BEG
until (@indent_stack.empty? ||
[TkLPAREN, TkLBRACK, TkLBRACE,
TkfLPAREN, TkfLBRACK, TkfLBRACE].include?(@indent_stack.last))
@indent_stack.pop
end
Token(op)
end
@OP.def_rule("~") do
@lex_state = EXPR_BEG
Token("~")
end
@OP.def_rule("~@", proc{@lex_state = EXPR_FNAME}) do
@OP.def_rule("~@", proc{@lex_state == EXPR_FNAME}) do
@lex_state = EXPR_BEG
Token("~")
end
@ -558,11 +599,13 @@ class RubyLex
@indent += 1
if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
@lex_state = EXPR_BEG
Token(TkfLPAREN)
tk_c = TkfLPAREN
else
@lex_state = EXPR_BEG
Token(TkLPAREN)
tk_c = TkLPAREN
end
@indent_stack.push tk_c
tk = Token(tk_c)
end
@OP.def_rule("[]", proc{@lex_state == EXPR_FNAME}) do
@ -576,29 +619,31 @@ class RubyLex
@OP.def_rule("[") do
@indent += 1
if @lex_state == EXPR_FNAME
Token(TkfLBRACK)
tk_c = TkfLBRACK
else
if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
t = Token(TkLBRACK)
tk_c = TkLBRACK
elsif @lex_state == EXPR_ARG && @space_seen
t = Token(TkLBRACK)
tk_c = TkLBRACK
else
t = Token(TkfLBRACK)
tk_c = TkfLBRACK
end
@lex_state = EXPR_BEG
t
end
@indent_stack.push tk_c
Token(tk_c)
end
@OP.def_rule("{") do
@indent += 1
if @lex_state != EXPR_END && @lex_state != EXPR_ARG
t = Token(TkLBRACE)
tk_c = TkLBRACE
else
t = Token(TkfLBRACE)
tk_c = TkfLBRACE
end
@lex_state = EXPR_BEG
t
@indent_stack.push tk_c
Token(tk_c)
end
@OP.def_rule('\\') do
@ -632,7 +677,7 @@ class RubyLex
end
@OP.def_rule('@') do
if peek(0) =~ /[\w_]/
if peek(0) =~ /[\w_@]/
ungetc
identify_identifier
else
@ -691,21 +736,32 @@ class RubyLex
def identify_identifier
token = ""
token.concat getc if peek(0) =~ /[$@]/
if peek(0) =~ /[$@]/
token.concat (c = getc)
if c == "@" and peek(0) == "@"
token.concat getc
end
end
while (ch = getc) =~ /\w|_/
print ":", ch, ":" if RubyLex.debug?
token.concat ch
end
ungetc
if ch == "!" or ch == "?"
if (ch == "!" || ch == "?") && token[0,1] =~ /\w/ && peek(0) != "="
token.concat getc
end
# almost fix token
case token
when /^\$/
return Token(TkGVAR, token)
when /^\@\@/
@lex_state = EXPR_END
# p Token(TkCVAR, token)
return Token(TkCVAR, token)
when /^\@/
@lex_state = EXPR_END
return Token(TkIVAR, token)
@ -727,9 +783,37 @@ class RubyLex
else
if @lex_state != EXPR_FNAME
if ENINDENT_CLAUSE.include?(token)
@indent += 1
# check for ``class = val''.
valid = true
case token
when "class"
valid = false unless peek_match?(/^\s*(<<|\w)/)
when "def"
valid = false if peek_match?(/^\s*(([+-\/*&\|^]|<<|>>|\|\||\&\&)?=|\&\&|\|\|)/)
when "do"
valid = false if peek_match?(/^\s*([+-\/*]?=|\*|<|>|\&)/)
when *ENINDENT_CLAUSE
valid = false if peek_match?(/^\s*([+-\/*]?=|\*|<|>|\&|\|)/)
else
# no nothing
end
if valid
if token == "do"
if ![TkFOR, TkWHILE, TkUNTIL].include?(@indent_stack.last)
@indent += 1
@indent_stack.push token_c
end
else
@indent += 1
@indent_stack.push token_c
end
# p @indent_stack
end
elsif DEINDENT_CLAUSE.include?(token)
@indent -= 1
@indent_stack.pop
end
@lex_state = trans[0]
else
@ -830,9 +914,12 @@ class RubyLex
@lex_state = EXPR_END
if ch = getc
if peek(0) == "x"
if /[xX]/ =~ peek(0)
ch = getc
match = /[0-9a-f_]/
match = /[0-9a-fA-F_]/
elsif /[bB]/ =~ peek(0)
ch = getc
match = /[01_]/
else
match = /[0-7_]/
end
@ -878,17 +965,25 @@ class RubyLex
@quoted = quoted
subtype = nil
begin
while ch = getc
if @quoted == ch
nest = 0
while ch = getc
if @quoted == ch and nest == 0
break
elsif @ltype != "'" && @ltype != "]" and ch == "#"
subtype = true
elsif ch == '\\' #'
read_escape
end
if PERCENT_PAREN.values.include?(@quoted)
if PERCENT_PAREN[ch] == @quoted
nest += 1
elsif ch == @quoted
nest -= 1
end
end
end
if @ltype == "/"
if peek(0) =~ /i|o|n|e|s/
if peek(0) =~ /i|m|x|o|e|s|u|n/
getc
end
end
@ -908,9 +1003,9 @@ class RubyLex
@ltype = "#"
while ch = getc
if ch == "\\" #"
read_escape
end
# if ch == "\\" #"
# read_escape
# end
if ch == "\n"
@ltype = nil
ungetc

Просмотреть файл

@ -1,6 +1,6 @@
#
# irb/ruby-token.rb - ruby tokens
# $Release Version: 0.7.3$
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(keiju@ishitsuka.com)
@ -155,6 +155,7 @@ module RubyToken
[:TkIDENTIFIER, TkId],
[:TkFID, TkId],
[:TkGVAR, TkId],
[:TkCVAR, TkId],
[:TkIVAR, TkId],
[:TkCONSTANT, TkId],

Просмотреть файл

@ -1,6 +1,6 @@
#
# irb/slex.rb - symple lex analizer
# $Release Version: 0.7.3$
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(keiju@ishituska.com)
@ -68,8 +68,7 @@ class SLex
case token
when Array
when String
token = token.split(//)
match(token.split(//))
return match(token.split(//))
else
return @head.match_io(token)
end

Просмотреть файл

@ -1,6 +1,6 @@
#
# irb/version.rb - irb version definition file
# $Release Version: 0.7.4$
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(keiju@ishitsuka.com)
@ -11,6 +11,6 @@
#
module IRB
@RELEASE_VERSION = "0.7.4"
@LAST_UPDATE_DATE = "01/05/08"
@RELEASE_VERSION = "0.9"
@LAST_UPDATE_DATE = "02/07/03"
end

Просмотреть файл

@ -1,6 +1,6 @@
#
# irb/workspace-binding.rb -
# $Release Version: 0.7.3$
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(keiju@ishitsuka.com)
@ -11,11 +11,12 @@
#
module IRB
class WorkSpace
# create new workspace.
# set self to main if specified, otherwise inherit main
# from TOPLEVEL_BINDING.
# create new workspace. set self to main if specified, otherwise
# inherit main from TOPLEVEL_BINDING.
def initialize(*main)
if IRB.conf[:SINGLE_IRB]
if main[0].kind_of?(Binding)
@binding = main.shift
elsif IRB.conf[:SINGLE_IRB]
@binding = TOPLEVEL_BINDING
else
case IRB.conf[:CONTEXT_MODE]
@ -76,10 +77,10 @@ EOF
attr_reader :binding
attr_reader :main
def evaluate(statements, file = __FILE__, line = __LINE__)
eval statements, @binding, file, line
def evaluate(context, statements, file = __FILE__, line = __LINE__)
eval(statements, @binding, file, line)
end
# error message manupilator
def filter_backtrace(bt)
case IRB.conf[:CONTEXT_MODE]

Просмотреть файл

@ -1,6 +1,6 @@
#
# irb/ws-for-case-2.rb -
# $Release Version: 0.7.3$
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(keiju@ishitsuka.com)

Просмотреть файл

@ -1,6 +1,6 @@
#
# xmp.rb - irb version of gotoken xmp
# $Release Version: 0.7.1$
# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(Nippon Rational Inc.)
@ -10,21 +10,23 @@
#
#
require "irb/irb"
require "irb"
require "irb/frame"
class XMP
@RCS_ID='-$Id$-'
def initialize(bind = nil)
IRB.init_config(nil)
#IRB.parse_opts
#IRB.load_modules
IRB.conf[:PROMPT_MODE] = :XMP
bind = IRB::Frame.top(1) unless bind
main = eval("self", bind)
ws = IRB::WorkSpace.new(bind)
@io = StringInputMethod.new
@irb = IRB::Irb.new(main, bind, @io)
@irb.context.prompt_mode = :XMP
@irb = IRB::Irb.new(ws, @io)
@irb.context.ignore_sigint = false
# IRB.conf[:IRB_RC].call(@irb.context) if IRB.conf[:IRB_RC]