@@ -400,56 +400,32 @@ impl<'data> ProguardCache<'data> {
400400 } )
401401 }
402402
403- /// Determines if a frame refers to an outline method, either via the
404- /// method-level flag or via any matching mapping entry for the frame line.
405- fn is_outline_frame (
406- & self ,
407- class : & str ,
408- method : & str ,
409- line : usize ,
410- parameters : Option < & str > ,
411- ) -> bool {
403+ /// Determines if a frame refers to an outline method via the method-level flag.
404+ /// Outline metadata is consistent across all mapping entries for a method, so
405+ /// we only need to inspect the method metadata instead of individual lines.
406+ pub fn is_outline_frame ( & self , class : & str , method : & str ) -> bool {
412407 let Some ( class) = self . get_class ( class) else {
413408 return false ;
414409 } ;
415410
416- let candidates: & [ raw:: Member ] = if let Some ( params) = parameters {
417- let Some ( members) = self . get_class_members_by_params ( class) else {
418- return false ;
419- } ;
420- let Some ( range) = Self :: find_range_by_binary_search ( members, |m| {
421- let Ok ( obfuscated_name) = self . read_string ( m. obfuscated_name_offset ) else {
422- return Ordering :: Greater ;
423- } ;
424- let p = self . read_string ( m. params_offset ) . unwrap_or_default ( ) ;
425- ( obfuscated_name, p) . cmp ( & ( method, params) )
426- } ) else {
427- return false ;
428- } ;
429- range
430- } else {
431- let Some ( members) = self . get_class_members ( class) else {
432- return false ;
433- } ;
434- let Some ( range) = Self :: find_range_by_binary_search ( members, |m| {
435- let Ok ( obfuscated_name) = self . read_string ( m. obfuscated_name_offset ) else {
436- return Ordering :: Greater ;
437- } ;
438- obfuscated_name. cmp ( method)
439- } ) else {
440- return false ;
411+ let Some ( members) = self . get_class_members ( class) else {
412+ return false ;
413+ } ;
414+
415+ let Some ( candidates) = Self :: find_range_by_binary_search ( members, |m| {
416+ let Ok ( obfuscated_name) = self . read_string ( m. obfuscated_name_offset ) else {
417+ return Ordering :: Greater ;
441418 } ;
442- range
419+ obfuscated_name. cmp ( method)
420+ } ) else {
421+ return false ;
443422 } ;
444423
445- candidates. iter ( ) . any ( |m| {
446- m. is_outline ( )
447- && ( m. endline == 0 || ( line >= m. startline as usize && line <= m. endline as usize ) )
448- } )
424+ candidates. first ( ) . is_some_and ( |member| member. is_outline ( ) )
449425 }
450426
451427 /// Applies any carried outline position to the frame line and returns the adjusted frame.
452- fn prepare_frame_for_mapping < ' a > (
428+ pub fn prepare_frame_for_mapping < ' a > (
453429 & self ,
454430 frame : & StackFrame < ' a > ,
455431 carried_outline_pos : & mut Option < usize > ,
@@ -483,12 +459,7 @@ impl<'data> ProguardCache<'data> {
483459 None => match stacktrace:: parse_frame ( line) {
484460 None => writeln ! ( & mut stacktrace, "{line}" ) ?,
485461 Some ( frame) => {
486- if self . is_outline_frame (
487- frame. class ,
488- frame. method ,
489- frame. line ,
490- frame. parameters ,
491- ) {
462+ if self . is_outline_frame ( frame. class , frame. method ) {
492463 carried_outline_pos = Some ( frame. line ) ;
493464 } else {
494465 let effective_frame =
@@ -520,12 +491,7 @@ impl<'data> ProguardCache<'data> {
520491 }
521492 } ,
522493 Some ( frame) => {
523- if self . is_outline_frame (
524- frame. class ,
525- frame. method ,
526- frame. line ,
527- frame. parameters ,
528- ) {
494+ if self . is_outline_frame ( frame. class , frame. method ) {
529495 carried_outline_pos = Some ( frame. line ) ;
530496 continue ;
531497 }
@@ -549,7 +515,7 @@ impl<'data> ProguardCache<'data> {
549515 let mut carried_outline_pos: Option < usize > = None ;
550516 let mut frames: Vec < StackFrame < ' a > > = Vec :: with_capacity ( trace. frames . len ( ) ) ;
551517 for f in trace. frames . iter ( ) {
552- if self . is_outline_frame ( f. class , f. method , f . line , f . parameters ) {
518+ if self . is_outline_frame ( f. class , f. method ) {
553519 carried_outline_pos = Some ( f. line ) ;
554520 continue ;
555521 }
0 commit comments