@@ -11,6 +11,8 @@ use alloc::collections::BTreeMap;
1111use core:: cell:: RefCell ;
1212#[ cfg( span_locations) ]
1313use core:: cmp;
14+ #[ cfg( all( span_locations, not( fuzzing) ) ) ]
15+ use core:: cmp:: Ordering ;
1416use core:: fmt:: { self , Debug , Display , Write } ;
1517use core:: mem:: ManuallyDrop ;
1618#[ cfg( span_locations) ]
@@ -455,35 +457,39 @@ impl SourceMap {
455457 span
456458 }
457459
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
466469 }
470+ } ) {
471+ Ok ( i) => i,
472+ Err ( _) => unreachable ! ( "Invalid span with no related FileInfo!" ) ,
467473 }
468- unreachable ! ( "Invalid span with no related FileInfo!" ) ;
469474 }
470475
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)
476482 }
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]
478488 }
479489
480490 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]
487493 }
488494}
489495
0 commit comments