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

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_masksObject

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