package Ġorg . jetbrains . research . k ex . trace .` object ` Ċ Ċ import Ġorg . jetbrains . research . k the l per . assert . unreachable Ċ import Ġorg . jetbrains . research . k the l per . collection . stack Of Ċ import Ġorg . jetbrains . research . k the l per . logging . log Ċ import Ġorg . jetbrains . research . k ex . trace . Trace Manager Ċ import Ġorg . jetbrains . research . k fg . ir . BasicBlock Ċ import Ġorg . jetbrains . research . k fg . ir . Method Ċ Ċ class ĠObject Trace Manager Ġ: ĠTrace Manager < Trace > Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmethod Infos Ġ= Ġmutable Map Of < Method , ĠMutable Set < Trace >>() ĊĠĠĠ Ġprivate Ġval Ġfull Tr aces Ġ= Ġmutable Set Of < Trace >() ĊĊĠĠĠ Ġoverride Ġfun Ġget Tr aces ( method : ĠMethod ): ĠList < Trace > Ġ= Ġmethod Infos . get OrDefault ( method , Ġmutable Set Of ()). toList () ĊĊĠĠĠ Ġoverride Ġfun Ġadd Trace ( method : ĠMethod , Ġtrace : ĠTrace ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfull Tr aces Ġ+= Ġtrace ĊĠĠĠĠĠĠĠ Ġval Ġtrace Stack Ġ= Ġstack Of < Mutable List < Action >>() ĊĠĠĠĠĠĠĠ Ġval Ġmethod Stack Ġ= Ġstack Of < Method >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( action Ġin Ġtrace ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMethod Entry Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrace Stack . push ( mutable ListOf ( action )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Stack . push ( action . method ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStatic Init Entry Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrace Stack . push ( mutable ListOf ( action )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Stack . push ( action . method ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMethod Return , Ġis ĠMethod Throw , Ġis ĠStatic Init Exit Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Trace Ġ= Ġtrace Stack . pop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Trace Ġ+= Ġaction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Infos . get Or Put ( method Stack . pop (), Ġ:: mutable Set Of ) Ġ+= ĠTrace ( method Trace ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMethod Call Ġ-> Ġ{ Ġ/* Ġdo Ġnothing Ġ*/ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMethod Action Ġ-> Ġunreachable Ġ{ Ġlog . error (" Unknown Ġmethod Ġaction : Ġ$ action ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrace Stack . peek () Ġ+= Ġaction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġassert ( method Stack . size Ġ== Ġtrace Stack . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Unexpected Ġtrace : Ġnumber Ġof Ġmethod Ġdoes Ġnot Ġcorrespond Ġto Ġnumber Ġof Ġtrace Ġactions ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhile Ġ( method Stack . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Infos . get Or Put ( method Stack . pop (), Ġ:: mutable Set Of ) Ġ+= ĠTrace ( trace Stack . pop ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Cover ed ( method : ĠMethod , Ġbb : ĠBasic Block ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Infos [ method ]?. any Ġ{ Ġit . is Cover ed ( bb ) Ġ} Ġ?: Ġfalse Ċ }