33module Codetracer
44 module KernelPatches
55 @@tracers = [ ]
6- @@original_methods = { }
76
87 def self . install ( tracer )
98 @@tracers << tracer
109
11- if @@original_methods . empty?
12- @@original_methods [ :p ] = Kernel . instance_method ( :p )
13- @@original_methods [ :puts ] = Kernel . instance_method ( :puts )
14- @@original_methods [ :print ] = Kernel . instance_method ( :print )
15-
10+ if @@tracers . length == 1
1611 Kernel . module_eval do
17- alias_method :old_p , :p unless method_defined? ( :old_p )
18- alias_method :old_puts , :puts unless method_defined? ( :old_puts )
19- alias_method :old_print , :print unless method_defined? ( :old_print )
12+ alias_method :codetracer_original_p , :p unless method_defined? ( :codetracer_original_p )
13+ alias_method :codetracer_original_puts , :puts unless method_defined? ( :codetracer_original_puts )
14+ alias_method :codetracer_original_print , :print unless method_defined? ( :codetracer_original_print )
2015
2116 define_method ( :p ) do |*args |
22- loc = caller_locations ( 1 , 1 ) . first
17+ loc = caller_locations ( 1 , 1 ) . first
2318 @@tracers . each do |t |
2419 t . record_event ( loc . path , loc . lineno , args . map ( &:inspect ) . join ( "\n " ) )
2520 end
26- @@original_methods [ :p ] . bind ( self ) . call ( *args )
21+ codetracer_original_p ( *args )
2722 end
2823
2924 define_method ( :puts ) do |*args |
30- loc = caller_locations ( 1 , 1 ) . first
25+ loc = caller_locations ( 1 , 1 ) . first
3126 @@tracers . each do |t |
3227 t . record_event ( loc . path , loc . lineno , args . join ( "\n " ) )
3328 end
34- @@original_methods [ :puts ] . bind ( self ) . call ( *args )
29+ codetracer_original_puts ( *args )
3530 end
3631
3732 define_method ( :print ) do |*args |
38- loc = caller_locations ( 1 , 1 ) . first
33+ loc = caller_locations ( 1 , 1 ) . first
3934 @@tracers . each do |t |
4035 t . record_event ( loc . path , loc . lineno , args . join )
4136 end
42- @@original_methods [ :print ] . bind ( self ) . call ( *args )
37+ codetracer_original_print ( *args )
4338 end
4439 end
4540 end
@@ -48,13 +43,16 @@ def self.install(tracer)
4843 def self . uninstall ( tracer )
4944 @@tracers . delete ( tracer )
5045
51- if @@tracers . empty? && ! @@original_methods . empty?
46+ if @@tracers . empty? && Kernel . private_method_defined? ( :codetracer_original_p )
5247 Kernel . module_eval do
53- define_method ( :p , @@original_methods [ :p ] )
54- define_method ( :puts , @@original_methods [ :puts ] )
55- define_method ( :print , @@original_methods [ :print ] )
48+ alias_method :p , :codetracer_original_p
49+ alias_method :puts , :codetracer_original_puts
50+ alias_method :print , :codetracer_original_print
51+
52+ remove_method :codetracer_original_p
53+ remove_method :codetracer_original_puts
54+ remove_method :codetracer_original_print
5655 end
57- @@original_methods . clear
5856 end
5957 end
6058 end
0 commit comments