@ -78,14 +78,18 @@ private:
/// Adds and analyzes a new subroutine if it is not added yet.
/// Adds and analyzes a new subroutine if it is not added yet.
const Subroutine & AddSubroutine ( u32 begin , u32 end , const std : : string & suffix ) {
const Subroutine & AddSubroutine ( u32 begin , u32 end , const std : : string & suffix ) {
auto iter = subroutines . find ( Subroutine { begin , end , suffix } ) ;
Subroutine subroutine { begin , end , suffix , ExitMethod : : Undetermined , { } } ;
if ( iter ! = subroutines . end ( ) )
const auto iter = subroutines . find ( subroutine ) ;
if ( iter ! = subroutines . end ( ) ) {
return * iter ;
return * iter ;
}
Subroutine subroutine { begin , end , suffix } ;
subroutine . exit_method = Scan ( begin , end , subroutine . labels ) ;
subroutine . exit_method = Scan ( begin , end , subroutine . labels ) ;
if ( subroutine . exit_method = = ExitMethod : : Undetermined )
if ( subroutine . exit_method = = ExitMethod : : Undetermined ) {
throw DecompileFail ( " Recursive function detected " ) ;
throw DecompileFail ( " Recursive function detected " ) ;
}
return * subroutines . insert ( std : : move ( subroutine ) ) . first ;
return * subroutines . insert ( std : : move ( subroutine ) ) . first ;
}
}