Class: TraceTree::Point
- Inherits:
-
Object
show all
- Includes:
- TreeGraphable, TreeHtmlable
- Defined in:
- lib/trace_tree/point.rb,
lib/trace_tree/point.rb,
lib/trace_tree/point/omit.rb,
lib/trace_tree/point/common.rb,
lib/trace_tree/point/threadend.rb,
lib/trace_tree/point/threadbegin.rb,
lib/trace_tree/point/ccall_kernel_raise.rb,
lib/trace_tree/point/ccall_kernel_extend.rb,
lib/trace_tree/point/ccall_module_include.rb,
lib/trace_tree/point/ccall_module_prepend.rb,
lib/trace_tree/point/ccall_classthread_new.rb,
lib/trace_tree/point/ccall_thread_initialize.rb,
lib/trace_tree/point/creturn_classthread_new.rb,
lib/trace_tree/point/ccall_module_extendobject.rb,
lib/trace_tree/point/creturn_thread_initialize.rb,
lib/trace_tree/point/creturn_module_extendobject.rb
Direct Known Subclasses
CcallClassthreadNew, CcallKernelExtend, CcallKernelRaise, CcallModuleExtendobject, CcallModuleInclude, CcallModulePrepend, CcallThreadInitialize, Common, CreturnClassthreadNew, CreturnModuleExtendobject, CreturnThreadInitialize, Omitted, Threadbegin, Threadend
Defined Under Namespace
Classes: CcallClassthreadNew, CcallKernelExtend, CcallKernelRaise, CcallModuleExtendobject, CcallModuleInclude, CcallModulePrepend, CcallThreadInitialize, Common, CreturnClassthreadNew, CreturnModuleExtendobject, CreturnThreadInitialize, Loader, Omitted, Threadbegin, Threadend
Constant Summary
collapse
- Interfaces =
[:event, :defined_class, :method_id, :path, :lineno]
- NativeThreadCall =
[CcallClassthreadNew,
CreturnClassthreadNew,
CcallThreadInitialize,
CreturnThreadInitialize,
Threadbegin,
Threadend]
TreeHtmlable::DEFAULT_JS
Class Attribute Summary collapse
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
#body_js_for_tree_html, #children_for_tree_html, #css_for_tree_html, #data_for_tree_html, #label_for_tree_html
#children_for_tree_graph, #label_for_tree_graph
Constructor Details
#initialize(trace_point) ⇒ Point
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
# File 'lib/trace_tree/point.rb', line 70
def initialize trace_point
Interfaces.each do |i|
instance_variable_set "@#{i}", trace_point.send(i)
end
@return_value = trace_point.return_value if x_return?
if thread?
@thread = trace_point.self
else
there = trace_point.binding.of_caller(3)
@current = BindingOfCallers::Revealed.new there
@frame_env = current.frame_env.to_sym
@thread = current.send(:eval, 'Thread.current')
end
rescue => e
puts e
end
|
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method_id, *args, &blk) ⇒ Object
65
66
67
68
|
# File 'lib/trace_tree/point.rb', line 65
def method_missing method_id, *args, &blk
raise NoMethodError, "NoMethodError: undefined method `#{method_id}' "\
"for #<#{self.class.proto or self.class.name}#{inspect}>"
end
|
Class Attribute Details
.proto ⇒ Object
Returns the value of attribute proto.
49
50
51
|
# File 'lib/trace_tree/point.rb', line 49
def proto
@proto
end
|
Instance Attribute Details
#config ⇒ Object
Returns the value of attribute config.
11
12
13
|
# File 'lib/trace_tree/point.rb', line 11
def config
@config
end
|
#current ⇒ Object
Returns the value of attribute current.
10
11
12
|
# File 'lib/trace_tree/point.rb', line 10
def current
@current
end
|
#frame_env ⇒ Object
Returns the value of attribute frame_env.
10
11
12
|
# File 'lib/trace_tree/point.rb', line 10
def frame_env
@frame_env
end
|
#terminal ⇒ Object
Returns the value of attribute terminal.
11
12
13
|
# File 'lib/trace_tree/point.rb', line 11
def terminal
@terminal
end
|
#thread ⇒ Object
Returns the value of attribute thread.
10
11
12
|
# File 'lib/trace_tree/point.rb', line 10
def thread
@thread
end
|
Class Method Details
.bases ⇒ Object
21
22
23
|
# File 'lib/trace_tree/point.rb', line 21
def bases
@bases ||= []
end
|
.cache_event_class_method! ⇒ Object
51
52
53
54
55
56
57
58
59
60
61
62
|
# File 'lib/trace_tree/point.rb', line 51
def cache_event_class_method!
bases.each do |base|
base.class_eval " class << self\n alias_method :_event_class_method, :event_class_method\n def self.event_class_method\n @ecm ||= _event_class_method.freeze\n end\n end\n"
end
end
|
.class_of?(point) ⇒ Boolean
38
39
40
41
|
# File 'lib/trace_tree/point.rb', line 38
def class_of? point
e, c, m = event_class_method
point.method_id == m && point.event == e && point.defined_class == c
end
|
.hashify(point) ⇒ Object
25
26
27
28
29
30
31
32
33
34
35
36
|
# File 'lib/trace_tree/point.rb', line 25
def hashify point
h = {}
h[:event] = point.event
h[:defined_class] = point.defined_class
h[:method_id] = point.method_id
h[:frame_env] = point.frame_env unless point.thread?
h[:path] = point.path
h[:lineno] = point.lineno
h[:thread] = point.thread
h[:return_value] = point.return_value if point.event =~ /return/
h
end
|
.inherited(base) ⇒ Object
17
18
19
|
# File 'lib/trace_tree/point.rb', line 17
def inherited base
bases << base
end
|
.initialize_clone(proto) ⇒ Object
43
44
45
46
47
|
# File 'lib/trace_tree/point.rb', line 43
def initialize_clone proto
super.tap do
instance_variable_set :@proto, proto
end
end
|
Instance Method Details
#<<(node) ⇒ Object
147
148
149
|
# File 'lib/trace_tree/point.rb', line 147
def << node
callees << node
end
|
#_class_and_method ⇒ Object
159
160
161
|
# File 'lib/trace_tree/point.rb', line 159
def _class_and_method
@km ||= "#{class_name}#{call_symbol}#{method_name}"
end
|
#arg ⇒ Object
183
184
185
|
# File 'lib/trace_tree/point.rb', line 183
def arg
respond_to?(:parameters) ? "(#{parameters})" : nil
end
|
#arguments ⇒ Object
116
117
118
119
120
121
122
123
|
# File 'lib/trace_tree/point.rb', line 116
def arguments
{}.tap do |args|
if event == :call
defined_class.instance_method(method_id).parameters.
each{ |role, name| args[name] = current.lv(name) unless name.nil? && role == :rest }
end
end
end
|
#b_call? ⇒ Boolean
89
90
91
|
# File 'lib/trace_tree/point.rb', line 89
def b_call?
event == :b_call
end
|
#c_call? ⇒ Boolean
93
94
95
|
# File 'lib/trace_tree/point.rb', line 93
def c_call?
event == :c_call
end
|
#call_symbol ⇒ Object
175
176
177
|
# File 'lib/trace_tree/point.rb', line 175
def call_symbol
c_call? ? '#' : current.call_symbol
end
|
#callees ⇒ Object
151
152
153
|
# File 'lib/trace_tree/point.rb', line 151
def callees
@callees ||= []
end
|
#class? ⇒ Boolean
97
98
99
|
# File 'lib/trace_tree/point.rb', line 97
def class?
event == :class
end
|
#class_and_method ⇒ Object
155
156
157
|
# File 'lib/trace_tree/point.rb', line 155
def class_and_method
"#{_class_and_method}#{arg}"
end
|
#class_name ⇒ Object
163
164
165
166
167
|
# File 'lib/trace_tree/point.rb', line 163
def class_name
c_call? ? defined_class : current.klass
rescue => e
puts event
end
|
#end_of_trace? ⇒ Boolean
109
110
111
112
113
114
|
# File 'lib/trace_tree/point.rb', line 109
def end_of_trace?
MainFile == path && (
(:c_return == event && :instance_eval == method_id) ||
(:c_call == event && :disable == method_id)
)
end
|
#inspect ⇒ Object
129
130
131
|
# File 'lib/trace_tree/point.rb', line 129
def inspect
to_h.inspect
end
|
#method_defined_by_define_method? ⇒ Boolean
254
255
256
257
|
# File 'lib/trace_tree/point.rb', line 254
def method_defined_by_define_method?
(event == :call || event == :return) &&
method_id != frame_env
end
|
#method_name ⇒ Object
169
170
171
172
173
|
# File 'lib/trace_tree/point.rb', line 169
def method_name
return method_id if c_call?
return frame_env if b_call? || class?
(method_id == frame_env) ? method_id : "#{method_id} -> #{frame_env}"
end
|
#return_value ⇒ Object
125
126
127
|
# File 'lib/trace_tree/point.rb', line 125
def return_value
x_return? ? @return_value : (terminal.nil? ? nil : terminal.return_value)
end
|
#source_location ⇒ Object
179
180
181
|
# File 'lib/trace_tree/point.rb', line 179
def source_location
"#{path}:#{lineno}"
end
|
#terminate?(point) ⇒ Boolean
137
138
139
140
141
142
143
144
145
|
# File 'lib/trace_tree/point.rb', line 137
def terminate? point
(point.defined_class == defined_class && point.method_id == method_id) && (
(event == :return && point.event == :call) ||
(event == :b_return && point.event == :b_call) ||
(event == :c_return && point.event == :c_call) ||
(event == :end && point.event == :class) ||
(event == :thread_end && point.event == :thread_begin)
)
end
|
#thread? ⇒ Boolean
105
106
107
|
# File 'lib/trace_tree/point.rb', line 105
def thread?
event =~ /thread/
end
|
#thread_relative? ⇒ Boolean
249
250
251
252
|
# File 'lib/trace_tree/point.rb', line 249
def thread_relative?
NativeThreadCall.any?{ |k| k.class_of? self } ||
Thread == defined_class
end
|
#to_h ⇒ Object
133
134
135
|
# File 'lib/trace_tree/point.rb', line 133
def to_h
self.class.hashify(self)
end
|
#x_return? ⇒ Boolean
101
102
103
|
# File 'lib/trace_tree/point.rb', line 101
def x_return?
event =~ /return/
end
|