@@ -11,6 +11,8 @@ use alloc::collections::BTreeMap;
11
11
use core:: cell:: RefCell ;
12
12
#[ cfg( span_locations) ]
13
13
use core:: cmp;
14
+ #[ cfg( all( span_locations, not( fuzzing) ) ) ]
15
+ use core:: cmp:: Ordering ;
14
16
use core:: fmt:: { self , Debug , Display , Write } ;
15
17
use core:: mem:: ManuallyDrop ;
16
18
#[ cfg( span_locations) ]
@@ -455,35 +457,39 @@ impl SourceMap {
455
457
span
456
458
}
457
459
458
- fn filepath ( & self , span : Span ) -> String {
459
- for ( i, file) in self . files . iter ( ) . enumerate ( ) {
460
- if file. span_within ( span) {
461
- return if i == 0 {
462
- "<unspecified>" . to_owned ( )
463
- } else {
464
- format ! ( "<parsed string {}>" , i)
465
- } ;
460
+ fn find ( & self , span : Span ) -> usize {
461
+ match self . files . binary_search_by ( |file| {
462
+ if file. span . hi < span. lo {
463
+ Ordering :: Less
464
+ } else if file. span . lo > span. hi {
465
+ Ordering :: Greater
466
+ } else {
467
+ assert ! ( file. span_within( span) ) ;
468
+ Ordering :: Equal
466
469
}
470
+ } ) {
471
+ Ok ( i) => i,
472
+ Err ( _) => unreachable ! ( "Invalid span with no related FileInfo!" ) ,
467
473
}
468
- unreachable ! ( "Invalid span with no related FileInfo!" ) ;
469
474
}
470
475
471
- fn fileinfo ( & self , span : Span ) -> & FileInfo {
472
- for file in & self . files {
473
- if file. span_within ( span) {
474
- return file;
475
- }
476
+ fn filepath ( & self , span : Span ) -> String {
477
+ let i = self . find ( span) ;
478
+ if i == 0 {
479
+ "<unspecified>" . to_owned ( )
480
+ } else {
481
+ format ! ( "<parsed string {}>" , i)
476
482
}
477
- unreachable ! ( "Invalid span with no related FileInfo!" ) ;
483
+ }
484
+
485
+ fn fileinfo ( & self , span : Span ) -> & FileInfo {
486
+ let i = self . find ( span) ;
487
+ & self . files [ i]
478
488
}
479
489
480
490
fn fileinfo_mut ( & mut self , span : Span ) -> & mut FileInfo {
481
- for file in & mut self . files {
482
- if file. span_within ( span) {
483
- return file;
484
- }
485
- }
486
- unreachable ! ( "Invalid span with no related FileInfo!" ) ;
491
+ let i = self . find ( span) ;
492
+ & mut self . files [ i]
487
493
}
488
494
}
489
495
0 commit comments