package Ġdev . reform ator . stack trace decor out inator . stdlib Ċ Ċ import Ġdev . reform ator . stack trace decor out inator . common .* Ċ import Ġjava . lang . invoke . Method Handle Ċ import Ġjava . util . function . Bi Function Ċ import Ġkotlin . coroutines . Continuation Ċ import Ġkotlin . coroutines . intr insics . COR OUT INE _ SUS PEN DED Ċ import Ġkotlin . coroutines . jvm . internal . Base Continuation Impl Ċ Ċ internal Ġfun ĠBase Continuation Impl . decor out inator Resume With ( ĊĠĠĠ Ġresult : ĠResult < Any ? >, ĊĠĠĠ Ġinvoke Suspend Func : ĠBase Continuation Impl .( Result < Any ?> ) Ġ-> ĠAny ?, ĊĠĠĠ Ġrelease Intercept ed Func : ĠBase Continuation Impl . () Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ Ġval Ġbase Continu ations Ġ= Ġbuild List Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcompletion : ĠContinu ation < Any ?> Ġ= Ġthis @ decor out inator Resume With ĊĠĠĠĠĠĠĠ Ġwhile Ġ( completion Ġis ĠBase Continuation Impl ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( completion ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompletion Ġ= Ġcompletion . completion !! ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreverse () ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġbottom Continuation Ġ= Ġbase Continu ations [ 0 ]. completion !! ĊĠĠĠ Ġval Ġstack trace Depth Ġ= Ġbase Continu ations . last Index ĊĠĠĠ Ġval Ġstack trace Handles Ġ= ĠArray ( stack trace Depth ) Ġ{ Ġunknown Stack trace Method Handle Ġ} ĊĠĠĠ Ġval Ġstack trace Line Numbers Ġ= ĠInt Array ( stack trace Depth ) Ġ{ Ġ- 1 Ġ} ĊĠĠĠ Ġval Ġstack trace Elements Ġ= Ġdecor out inator Registry . continu ation Stack trace Element Registry ĊĠĠĠĠĠĠĠ Ġ. get Stack trace Elements ( base Continu ations ) ĊĠĠĠ Ġfill Stack trace Arrays ( base Continu ations , Ġstack trace Elements , Ġstack trace Depth , Ġstack trace Handles , Ġstack trace Line Numbers ) ĊĠĠĠ Ġval Ġinvoke Coroutine Function Ġ= ĠBi Function Ġ{ Ġindex : ĠInt , Ġresult : ĠAny ? Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġcontinuation Ġ= Ġbase Continu ations [ index ] ĊĠĠĠĠĠĠĠ ĠJava Utils Impl . probe Coroutine Res umed ( continu ation ) ĊĠĠĠĠĠĠĠ Ġval Ġnew Result Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Result Ġ= Ġcontinuation . invoke Suspend Func ( Result . success ( result )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Result Ġ=== ĠCOR OUT INE _ SUS PEN DED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Bi Function ĠCOR OUT INE _ SUS PEN DED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResult . success ( new Result ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResult . failure ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcontinuation . release Intercept ed Func () ĊĠĠĠĠĠĠĠ ĠJava Utils Impl . instance . retrieve Result Value ( new Result ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( result . is Failure Ġ&& Ġdecor out inator Registry . recovery Explicit Stack trace ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexception Ġ= ĠJava Utils Impl . instance . retrieve Result Throwable ( result ) ĊĠĠĠĠĠĠĠ Ġrecovery Explicit Stack trace ( exception , Ġbase Continu ations , Ġstack trace Elements ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġbottom Result Ġ= Ġcall Stack trace Handles ( ĊĠĠĠĠĠĠĠ Ġstack trace Handles Ġ= Ġstack trace Handles , ĊĠĠĠĠĠĠĠ Ġline Numbers Ġ= Ġstack trace Line Numbers , ĊĠĠĠĠĠĠĠ Ġnext Step Index Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġinvoke Coroutine Function Ġ= Ġinvoke Coroutine Function , ĊĠĠĠĠĠĠĠ Ġresult Ġ= ĠJava Utils Impl . instance . retrieve Result Value ( result ), ĊĠĠĠĠĠĠĠ Ġcoroutine Suspend Ġ= ĠCOR OUT INE _ SUS PEN DED ĊĠĠĠ Ġ) ĊĠĠĠ Ġif Ġ( bottom Result Ġ=== ĠCOR OUT INE _ SUS PEN DED ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġbottom Continuation . resume With ( Result . success ( bottom Result )) Ċ } Ċ Ċ private Ġfun Ġfill Stack trace Arrays ( ĊĠĠĠ Ġbase Continu ations : ĠList < Base Continuation Impl >, ĊĠĠĠ Ġstack trace Elements : ĠDecor out inator Continuation Stack trace Elements , ĊĠĠĠ Ġstack trace Depth : ĠInt , ĊĠĠĠ Ġstack trace Handles : ĠArray < Method Handle >, ĊĠĠĠ Ġstack trace Line Numbers : ĠInt Array Ċ ) Ġ{ ĊĠĠĠ Ġval Ġstack trace Element 2 Stack trace Method Handle Ġ= Ġdecor out inator Registry . stack trace Method Handle Registry ĊĠĠĠĠĠĠĠ Ġ. get Stack trace Method Handles ( stack trace Elements . possible Elements ) ĊĠĠĠ Ġ( 0 Ġuntil Ġstack trace Depth ). forEach Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġcontinuation Ġ= Ġbase Continu ations [ index ] ĊĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġstack trace Elements . continu ation 2 Element [ continu ation ] ĊĠĠĠĠĠĠĠ Ġif Ġ( element Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack trace Handles [ index ] Ġ= Ġstack trace Element 2 Stack trace Method Handle [ element ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack trace Line Numbers [ index ] Ġ= Ġelement . line Number ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġrecovery Explicit Stack trace ( ĊĠĠĠ Ġexception : ĠThrowable , ĊĠĠĠ Ġbase Continu ations : ĠList < Base Continuation Impl >, ĊĠĠĠ Ġstack trace Elements : ĠDecor out inator Continuation Stack trace Elements Ċ ) Ġ{ ĊĠĠĠ Ġval Ġre covered Stack trace Ġ= ĠArray ( exception . stack Trace . size Ġ+ Ġbase Continu ations . size Ġ+ Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ< Ġbase Continu ations . size Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontinuation Ġ= Ġbase Continu ations [ base Continu ations . last Index Ġ- Ġit ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġstack trace Elements . continu ation 2 Element [ continu ation ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġart ificial Frame (" unknown ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStack Trace Element ( element . className , Ġelement . methodName , Ġelement . fileName , Ġelement . line Number ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ== Ġbase Continu ations . size Ġ-> Ġart ificial Frame (" boundary ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġexception . stack Trace [ it Ġ- Ġbase Continu ations . size Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġexception . stack Trace Ġ= Ġre covered Stack trace Ċ } Ċ Ċ private Ġfun Ġart ificial Frame ( message : ĠString ) Ġ= ĊĠĠĠ ĠStack Trace Element ("", Ġ"", Ġmessage , Ġ- 1 ) ĊĊ