From 62e648e148b3cb9f96dcce808c55c02b7ccb4486 Mon Sep 17 00:00:00 2001 From: matz Date: Wed, 20 Jan 1999 04:59:39 +0000 Subject: ruby 1.3 cycle git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/RUBY@372 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/tracer.rb | 147 ++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 117 insertions(+), 30 deletions(-) (limited to 'lib/tracer.rb') diff --git a/lib/tracer.rb b/lib/tracer.rb index d37339fd62..fbfca24fe5 100644 --- a/lib/tracer.rb +++ b/lib/tracer.rb @@ -1,7 +1,28 @@ +# +# tracer.rb - +# $Release Version: 0.2$ +# $Revision: 1.8 $ +# $Date: 1998/05/19 03:42:49 $ +# by Keiju ISHITSUKA(Nippon Rational Inc.) +# +# -- +# +# +# + +# +# tracer main class +# class Tracer - MY_FILE_NAME_PATTERN = /^tracer\.(rb)?/ - Threads = Hash.new - Sources = Hash.new + @RCS_ID='-$Id: tracer.rb,v 1.8 1998/05/19 03:42:49 keiju Exp keiju $-' + + class << self + attr :verbose, TRUE + alias verbose? verbose + end + verbose = TRUE + + MY_FILE_NAME = caller(0)[0].scan(/^(.*):[0-9]+$/)[0][0] EVENT_SYMBOL = { "line" => "-", @@ -10,39 +31,89 @@ class Tracer "class" => "C", "end" => "E"} + def initialize + @threads = Hash.new + if defined? Thread.main + @threads[Thread.main.id] = 0 + else + @threads[Thread.current.id] = 0 + end + + @get_line_procs = {} + @sources = {} + + @filters = [] + end + def on - set_trace_func proc{|event, file, line, id, binding| - trace_func event, file, line, id, binding - } - print "Trace on\n" + if iterator? + on + begin + yield + ensure + off + end + else + set_trace_func proc{|event, file, line, id, binding| + trace_func event, file, line, id, binding + } + print "Trace on\n" if Tracer.verbose? + end end def off set_trace_func nil - print "Trace off\n" + print "Trace off\n" if Tracer.verbose? end - - def get_thread_no - unless no = Threads[Thread.current.id] - Threads[Thread.current.id] = no = Threads.size - end - no + + def add_filter(p = proc) + @filters.push p + end + + def set_get_line_procs(file, p = proc) + @get_line_procs[file] = p end def get_line(file, line) - unless list = Sources[file] - f =open(file) - begin - Sources[file] = list = f.readlines - ensure - f.close + if p = @get_line_procs[file] + return p.call line + end + + unless list = @sources[file] +# print file if $DEBUG + begin + f = open(file) + begin + @sources[file] = list = f.readlines + ensure + f.close + end + rescue + @sources[file] = list = [] end end - list[line - 1] + if l = list[line - 1] + l + else + "-\n" + end + end + + def get_thread_no + if no = @threads[Thread.current.id] + no + else + @threads[Thread.current.id] = @threads.size + end end def trace_func(event, file, line, id, binding) - return if File.basename(file) =~ MY_FILE_NAME_PATTERN + return if file == MY_FILE_NAME + #printf "Th: %s\n", Thread.current.inspect + + for p in @filters + return unless p.call event, file, line, id, binding + end Thread.critical = TRUE printf("#%d:%s:%d:%s: %s", @@ -56,20 +127,36 @@ class Tracer Single = new def Tracer.on - Single.on + if iterator? + Single.on{yield} + else + Single.on + end end def Tracer.off Single.off end -end + def Tracer.set_get_line_procs(file_name, p = proc) + Single.set_get_line_procs(file_name, p) + end -if File.basename($0) =~ Tracer::MY_FILE_NAME_PATTERN - $0 = ARGV.shift + def Tracer.add_filter(p = proc) + Single.add_filter(p) + end - Tracer.on - load $0 -else - Tracer.on +end + +if caller(0).size == 1 + if $0 == Tracer::MY_FILE_NAME + # direct call + + $0 = ARGV[0] + ARGV.shift + Tracer.on + require $0 + else + Tracer.on + end end -- cgit v1.2.3