@@ -42,11 +42,11 @@ def self.parse_argv_and_trace_ruby_file(argv)
4242 end
4343
4444 def self . trace_ruby_file ( program , out_dir , program_args = [ ] )
45- tracer = PureRubyRecorder . new ( $codetracer_record , debug : ENV [ 'CODETRACER_RUBY_RECORDER_DEBUG' ] == '1' )
45+ tracer = PureRubyRecorder . new ( debug : ENV [ 'CODETRACER_RUBY_RECORDER_DEBUG' ] == '1' )
4646
4747 tracer . record . register_call ( '' , 1 , '<top-level>' , [ ] )
4848 tracer . ignore ( 'lib/ruby' )
49- tracer . ignore ( 'trace .rb' )
49+ tracer . ignore ( 'codetracer_pure_ruby_recoreder .rb' )
5050 tracer . ignore ( 'recorder.rb' )
5151 tracer . ignore ( '<internal:' )
5252 tracer . ignore ( 'gems/' )
@@ -61,13 +61,23 @@ def self.trace_ruby_file(program, out_dir, program_args = [])
6161 Kernel . load ( program )
6262 rescue Exception => e
6363 if tracer . debug
64- codetracer_original_puts ''
65- codetracer_original_puts '==== trace.rb error while tracing program ==='
66- codetracer_original_puts 'ERROR'
67- codetracer_original_puts e
68- codetracer_original_puts e . backtrace
69- codetracer_original_puts '====================='
70- codetracer_original_puts ''
64+ if Kernel . respond_to? ( :codetracer_original_puts , true )
65+ Kernel . codetracer_original_puts ''
66+ Kernel . codetracer_original_puts '==== trace.rb error while tracing program ==='
67+ Kernel . codetracer_original_puts 'ERROR'
68+ Kernel . codetracer_original_puts e
69+ Kernel . codetracer_original_puts e . backtrace
70+ Kernel . codetracer_original_puts '====================='
71+ Kernel . codetracer_original_puts ''
72+ else
73+ puts ''
74+ puts '==== trace.rb error while tracing program ==='
75+ puts 'ERROR'
76+ puts e
77+ puts e . backtrace
78+ puts '====================='
79+ puts ''
80+ end
7181 end
7282 ensure
7383 # Restore original ARGV
@@ -80,9 +90,9 @@ def self.trace_ruby_file(program, out_dir, program_args = [])
8090 0
8191 end
8292
83- def initialize ( record , debug : false )
93+ def initialize ( debug : false )
8494 @tracing = false
85- @record = record
95+ @record = TraceRecord . new
8696 @ignore_list = [ ]
8797 @debug = debug
8898 @record . debug = debug if @record . respond_to? ( :debug= )
@@ -126,12 +136,12 @@ def setup_tracepoints
126136 def prepare_args ( tp )
127137 args_after_self = tp . parameters . map do |( kind , name ) |
128138 value = if tp . binding . nil? || name . nil?
129- NIL_VALUE
139+ @record . nil_value
130140 else
131141 begin
132- to_value ( tp . binding . local_variable_get ( name ) )
142+ @record . to_value ( tp . binding . local_variable_get ( name ) )
133143 rescue
134- NIL_VALUE
144+ @record . nil_value
135145 end
136146 end
137147 [ name . to_sym , value ]
@@ -140,7 +150,7 @@ def prepare_args(tp)
140150 # can be class or module
141151 module_name = tp . self . class . name
142152 begin
143- args = [ [ :self , raw_obj_value ( tp . self . to_s , module_name ) ] ] + args_after_self
153+ args = [ [ :self , @record . raw_obj_value ( tp . self . to_s , module_name ) ] ] + args_after_self
144154 rescue
145155 # $stderr.write("error args\n")
146156 args = [ ]
@@ -163,7 +173,11 @@ def record_call(tp)
163173 method_name_prefix = module_name == 'Object' ? '' : "#{ module_name } #"
164174 method_name = "#{ method_name_prefix } #{ tp . method_id } "
165175
166- codetracer_original_puts "call #{ method_name } with #{ tp . parameters } " if $tracer. debug
176+ if @debug && Kernel . respond_to? ( :codetracer_original_puts , true )
177+ Kernel . codetracer_original_puts "call #{ method_name } with #{ tp . parameters } "
178+ elsif @debug
179+ puts "call #{ method_name } with #{ tp . parameters } "
180+ end
167181
168182 arg_records = prepare_args ( tp )
169183
@@ -175,8 +189,12 @@ def record_call(tp)
175189
176190 def record_return ( tp )
177191 if self . tracks_call? ( tp )
178- codetracer_original_puts "return" if $tracer. debug
179- return_value = to_value ( tp . return_value )
192+ if @debug && Kernel . respond_to? ( :codetracer_original_puts , true )
193+ Kernel . codetracer_original_puts 'return'
194+ elsif @debug
195+ puts 'return'
196+ end
197+ return_value = @record . to_value ( tp . return_value )
180198 @record . register_step ( tp . path , tp . lineno )
181199 # return value support inspired by existing IDE-s/envs like
182200 # Visual Studio/JetBrains IIRC
@@ -248,14 +266,19 @@ def trace_block(&block)
248266 end
249267 end
250268
269+ # Flush trace to output directory - compatible with native recorder API
270+ def flush_trace ( out_dir )
271+ @record . serialize ( '' , out_dir )
272+ end
273+
251274 private
252275
253276 def load_variables ( binding )
254277 if !binding . nil?
255278 # $stdout.write binding.local_variables
256279 binding . local_variables . map do |name |
257280 v = binding . local_variable_get ( name )
258- out = to_value ( v )
281+ out = @record . to_value ( v )
259282 [ name , out ]
260283 end
261284 else
0 commit comments