Module: Trace
- Defined in:
- lib/trace_mod.rb,
lib/trace.rb,
lib/eventbuffer.rb,
lib/tracefilter.rb
Overview
Copyright © 2011 Rocky Bernstein <[email protected]>
Defined Under Namespace
Classes: EventBuffer, Filter
Constant Summary collapse
- VERSION =
"0.7"
- NO_EVENT_MASK =
0x0000
- LINE_EVENT_MASK =
Event masks from
ruby.h
0x0001
- CLASS_EVENT_MASK =
0x0002
- END_EVENT_MASK =
0x0004
- CALL_EVENT_MASK =
0x0008
- RETURN_EVENT_MASK =
0x0010
- C_CALL_EVENT_MASK =
0x0020
- C_RETURN_EVENT_MASK =
0x0040
- RAISE_EVENT_MASK =
0x0080
- INSN_EVENT_MASK =
0x0100
- BRKPT_EVENT_MASK =
0x0200
- SEND_EVENT_MASK =
0x0400
- LEAVE_EVENT_MASK =
0x0800
- YIELD_EVENT_MASK =
0x1000
- ALL_EVENT_MASKS =
(0xffff & ~INSN_EVENT_MASK)
- VM_EVENT_MASK =
0x10000
- SWITCH_EVENT_MASK =
0x20000
- COVERAGE_EVENT_MASK =
0x40000
- DEFAULT_EVENT_MASK =
Events that will trigger if you don’t specify any
BRKPT_EVENT_MASK | CALL_EVENT_MASK | CLASS_EVENT_MASK | C_CALL_EVENT_MASK | C_RETURN_EVENT_MASK | END_EVENT_MASK | LEAVE_EVENT_MASK | LINE_EVENT_MASK | RAISE_EVENT_MASK | RETURN_EVENT_MASK | SEND_EVENT_MASK | YIELD_EVENT_MASK
- EVENT2MASK =
Symbols we use to represent the individual bits inside a Fixnum bitmask
{ :brkpt => BRKPT_EVENT_MASK, :c_call => C_CALL_EVENT_MASK, :c_return => C_RETURN_EVENT_MASK, :call => CALL_EVENT_MASK, :class => CLASS_EVENT_MASK, :coverage => COVERAGE_EVENT_MASK, :end => END_EVENT_MASK, :insn => INSN_EVENT_MASK, :leave => LEAVE_EVENT_MASK, :line => LINE_EVENT_MASK, :raise => RAISE_EVENT_MASK, :return => RETURN_EVENT_MASK, :send => SEND_EVENT_MASK, :switch => SWITCH_EVENT_MASK, :vm => VM_EVENT_MASK, :yield => YIELD_EVENT_MASK }
- EVENTS =
EVENT2MASK.keys.sort
Class Method Summary collapse
-
.add_trace_func(*args) ⇒ Object
Replacement for Kernel::set_trace We allow for a more flexible event mask parameters to be set.
-
.bitmask2events(bitmask) ⇒ Object
Convert Fixnum
bitmask
used internally by Ruby, into an Array of event names. - .convert_event_mask(mask_arg) ⇒ Object
-
.event_masks ⇒ Object
Return a list of the global event masks in effect.
-
.event_masks=(mask_arg) ⇒ Object
Set event masks.
-
.events2bitmask(events) ⇒ Object
Convert
events
into a Fixnum bitmask used internally by Ruby. -
.set_trace_func(*args) ⇒ Object
Replacement for Kernel::set_trace We allow for a more flexible event mask parameters to be set.
Class Method Details
.add_trace_func(*args) ⇒ Object
Replacement for Kernel::set_trace We allow for a more flexible event mask parameters to be set.
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 |
# File 'lib/trace_mod.rb', line 141 def add_trace_func(*args) if args.size > 3 or args.size < 1 raise ArgumentError, "wrong number of arguments (#{args.size} for 1..2)" end proc, mask_arg = args if proc.nil? if args.size != 1 raise ArgumentError, "When first argument (Proc) is nil, there should be only one argument" end return Kernel.set_trace_func(proc) elsif mask_arg.nil? Kernel.add_trace_func(proc) else # args.size == 2 event_mask = convert_event_mask(mask_arg) Kernel.add_trace_func(proc, event_mask) end end |
.bitmask2events(bitmask) ⇒ Object
Convert Fixnum bitmask
used internally by Ruby, into an Array of event names.
99 100 101 102 103 104 105 |
# File 'lib/trace_mod.rb', line 99 def bitmask2events(bitmask) mask = [] EVENT2MASK.each do |key, value| mask << key if (value & bitmask) != 0 end return mask end |
.convert_event_mask(mask_arg) ⇒ Object
108 109 110 111 112 113 114 115 116 117 118 119 |
# File 'lib/trace_mod.rb', line 108 def convert_event_mask(mask_arg) if mask_arg.is_a?(Fixnum) event_mask = mask_arg elsif mask_arg.kind_of?(Enumerable) event_mask, bad_events = events2bitmask(mask_arg) raise ArgumentError, "Bad set elements: #{bad_events.inspect}" unless bad_events.empty? else raise ArgumentError, "Bad set mask arg: #{mask_arg}" end event_mask end |
.event_masks ⇒ Object
Return a list of the global event masks in effect
123 124 125 126 127 |
# File 'lib/trace_mod.rb', line 123 def event_masks RubyVM::TraceHook::trace_hooks.map do |hook| hook.event_mask end end |
.event_masks=(mask_arg) ⇒ Object
Set event masks
131 132 133 134 135 136 |
# File 'lib/trace_mod.rb', line 131 def event_masks=(mask_arg) RubyVM::TraceHook::trace_hooks.map do |hook| event_mask = convert_event_mask(mask_arg) hook.event_mask = event_mask end end |
.events2bitmask(events) ⇒ Object
Convert events
into a Fixnum bitmask used internally by Ruby. Parameter events
should be Enumerable and each element should either be a Fixnum mask value or something that can be converted to a symbol. If the latter, the case is not important as we’ll downcase the string representation.
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
# File 'lib/trace_mod.rb', line 74 def events2bitmask(events) bitmask = NO_EVENT_MASK bad_events = [] events.each do |event| nextbit = nil if event.is_a?(Fixnum) # Assume a bit mask nextbit = event elsif event.respond_to?(:to_sym) # Assume an event name sym = event.to_sym.to_s.downcase.to_sym nextbit = EVENT2MASK[sym] if EVENT2MASK.member?(sym) end if nextbit bitmask |= nextbit else bad_events << event end end return bitmask, bad_events end |
.set_trace_func(*args) ⇒ Object
Replacement for Kernel::set_trace We allow for a more flexible event mask parameters to be set.
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 |
# File 'lib/trace_mod.rb', line 163 def set_trace_func(*args) if args.size > 3 or args.size < 1 raise ArgumentError, "wrong number of arguments (#{args.size} for 1..2)" end proc, mask_arg = args if proc.nil? if args.size != 1 raise ArgumentError, "When first argument (Proc) is nil, there should be only one argument" end return Kernel.set_trace_func(proc) elsif mask_arg.nil? Kernel.set_trace_func(proc) else # args.size == 2 event_mask = convert_event_mask(mask_arg) Kernel.set_trace_func(proc, event_mask) end end |