/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 9 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . idea . debugger . coroutine . command Ċ Ċ import Ġcom . intellij . debugger . Debugger Manager Ex Ċ import Ġcom . intellij . debugger . engine .* Ċ import Ġcom . intellij . debugger . j di . Classes ByName Provider Ċ import Ġcom . intellij . debugger . j di . Generated Location Ċ import Ġcom . intellij . debugger . j di . Stack Frame Proxy Impl Ċ import Ġcom . intellij . debugger . j di . Thread Reference Proxy Impl Ċ import Ġcom . intellij . debugger . memory . utils . Stack Frame Item Ċ import Ġcom . intellij . debugger . ui . impl . watch . Methods Tracker Ċ import Ġcom . intellij . debugger . ui . impl . watch . Stack Frame Descriptor Impl Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . util . containers . Container Util Ċ import Ġcom . intellij . x debugger . X Source Position Ċ import Ġcom . intellij . x debugger . frame . X Execution Stack Ċ import Ġcom . intellij . x debugger . frame . X Stack Frame Ċ import Ġcom . intellij . x debugger . frame . X Suspend Context Ċ import Ġcom . sun . j di .* Ċ import Ġorg . jetbrains . kotlin . idea . debugger .* Ċ import Ġorg . jetbrains . kotlin . idea . debugger . coroutine . Coroutine Async StackTrace Provider Ċ import Ġorg . jetbrains . kotlin . idea . debugger . coroutine . data . Coroutine Info Data Ċ import Ġorg . jetbrains . kotlin . idea . debugger . coroutine . data . Suspend Stack Frame Descriptor Ċ import Ġorg . jetbrains . kotlin . idea . debugger . coroutine . data . Synt hetic Stack Frame Ċ import Ġorg . jetbrains . kotlin . idea . debugger . coroutine . proxy . Async StackTrace Context Ċ import Ġorg . jetbrains . kotlin . idea . debugger . coroutine . util . Empty Stack Frame Descriptor Ċ import Ġorg . jetbrains . kotlin . idea . debugger . coroutine . util . logger Ċ import Ġorg . jetbrains . kotlin . idea . debugger . evaluate . ExecutionContext ĊĊ Ċ class ĠCor outine Builder ( val Ġsuspend Context : ĠX Suspend Context ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmethods Tracker Ġ= ĠMethods Tracker () ĊĠĠĠ Ġprivate Ġval Ġcoroutine Stack Frame Provider Ġ= ĠCor outine Async StackTrace Provider () ĊĠĠĠ Ġval Ġdebug Process Ġ= Ġ( suspend Context Ġas ĠS uspend Context Impl ). debug Process ĊĠĠĠ Ġval Ġvirtual Machine Proxy Ġ= Ġdebug Process . virtual Machine Proxy ĊĠĠĠ Ġval Ġclasses ByName Ġ= ĠClasses ByName Provider . create Cache ( virtual Machine Proxy . all Classes ()) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠCRE ATION _ STACK _ TRACE _ SEPARATOR Ġ= Ġ"\ b \ b \ b " Ġ// Ġthe Ġ"\ b \ b \ b " Ġis Ġused Ġfor Ġcreation Ġstack trace Ġseparator Ġin Ġkotlinx . coroutines ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild ( coroutine : ĠCor outine Info Data ): ĠList < Coroutine Stack Frame Item > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcoroutine Stack Frame List Ġ= Ġmutable ListOf < Coroutine Stack Frame Item >() ĊĠĠĠĠĠĠĠ Ġval Ġfirst Sus pended Stack Frame Proxy Impl Ġ= Ġfirst Sus pended Thread Frame () ĊĠĠĠĠĠĠĠ Ġval Ġcreation Frame Separator Index Ġ= Ġfind Creation Frame Index ( coroutine . stack Trace ) ĊĠĠĠĠĠĠĠ Ġval Ġposition Manager Ġ= Ġdebug Process . position Manager ĊĊĠĠĠĠĠĠĠ Ġif Ġ( coroutine . state Ġ== ĠCor outine Info Data . State . RUNNING Ġ&& Ġcoroutine . active Thread Ġis ĠThread Reference ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthread Reference Proxy Impl Ġ= Ġrunning Thread Proxy ( coroutine . active Thread ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexecution Stack Ġ= ĠJava Execution Stack ( thread Reference Proxy Impl , Ġdebug Process , Ġsus pended Same Thread ( coroutine . active Thread )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġframes Ġ= Ġthread Reference Proxy Impl . force Frames () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresume Method Index Ġ= Ġfind Resume Method Index ( frames ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( frame Index Ġin Ġ 0 .. frames . last Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrunning Stack Frame Proxy Ġ= Ġframes [ frame Index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( frame Index Ġ== Ġresume Method Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Frame Ġ= Ġframes [ resume Method Index Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Java Frame Ġ= ĠJava Stack Frame ( Stack Frame Descriptor Impl ( previous Frame , Ġmethods Tracker ), Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġasync StackTrace Ġ= Ġcoroutine Stack Frame Provider ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Async StackTrace ( previous Java Frame , Ġsuspend Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync StackTrace ?. forEach Ġ{ Ġasync Frame Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Stack Frame Ġ= ĠJava Stack Frame ( Stack Frame Descriptor Impl ( previous Frame , Ġmethods Tracker ), Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Stack Frame List . add ( Async Coroutine Stack Frame Item ( running Stack Frame Proxy , Ġasync Frame , Ġx Stack Frame )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Stack Frame Ġ= Ġexecution Stack . create Stack Frame ( running Stack Frame Proxy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Stack Frame List . add ( Running Coroutine Stack Frame Item ( running Stack Frame Proxy , Ġx Stack Frame )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(( coroutine . state Ġ== ĠCor outine Info Data . State . SUS PEN DED Ġ|| Ġcoroutine . active Thread Ġ== Ġnull ) Ġ&& Ġcoroutine . last Ob served Frame Field Ref Ġis ĠObject Reference ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġget Ġframes Ġfrom ĠCor outine Info Ġanyway ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġthread Ġis Ġpaused Ġon Ġbreakpoint Ġ- Ġit Ġhas Ġat Ġleast Ġone Ġframe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsus pended StackTrace Ġ= Ġcoroutine . stack Trace . take ( creation Frame Separator Index Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( sus pended Frame Ġin Ġsus pended StackTrace ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsus pended X Stack Frame Ġ= Ġstack Frame ( position Manager , Ġfirst Sus pended Stack Frame Proxy Impl , Ġsus pended Frame ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Stack Frame List . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS uspend Coroutine Stack Frame Item ( first Sus pended Stack Frame Proxy Impl , Ġsus pended Frame , Ġsus pended X Stack Frame , Ġcoroutine . last Ob served Frame Field Ref ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġexecution Stack Ġ= ĠJava Execution Stack ( sus pended Thread Proxy (), Ġdebug Process , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġx Stack Frame Ġ= Ġexecution Stack . create Stack Frame ( first Sus pended Stack Frame Proxy Impl ) ĊĊĠĠĠĠĠĠĠ Ġcoroutine . stack Trace . sub List ( creation Frame Separator Index Ġ+ Ġ 1 , Ġcoroutine . stack Trace . size ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlocation Ġ= Ġcreate Location ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Stack Frame List . add ( Creation Coroutine Stack Frame Item ( first Sus pended Stack Frame Proxy Impl , Ġit , Ġx Stack Frame , Ġlocation )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcoroutine . stack Frame List . addAll ( coroutine Stack Frame List ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcoroutine Stack Frame List ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsus pended Same Thread ( active Thread : ĠThread Reference ) Ġ= ĊĠĠĠĠĠĠĠ Ġactive Thread Ġ== Ġsus pended Thread Proxy (). thread Reference ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Location ( stack Trace Element : ĠStack Trace Element ): ĠLocation Ġ= Ġfind Location ( ĊĠĠĠĠĠĠĠ ĠContainer Util . getFirst Item ( classes ByName [ stack Trace Element . className ]), ĊĠĠĠĠĠĠĠ Ġstack Trace Element . methodName , ĊĠĠĠĠĠĠĠ Ġstack Trace Element . line Number ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġfind Location ( ĊĠĠĠĠĠĠĠ Ġtype : ĠReference Type ?, ĊĠĠĠĠĠĠĠ ĠmethodName : ĠString , ĊĠĠĠĠĠĠĠ Ġline : ĠInt ĊĠĠĠ Ġ): ĠLocation Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( type Ġ!= Ġnull Ġ&& Ġline Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= Ġtype . locations Of Line ( Debug Process . JAVA _ STR AT UM , Ġnull , Ġline ). stream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġl : ĠLocation Ġ-> Ġl . method (). name () Ġ== ĠmethodName Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. findFirst (). orElse ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( location Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlocation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠAbs ent Information Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠGenerated Location ( debug Process , Ġtype , ĠmethodName , Ġline ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstack Frame ( position Manager : ĠCompound Position Manager , Ġrunning Stack Frame Proxy : ĠStack Frame Proxy Impl , Ġlocation : ĠLocation ): ĠX Stack Frame Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġposition Manager . create Stack Frame ( running Stack Frame Proxy , Ġdebug Process , Ġlocation ) !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstack Frame ( position Manager : ĠCompound Position Manager , Ġrunning Stack Frame Proxy : ĠStack Frame Proxy Impl , Ġstack Trace Element : ĠStack Trace Element ) Ġ: ĠX Stack Frame Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= Ġcreate Location ( stack Trace Element ) ĊĠĠĠĠĠĠĠ Ġreturn Ġposition Manager . create Stack Frame ( running Stack Frame Proxy , Ġdebug Process , Ġlocation ) !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠT ries Ġto Ġfind Ġcreation Ġframe Ġseparator Ġif Ġany , Ġreturns Ġlast Ġindex Ġif Ġnone Ġfound ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġfind Creation Frame Index ( frames : ĠList < StackTrace Element >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġframes . indexOf First Ġ{ Ġis Creation Separator Frame ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( index Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġframes . last Index ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Creation Separator Frame ( it : ĠStack Trace Element ) Ġ= ĊĠĠĠĠĠĠĠ Ġit . className . startsWith ( CRE ATION _ STACK _ TRACE _ SEPARATOR ) ĊĊĠĠĠ Ġprivate Ġfun Ġfirst Sus pended Thread Frame (): ĠStack Frame Proxy Impl Ġ= ĊĠĠĠĠĠĠĠ Ġsus pended Thread Proxy (). force Frames (). first () ĊĊĠĠĠ Ġ// Ġretrieves Ġcurrently Ġsus pended Ġbut Ġactive Ġand Ġexecuting Ġcoroutine Ġthread Ġproxy ĊĠĠĠ Ġfun Ġrunning Thread Proxy ( thread Reference : ĠThread Reference ) Ġ= ĊĠĠĠĠĠĠĠ ĠThread Reference Proxy Impl ( debug Process . virtual Machine Proxy , Ġthread Reference ) ĊĊĠĠĠ Ġ// Ġretrieves Ġcurrent Ġsus pended Ġthread Ġproxy ĊĠĠĠ Ġprivate Ġfun Ġsus pended Thread Proxy (): ĠThread Reference Proxy Impl Ġ= ĊĠĠĠĠĠĠĠ Ġ( suspend Context Ġas ĠS uspend Context Impl ). thread !! Ġ// Ġ@ TODO Ġhash Ġreplace Ġ!! ĊĊĠĠĠ Ġprivate Ġfun Ġfind Resume Method Index ( frames : ĠList < Stack Frame Proxy Impl >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i : ĠInt Ġin Ġframes . last Index Ġdown To Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Resume Method Frame ( frames [ i ])) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġi ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Resume Method Frame ( frame : ĠStack Frame Proxy Impl ) Ġ= ĊĠĠĠĠĠĠĠ Ġframe . safe Location ()?. safe Method ()?. name () Ġ== Ġ" resume With " ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Synt hetic Stack Frame ( ĊĠĠĠĠĠĠĠ Ġdescriptor : ĠS uspend Stack Frame Descriptor , ĊĠĠĠĠĠĠĠ Ġpos : ĠX Source Position , ĊĠĠĠĠĠĠĠ Ġproject : ĠProject ĊĠĠĠ Ġ): ĠPair < X Execution Stack , ĠSynt hetic Stack Frame >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠDebugger Manager Ex . getInstance Ex ( project ). context ĊĠĠĠĠĠĠĠ Ġval Ġsuspend Context Ġ= Ġcontext . suspend Context Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġproxy Ġ= Ġsuspend Context . thread Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġexecution Stack Ġ= ĠJava Execution Stack ( proxy , Ġsuspend Context . debug Process , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġexecution Stack . init Top Frame () ĊĠĠĠĠĠĠĠ Ġval Ġeval Context Ġ= Ġcontext . create Evaluation Context () ĊĠĠĠĠĠĠĠ Ġval Ġframe Proxy Ġ= Ġeval Context ?. frame Proxy Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġexec Context Ġ= ĠExecutionContext ( eval Context , Ġframe Proxy ) ĊĠĠĠĠĠĠĠ Ġval Ġcontinuation Ġ= Ġdescriptor . continu ation Ġ// Ġguaranteed Ġthat Ġit Ġis Ġa ĠBase Continuation Impl ĊĠĠĠĠĠĠĠ Ġval Ġa Method Ġ= Ġ( continu ation . type () Ġas ĠClass Type ). concrete Method ByName ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" get StackTrace Element ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" () Ljava / lang / StackTrace Element ;" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġvars Ġ= Ġwith ( Coroutine Async StackTrace Provider ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAsync StackTrace Context ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexec Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa Method ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). get Sp illed Variables ( continu ation ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġexecution Stack Ġto ĠSynt hetic Stack Frame ( descriptor , Ġvars , Ġpos ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠCreation Coroutine Stack Frame Item ( ĊĠĠĠ Ġframe : ĠStack Frame Proxy Impl , ĊĠĠĠ Ġval Ġstack Trace Element : ĠStack Trace Element , ĊĠĠĠ Ġstack Frame : ĠX Stack Frame , ĊĠĠĠ Ġval Ġlocation : ĠLocation Ċ ) Ġ: ĠCor outine Stack Frame Item ( frame , Ġstack Frame ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġlocation () Ġ= Ġlocation ĊĊĠĠĠ Ġfun Ġempty Descriptor () Ġ= ĊĠĠĠĠĠĠĠ ĠEmpty Stack Frame Descriptor ( stack Trace Element , Ġframe ) Ċ } Ċ Ċ class ĠS uspend Coroutine Stack Frame Item ( ĊĠĠĠ Ġframe : ĠStack Frame Proxy Impl , ĊĠĠĠ Ġval Ġstack Trace Element : ĠStack Trace Element , ĊĠĠĠ Ġstack Frame : ĠX Stack Frame , ĊĠĠĠ Ġval Ġlast Ob served Frame Field Ref : ĠObject Reference Ċ ) Ġ: ĠCor outine Stack Frame Item ( frame , Ġstack Frame ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġlocation () Ġ= Ġframe . location () ĊĊĠĠĠ Ġfun Ġempty Descriptor () Ġ= ĊĠĠĠĠĠĠĠ ĠEmpty Stack Frame Descriptor ( stack Trace Element , Ġframe ) Ċ } Ċ Ċ class ĠAsync Coroutine Stack Frame Item ( ĊĠĠĠ Ġframe : ĠStack Frame Proxy Impl , ĊĠĠĠ Ġval Ġframe Item : ĠStack Frame Item , ĊĠĠĠ Ġstack Frame : ĠX Stack Frame Ċ ) Ġ: ĠCor outine Stack Frame Item ( frame , Ġstack Frame ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġlocation () Ġ: ĠLocation Ġ= Ġframe . location () Ċ } Ċ Ċ class ĠRunning Coroutine Stack Frame Item ( ĊĠĠĠ Ġframe : ĠStack Frame Proxy Impl , ĊĠĠĠ Ġstack Frame : ĠX Stack Frame Ċ ) Ġ: ĠCor outine Stack Frame Item ( frame , Ġstack Frame ) Ġ{ ĊĠĠĠ Ġval Ġlocation Ġ= Ġframe . location () Ġ// Ġit Ġshould Ġbe Ġinvoked Ġin Ġmanager Ġthread ĊĊĠĠĠ Ġoverride Ġfun Ġlocation () Ġ= Ġlocation Ċ } Ċ Ċ abstract Ġclass ĠCor outine Stack Frame Item ( val Ġframe : ĠStack Frame Proxy Impl , Ġval Ġstack Frame : ĠX Stack Frame ) Ġ{ ĊĠĠĠ Ġval Ġlog Ġby Ġlogger ĊĊĠĠĠ Ġfun Ġsource Position () Ġ: ĠX Source Position ? Ġ= Ġstack Frame . source Position ĊĊĠĠĠ Ġabstract Ġfun Ġlocation (): ĠLocation ĊĊĠĠĠ Ġfun Ġunique Id (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= Ġlocation () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlocation . safe Source Name () Ġ+ Ġ":" Ġ+ Ġlocation . safe Method (). toString () Ġ+ Ġ":" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation . safe LineNumber () Ġ+ Ġ":" Ġ+ Ġlocation . safe Source LineNumber () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlocation . method (). toString () Ġ+ Ġ":" Ġ+ Ġlocation . line Number () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }