@@ -53,7 +53,7 @@ def display_string(value)
53
53
@times [ best_class_name ( value ) ] += elapsed
54
54
end
55
55
56
- encode_dislay_string ( value_string )
56
+ encode_display_string ( value_string )
57
57
end
58
58
59
59
def object_properties ( hash_like )
@@ -77,7 +77,7 @@ def best_class_name(value)
77
77
value_cls . name
78
78
end
79
79
80
- def encode_dislay_string ( value )
80
+ def encode_display_string ( value )
81
81
( value ||'' ) [ 0 ...LIMIT ] . encode ( 'utf-8' , invalid : :replace , undef : :replace , replace : '_' )
82
82
end
83
83
@@ -138,22 +138,46 @@ def object_properties(hash_like)
138
138
class MethodCall < MethodEvent
139
139
attr_accessor :defined_class , :method_id , :path , :lineno , :parameters , :receiver , :static
140
140
141
+ MethodMetadata = Struct . new ( :defined_class , :method_id , :path , :lineno , :static )
142
+
143
+ @@method_metadata = { }
144
+
141
145
class << self
146
+ private
147
+
148
+ def method_metadata ( defined_class , method , receiver )
149
+ result = @@method_metadata [ method ]
150
+ return result if result
151
+
152
+ result = MethodMetadata . new
153
+ result . static = receiver . is_a? ( Module )
154
+ result . defined_class = defined_class
155
+ result . method_id = method . name . to_s
156
+ if method . source_location
157
+ path = method . source_location [ 0 ]
158
+ path = path [ Dir . pwd . length + 1 ..-1 ] if path . index ( Dir . pwd ) == 0
159
+ result . path = path
160
+ result . lineno = method . source_location [ 1 ]
161
+ else
162
+ result . path = [ defined_class , result . static ? '.' : '#' , method . name ] . join
163
+ end
164
+ @@method_metadata [ method ] = result
165
+ end
166
+
167
+ public
168
+
142
169
def build_from_invocation ( defined_class , method , receiver , arguments , event : MethodCall . new )
143
170
event ||= MethodCall . new
144
171
defined_class ||= 'Class'
172
+
145
173
event . tap do
146
- static = receiver . is_a? ( Module )
147
- event . defined_class = defined_class
148
- event . method_id = method . name . to_s
149
- if method . source_location
150
- path = method . source_location [ 0 ]
151
- path = path [ Dir . pwd . length + 1 ..-1 ] if path . index ( Dir . pwd ) == 0
152
- event . path = path
153
- event . lineno = method . source_location [ 1 ]
154
- else
155
- event . path = [ defined_class , static ? '.' : '#' , method . name ] . join
156
- end
174
+ metadata = method_metadata ( defined_class , method , receiver )
175
+
176
+ event . defined_class = metadata . defined_class
177
+ event . method_id = metadata . method_id
178
+ event . path = metadata . path
179
+ event . lineno = metadata . lineno
180
+ event . static = metadata . static
157
181
158
182
# Check if the method has key parameters. If there are any they'll always be last.
159
183
# If yes, then extract it from arguments.
@@ -186,7 +210,7 @@ def build_from_invocation(defined_class, method, receiver, arguments, event: Met
186
210
object_id : receiver . __id__ ,
187
211
value : display_string ( receiver )
188
212
}
189
- event . static = static
213
+
190
214
MethodEvent . build_from_invocation ( :call , event : event )
191
215
end
192
216
end
0 commit comments