@@ -87,8 +87,10 @@ pub fn prepare_filter(
87
87
88
88
if filter. function_regex . is_some ( )
89
89
|| filter. source_regex . is_some ( )
90
+ || filter. library_regex . is_some ( )
90
91
|| filter. negative_function_regex . is_some ( )
91
92
|| filter. negative_source_regex . is_some ( )
93
+ || filter. negative_library_regex . is_some ( )
92
94
{
93
95
let function_regex = if let Some ( ref pattern) = filter. function_regex {
94
96
Some (
@@ -108,6 +110,15 @@ pub fn prepare_filter(
108
110
None
109
111
} ;
110
112
113
+ let library_regex = if let Some ( ref pattern) = filter. library_regex {
114
+ Some (
115
+ Regex :: new ( pattern)
116
+ . map_err ( |err| PrepareFilterError :: InvalidRegex ( "library_regex" , err) ) ?,
117
+ )
118
+ } else {
119
+ None
120
+ } ;
121
+
111
122
let negative_function_regex =
112
123
if let Some ( ref pattern) = filter. negative_function_regex {
113
124
Some ( Regex :: new ( pattern) . map_err ( |err| {
@@ -126,14 +137,25 @@ pub fn prepare_filter(
126
137
None
127
138
} ;
128
139
140
+ let negative_library_regex =
141
+ if let Some ( ref pattern) = filter. negative_library_regex {
142
+ Some ( Regex :: new ( pattern) . map_err ( |err| {
143
+ PrepareFilterError :: InvalidRegex ( "negative_library_regex" , err)
144
+ } ) ?)
145
+ } else {
146
+ None
147
+ } ;
148
+
129
149
let mut matched_backtraces = HashSet :: new ( ) ;
130
150
let mut positive_cache = HashMap :: new ( ) ;
131
151
let mut negative_cache = HashMap :: new ( ) ;
132
152
for ( backtrace_id, backtrace) in data. all_backtraces ( ) {
133
- let mut positive_matched = function_regex. is_none ( ) && source_regex. is_none ( ) ;
153
+ let mut positive_matched =
154
+ function_regex. is_none ( ) && source_regex. is_none ( ) && library_regex. is_none ( ) ;
134
155
let mut negative_matched = false ;
135
- let check_negative =
136
- negative_function_regex. is_some ( ) || negative_source_regex. is_some ( ) ;
156
+ let check_negative = negative_function_regex. is_some ( )
157
+ || negative_source_regex. is_some ( )
158
+ || negative_library_regex. is_some ( ) ;
137
159
138
160
for ( frame_id, frame) in backtrace {
139
161
let check_positive = if positive_matched {
@@ -165,6 +187,13 @@ pub fn prepare_filter(
165
187
. map ( |id| data. interner ( ) . resolve ( id) . unwrap ( ) )
166
188
}
167
189
190
+ let mut library = None ;
191
+ if ( check_positive && library_regex. is_some ( ) ) || negative_library_regex. is_some ( ) {
192
+ library = frame
193
+ . library ( )
194
+ . map ( |id| data. interner ( ) . resolve ( id) . unwrap ( ) )
195
+ }
196
+
168
197
if check_positive {
169
198
let matched_function = if let Some ( regex) = function_regex. as_ref ( ) {
170
199
if let Some ( ref function) = function {
@@ -186,7 +215,17 @@ pub fn prepare_filter(
186
215
true
187
216
} ;
188
217
189
- positive_matched = matched_function && matched_source;
218
+ let matched_library = if let Some ( regex) = library_regex. as_ref ( ) {
219
+ if let Some ( ref library) = library {
220
+ regex. is_match ( library)
221
+ } else {
222
+ false
223
+ }
224
+ } else {
225
+ true
226
+ } ;
227
+
228
+ positive_matched = matched_function && matched_source && matched_library;
190
229
positive_cache. insert ( frame_id, positive_matched) ;
191
230
}
192
231
@@ -222,6 +261,16 @@ pub fn prepare_filter(
222
261
}
223
262
}
224
263
264
+ if let Some ( regex) = negative_library_regex. as_ref ( ) {
265
+ if let Some ( ref library) = library {
266
+ if regex. is_match ( library) {
267
+ negative_cache. insert ( frame_id, true ) ;
268
+ negative_matched = true ;
269
+ break ;
270
+ }
271
+ }
272
+ }
273
+
225
274
negative_cache. insert ( frame_id, false ) ;
226
275
}
227
276
}
0 commit comments