[DOC] Update TracePoint.allow_reentry docs
Adjust call-seq to mention block, and add examples and explanations.
This commit is contained in:
parent
b7bb14b96e
commit
ae455a129e
Notes:
git
2022-12-22 04:38:19 +00:00
@ -136,7 +136,7 @@ class TracePoint
|
|||||||
end
|
end
|
||||||
|
|
||||||
# call-seq:
|
# call-seq:
|
||||||
# TracePoint.allow_reentry
|
# TracePoint.allow_reentry { block }
|
||||||
#
|
#
|
||||||
# In general, while a TracePoint callback is running,
|
# In general, while a TracePoint callback is running,
|
||||||
# other registered callbacks are not called to avoid
|
# other registered callbacks are not called to avoid
|
||||||
@ -147,6 +147,55 @@ class TracePoint
|
|||||||
#
|
#
|
||||||
# If this method is called when the reentrance is already allowed,
|
# If this method is called when the reentrance is already allowed,
|
||||||
# it raises a RuntimeError.
|
# it raises a RuntimeError.
|
||||||
|
#
|
||||||
|
# <b>Example:</b>
|
||||||
|
#
|
||||||
|
# # Without reentry
|
||||||
|
# # ---------------
|
||||||
|
#
|
||||||
|
# line_handler = TracePoint.new(:line) do |tp|
|
||||||
|
# next if tp.path != __FILE__ # only work in this file
|
||||||
|
# puts "Line handler"
|
||||||
|
# binding.eval("class C; end")
|
||||||
|
# end.enable
|
||||||
|
#
|
||||||
|
# class_handler = TracePoint.new(:class) do |tp|
|
||||||
|
# puts "Class handler"
|
||||||
|
# end.enable
|
||||||
|
#
|
||||||
|
# class B
|
||||||
|
# end
|
||||||
|
#
|
||||||
|
# # This script will print "Class handler" only once: when inside :line
|
||||||
|
# # handler, all other handlers are ignored
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# # With reentry
|
||||||
|
# # ------------
|
||||||
|
#
|
||||||
|
# line_handler = TracePoint.new(:line) do |tp|
|
||||||
|
# next if tp.path != __FILE__ # only work in this file
|
||||||
|
# next if (__LINE__..__LINE__+3).cover?(tp.lineno) # don't be invoked from itself
|
||||||
|
# puts "Line handler"
|
||||||
|
# TracePoint.allow_reentry { binding.eval("class C; end") }
|
||||||
|
# end.enable
|
||||||
|
#
|
||||||
|
# class_handler = TracePoint.new(:class) do |tp|
|
||||||
|
# puts "Class handler"
|
||||||
|
# end.enable
|
||||||
|
#
|
||||||
|
# class B
|
||||||
|
# end
|
||||||
|
#
|
||||||
|
# # This wil print "Class handler" twice: inside allow_reentry block in :line
|
||||||
|
# # handler, other handlers are enabled.
|
||||||
|
#
|
||||||
|
# Note that the example shows the principal effect of the method, but its
|
||||||
|
# practical usage is for debugging libraries that sometimes require other libraries
|
||||||
|
# hooks to not be affected by debugger being inside trace point handling. Precautions
|
||||||
|
# should be taken against infinite recursion in this case (note that we needed to filter
|
||||||
|
# out calls by itself from :line handler, otherwise it will call itself infinitely).
|
||||||
|
#
|
||||||
def self.allow_reentry
|
def self.allow_reentry
|
||||||
Primitive.tracepoint_allow_reentry
|
Primitive.tracepoint_allow_reentry
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user