/* Ċ * ĠCopyright Ġ 2 0 1 9 Ġpeng u in _ ww y < 9 4 0 3 7 5 6 0 6 @ qq . com > Ċ * Ċ * ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ * Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ * ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ * Ċ * ĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ * Ċ * ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ * Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ * ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ * ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ * Ġlimitations Ġunder Ġthe ĠLicense . Ċ */ Ċ Ċ package Ġcom . ded x . transform Ċ Ċ import Ġcom . android . dx . io . Op codes Ċ import Ġcom . android . dx . io . instructions . Decoded Instruction Ċ import Ġcom . android . dx . io . instructions . One Register Decoded Instruction Ċ import Ġcom . android . dx . io . instructions . Register Range Decoded Instruction Ċ import Ġcom . android . dx . io . instructions . Three Register Decoded Instruction Ċ import Ġcom . android . dx . io . instructions . Two Register Decoded Instruction Ċ import Ġcom . android . dx . io . instructions . Zero Register Decoded Instruction Ċ import Ġcom . ded x . dex . pass . CFG Build Pass Ċ import Ġcom . ded x . dex . pass . Data Flow Analysis Pass Ċ import Ġcom . ded x . dex . pass . Data Flow MethodInfo Ċ import Ġcom . ded x . dex . struct . Attr Key Ċ import Ġcom . ded x . dex . struct . Attr Value List Ċ import Ġcom . ded x . dex . struct . Dex Node Ċ import Ġcom . ded x . dex . struct . Field Info Ċ import Ġcom . ded x . dex . struct . Inst Node Ċ import Ġcom . ded x . dex . struct . MethodInfo Ċ import Ġcom . ded x . dex . struct . Method Node Ċ import Ġcom . ded x . dex . struct . type . Basic Type Ċ import Ġcom . ded x . utils . Decode Exception Ċ import Ġcom . ded x . utils . Type Conf li ction Ċ import Ġcom . google . common . f logger . Fluent Logger Ċ import Ġorg . object web . asm . Label Ċ import Ġorg . object web . asm . Method Visitor Ċ Ċ object ĠInvoke Type Ġ{ ĊĠĠĠ Ġval ĠIN VOKE VIRTUAL Ġ= Ġ 1 8 2 Ġ// Ġvisit Method Insn ĊĠĠĠ Ġval ĠIN V OK ES PE CIAL Ġ= Ġ 1 8 3 Ġ// Ġ- ĊĠĠĠ Ġval ĠIN VOKE STATIC Ġ= Ġ 1 8 4 Ġ// Ġ- ĊĠĠĠ Ġval ĠIN VOKE INTERFACE Ġ= Ġ 1 8 5 Ġ// Ġ- ĊĠĠĠ Ġval ĠIN V OK ED Y NAMIC Ġ= Ġ 1 8 6 Ġ// Ġvisit Invoke Dynamic Insn Ċ } Ċ Ċ type alias Ġj vm Op codes Ġ= Ġorg . object web . asm . Op codes Ċ Ċ class ĠMethod Transformer ( val Ġm th Node : ĠMethod Node , Ġprivate Ġval Ġcls Transformer : ĠClass Transformer ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠFluent Logger . for En closing Class () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġj vm Inst Manager Ġ= ĠInst Transformer ( this ) ĊĠĠĠ Ġval Ġblock Map Ġ= ĠHashMap < Label , ĠBasic Block >() ĊĠĠĠ Ġval Ġinst 2 Block Ġ= ĠHashMap < Inst Node , ĠBasic Block >() ĊĠĠĠ Ġvar Ġcurr Block : ĠBasic Block ? Ġ= Ġnull ĊĠĠĠ Ġval Ġdex Node Ġ= Ġm th Node . dex () ĊĠĠĠ Ġvar Ġro p per Ġ= ĠRe R op per ( mth Node . code Size ) ĊĠĠĠ Ġvar Ġentry : ĠBasic Block ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġdf Info : ĠData Flow MethodInfo ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġexits Ġ= ĠArrayList < BasicBlock >() ĊĠĠĠ Ġvar Ġnewest Return : ĠSlot Type ? Ġ= Ġnull Ġ// Ġmark Ġlast Ġtime Ġinvoke - kind 's Ġreturn Ġresult ĊĠĠĠ Ġvar Ġprev LineNumber : ĠInt Ġ= Ġ 0 Ġ// Ġmark Ġlast Ġtime Ġline Ġnumber ĊĠĠĠ Ġvar Ġj vm Label : ĠLabel ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġj vm Label Use : ĠInt Ġ= Ġ 0 Ġ// Ġmark Ġsame Ġlabel Ġused Ġcount ĊĠĠĠ Ġvar Ġj vm Line : ĠInt ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġskip Inst Ġ= Ġ 0 Ġ// Ġmark Ġinstruction Ġnumber Ġwhich Ġskip ĊĠĠĠ Ġval Ġinst Map Ġ= ĠHashMap < Inst Node , ĠList < Jvm Inst >>() ĊĠĠĠ Ġval Ġcurrent Inst List Ġ= ĠArrayList < Jvm Inst >() ĊĠĠĠ Ġ// Ġuse Ġlist Ġfor Ġexception Ġnested ĊĠĠĠ Ġval Ġexception 2 Catch Ġ= ĠHashMap < String Ġ/* exception Ġtype */, ĠMutable List < Pair < Pair < Int Ġ/* start */, ĠInt Ġ/* end */ >, ĠInt Ġ/* catch Ġinst */ >> >() ĊĠĠĠ Ġval Ġcatch 2 Exception Ġ= ĠHashMap < Int Ġ/* catch Ġinst */, ĠMutable List < Pair < String Ġ/* exception Ġtype */, ĠPair < Int Ġ/* start */, ĠInt Ġ/* end */ >>>> () ĊĠĠĠ Ġvar Ġmax Stack Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġmax Local Ġ= Ġ 0 ĊĊĠĠĠ Ġval Ġm th Visit : ĠMethod Visitor Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġcls Transformer . class Writer . visit Method ( mth Node . acc Flags , Ġm th Node . mth Info . name , Ġm th Node . descriptor , Ġnull , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvisit Method Annotation () Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġm th Node . attributes [ Attr Key . AN NOT ATION ]?. getAs Attr Value List () Ġ?: Ġreturn @ apply ĊĠĠĠĠĠĠĠ Ġfor Ġ( value Ġin Ġvalues ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanno Clazz Ġ= Ġvalue . getAs Annotation () Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanno Visitor Ġ= Ġm th Visit . visit Annotation ( anno Clazz . type . descriptor (), Ġanno Clazz . has Visibility ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( anno Value Ġin Ġanno Clazz . values ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanno Visitor . visit ( anno Value . key , Ġanno Value . value . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanno Visitor . visit End () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġparam Anno Visit Ġ= Ġfun ( av s : ĠAttr Value List , Ġi : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( value Ġin Ġav s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanno Clazz Ġ= Ġvalue . getAs Annotation () Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanno Visitor Ġ= Ġm th Visit . visit Parameter Annotation ( i , Ġanno Clazz . type . descriptor (), Ġanno Clazz . has Visibility ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( anno Value Ġin Ġanno Clazz . values ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanno Visitor . visit ( anno Value . key , Ġanno Value . value . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanno Visitor . visit End () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġparam Values Ġ= Ġm th Node . attributes [ Attr Key . M TH _ PARAMETERS _ AN NOT ATION ]?. getAs Attr Value List () Ġ?: Ġreturn @ apply ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġparam Values . value . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanno Values Ġ= Ġparam Values . value [ i ]. getAs Attr Value List () Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparam Anno Visit ( anno Values , Ġi ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvisit Method Body (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( mth Node . no Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mth Node . is Abstract ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm th Visit . visit End () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( mth Node . debug Info Offset Ġ!= ĠDex Node . NO _ INDEX ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Debug Info Visitor . visit Method ( mth Node ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . at Warning (). with Cause ( e ). log ( log Info ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( cls Transformer . config . opt Level Ġ>= ĠConfiguration . Optim ized ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Optimization () Ċ // ĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . at Info (). log (" Start Ġmethod Ġbody Ġ[ ${ log Info ()} ]") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvisit Normal () Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Normal (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStack Frame . init Inst Frame ( mth Node ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Frame Ġ= ĠStack Frame . get Frame Or Put ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( type Ġin Ġm th Node . args List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . at Info (). log (" Set Ġargument Ġ[ ${ slot Num ( type . reg Num )} ] Ġ${ type . type }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry Frame . push Element ( slot Num ( type . reg Num ), Ġtype . type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Exception Stack Frame () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprev LineNumber Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġskip Inst Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġadd ĠJ vm Inst Ġto Ġmanager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( inst Ġin Ġm th Node . code List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inst Ġ== Ġnull ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( skip Inst Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskip Inst -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnormal Process ( inst ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Inst List . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinst Map [ inst ] Ġ= Ġcurrent Inst List . clone () Ġas ĠList < Jvm Inst > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Inst List . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Try Catch Block () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . at Se vere (). with Cause ( e ). log ( log Info ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInst Transformer . throw Error Method ( mth Visit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm th Visit . visit Code () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġj vm Inst Manager . visit Jvm Inst ( cls Transformer . config ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . at Se vere (). with Cause ( e ). log ( log Info ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInst Transformer . throw Error Method ( mth Visit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġnow Ġset ĠCOMP UTE _ MAX _ STACK _ AND _ LOCAL Ġflag ĊĠĠĠĠĠĠĠ Ġm th Visit . visit Max s ( max Stack , Ġmax Local ) ĊĠĠĠĠĠĠĠ Ġm th Visit . visit End () ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Optimization (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠCFG Build Pass . visit ( this ) ĊĠĠĠĠĠĠĠ Ġdf Info Ġ= ĠData Flow Analysis Pass . visit ( this ) ĊĠĠĠĠĠĠĠ ĠData Flow Analysis Pass . li ven ess Analyzer ( df Info !! ) ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġtran form Ġby Ġoptimize ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Exception Stack Frame () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( tc Block Ġin Ġm th Node . try Block List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ġ= Ġtc Block . inst List [ 0 ]. cursor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= Ġ( mth Node . getNext Inst ( tc Block . inst List . last (). cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠDecode Exception (" try Ġblock Ġend Ġout Ġof Ġbounds ")). cursor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( exec Ġin Ġtc Block . exec Handlers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcatch Inst Ġ= Ġcode ( exec . addr ) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( catch Inst . instruction . opcode Ġ== ĠOp codes . MOVE _ EXCEPTION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( type Ġin Ġexec . type List ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexception 2 Catch . put If Absent ( type Ġ?: ĠThrowable :: class . java . name , ĠArrayList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . add ( Pair ( Pair ( start , Ġend ), Ġcatch Inst . cursor )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġexception 2 Catch [ type Ġ?: ĠThrowable :: class . java . name ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . add ( Pair ( Pair ( start , Ġend ), Ġcatch Inst . cursor )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch 2 Exception . put If Absent ( catch Inst . cursor , ĠArrayList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . add ( Pair ( type Ġ?: ĠThrowable :: class . java . name , ĠPair ( start , Ġend ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġcatch 2 Exception [ catch Inst . cursor ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . add ( Pair ( type Ġ?: ĠThrowable :: class . java . name , ĠPair ( start , Ġend ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Try Catch Block () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( tc Block Ġin Ġm th Node . try Block List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ġ= Ġtc Block . inst List [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= Ġm th Node . getNext Inst ( tc Block . inst List . last (). cursor ) Ġ?: Ġthrow ĠDecode Exception (" try Ġblock Ġend Ġout Ġof Ġbounds ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( start . getLabel () Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart . set L able ( Label ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( end . getLabel () Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend . set L able ( Label ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( exec Ġin Ġtc Block . exec Handlers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcatch Inst Ġ= Ġcode ( exec . addr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( catch Inst Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( catch Inst . getLabel () Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Inst . set L able ( Label ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Inst Ġ= Ġinst Map [ start ]?. first () Ġ?: Ġthrow ĠDecode Exception (" Try Catch Ġblock Ġempty ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Inst Ġ= Ġinst Map [ end ]?. last () Ġ?: Ġthrow ĠDecode Exception (" Try Catch Ġblock Ġempty ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcatch Inst Ġ= Ġinst Map [ catch Inst ]?. first () Ġ?: Ġthrow ĠDecode Exception (" Try Catch Ġblock Ġempty ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( type Ġin Ġexec . type List ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj vm Inst Manager . add Try Catch Element ( start Inst , Ġend Inst , Ġcatch Inst , Ġtype ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm th Visit . visit Try Catch Block ( start Label , Ġend Label , Ġcatch Label , Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcode List () Ġ= Ġm th Node . code List ĊĊĠĠĠ Ġfun Ġcode ( index : ĠInt ) Ġ= Ġm th Node . get Inst ( index ) ĊĊĠĠĠ Ġfun Ġprev Code ( index : ĠInt ) Ġ= Ġm th Node . get Prev Inst ( index ) ĊĊĠĠĠ Ġfun Ġnext Code ( index : ĠInt ) Ġ= Ġm th Node . getNext Inst ( index ) ĊĊĠĠĠ Ġfun Ġnew Block (): ĠBasic Block Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlabel 0 Ġ= ĠLabel () ĊĠĠĠĠĠĠĠ Ġreturn Ġblock Map . get Or Put ( label 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ get Or Put ĠBasic Block . create ( label 0 , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnew Block ( prev : ĠBasic Block ): ĠBasic Block Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlabel 0 Ġ= ĠLabel () ĊĠĠĠĠĠĠĠ Ġreturn Ġblock Map . get Or Put ( label 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ get Or Put ĠBasic Block . create ( label 0 , Ġprev ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġslot Num ( reg Num : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( mth Node . args List . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreg Num ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġm th Node . regs Count Ġ- Ġm th Node . ins ĊĠĠĠĠĠĠĠ Ġif Ġ( reg Num Ġ< Ġoffset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreg Num Ġ+ Ġm th Node . ins ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreg Num Ġ- Ġoffset ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Start Jvm Label Inst () Ġ= Ġif Ġ( jvm Label Use Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġj vm Label Use ++ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( jvm Label ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> ĠLabel Inst () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠLabel Inst ( jvm Label Ġas ĠLabel ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠLabel Inst () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Start Jvm Label Inst ( label : ĠLabel ) Ġ{ ĊĠĠĠĠĠĠĠ Ġj vm Label Ġ= Ġlabel ĊĠĠĠĠĠĠĠ Ġj vm Label Use Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Start Jvm Line (): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( jvm Line Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline : ĠInt Ġ= Ġj vm Line !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġj vm Line Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġline ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpush Single Inst ( op codes : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġj vm Inst Ġ= ĠJ vm Inst . Create Single Inst ( op codes , Ġget Start Jvm Label Inst (), Ġget Start Jvm Line ()) ĊĠĠĠĠĠĠĠ Ġj vm Inst Manager . push Jvm Inst ( jvm Inst ) ĊĠĠĠĠĠĠĠ Ġcurrent Inst List . add ( jvm Inst ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġpush Slot Inst ( op codes : ĠInt , Ġslot : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġj vm Inst Ġ= ĠJ vm Inst . Create Slot Inst ( op codes , Ġslot , Ġget Start Jvm Label Inst (), Ġget Start Jvm Line ()) ĊĠĠĠĠĠĠĠ Ġj vm Inst Manager . push Jvm Inst ( jvm Inst ) ĊĠĠĠĠĠĠĠ Ġcurrent Inst List . add ( jvm Inst ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġpush Int Inst ( op codes : ĠInt , Ġnumber : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġj vm Inst Ġ= ĠJ vm Inst . Create Int Inst ( op codes , Ġnumber , Ġget Start Jvm Label Inst (), Ġget Start Jvm Line ()) ĊĠĠĠĠĠĠĠ Ġj vm Inst Manager . push Jvm Inst ( jvm Inst ) ĊĠĠĠĠĠĠĠ Ġcurrent Inst List . add ( jvm Inst ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġpush Literal Inst ( op codes : ĠInt , Ġliteral : ĠLong , Ġtype : ĠSlot Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġj vm Inst Ġ= ĠJ vm Inst . Create Literal Inst ( op codes , Ġliteral , Ġtype , Ġget Start Jvm Label Inst (), Ġget Start Jvm Line ()) ĊĠĠĠĠĠĠĠ Ġj vm Inst Manager . push Jvm Inst ( jvm Inst ) ĊĠĠĠĠĠĠĠ Ġcurrent Inst List . add ( jvm Inst ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġpush Type Inst ( op codes : ĠInt , Ġtype : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġj vm Inst Ġ= ĠJ vm Inst . Create Type Inst ( op codes , Ġtype , Ġget Start Jvm Label Inst (), Ġget Start Jvm Line ()) ĊĠĠĠĠĠĠĠ Ġj vm Inst Manager . push Jvm Inst ( jvm Inst ) ĊĠĠĠĠĠĠĠ Ġcurrent Inst List . add ( jvm Inst ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġpush Constant Inst ( op codes : ĠInt , Ġconst Index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġj vm Inst Ġ= ĠJ vm Inst . Create Constant Inst ( op codes , Ġconst Index , Ġget Start Jvm Label Inst (), Ġget Start Jvm Line ()) ĊĠĠĠĠĠĠĠ Ġj vm Inst Manager . push Jvm Inst ( jvm Inst ) ĊĠĠĠĠĠĠĠ Ġcurrent Inst List . add ( jvm Inst ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġpush Invoke Inst ( invoke Type : ĠInt , Ġm th Index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġj vm Inst Ġ= ĠJ vm Inst . Create Invoke Inst ( invoke Type , Ġinvoke Type , Ġm th Index , Ġget Start Jvm Label Inst (), Ġget Start Jvm Line ()) ĊĠĠĠĠĠĠĠ Ġj vm Inst Manager . push Jvm Inst ( jvm Inst ) ĊĠĠĠĠĠĠĠ Ġcurrent Inst List . add ( jvm Inst ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġpush Jump Inst ( op codes : ĠInt , Ġtarget : ĠLabel ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġj vm Inst Ġ= ĠJ vm Inst . Create Jump Inst ( op codes , ĠLabel Inst ( target ), Ġget Start Jvm Label Inst (), Ġget Start Jvm Line ()) ĊĠĠĠĠĠĠĠ Ġj vm Inst Manager . push Jvm Inst ( jvm Inst ) ĊĠĠĠĠĠĠĠ Ġcurrent Inst List . add ( jvm Inst ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġpush Field Inst ( op codes : ĠInt , Ġfield Index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġj vm Inst Ġ= ĠJ vm Inst . Create Field Inst ( op codes , Ġfield Index , Ġget Start Jvm Label Inst (), Ġget Start Jvm Line ()) ĊĠĠĠĠĠĠĠ Ġj vm Inst Manager . push Jvm Inst ( jvm Inst ) ĊĠĠĠĠĠĠĠ Ġcurrent Inst List . add ( jvm Inst ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġpush Shadow Inst ( op codes : ĠInt , Ġliteral : ĠLong ?, Ġvar arg Ġreg Num : ĠInt ): ĠShadow Inst Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġshadow Inst Ġ= ĠJ vm Inst . Create Shadow Inst ( op codes , Ġliteral , Ġreg Num , Ġget Start Jvm Label Inst (), Ġget Start Jvm Line ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġas ĠShadow Inst ĊĠĠĠĠĠĠĠ Ġj vm Inst Manager . push Jvm Inst ( shadow Inst ) ĊĠĠĠĠĠĠĠ Ġcurrent Inst List . add ( shadow Inst ) ĊĠĠĠĠĠĠĠ Ġreturn Ġshadow Inst ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġpush Fill Array Data Payload Inst ( slot : ĠInt , Ġtarget : ĠInt , Ġtype : ĠSlot Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġj vm Inst Ġ= ĠJ vm Inst . Create Fill Array Data Payload Inst ( slot , Ġtarget , Ġtype , Ġget Start Jvm Label Inst (), Ġget Start Jvm Line ()) ĊĠĠĠĠĠĠĠ Ġj vm Inst Manager . push Jvm Inst ( jvm Inst ) ĊĠĠĠĠĠĠĠ Ġcurrent Inst List . add ( jvm Inst ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġpush Packed Switch Payload Inst ( target : ĠInt , Ġdef Label : ĠLabel ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġj vm Inst Ġ= ĠJ vm Inst . Create Packed Switch Payload Inst ( target , ĠLabel Inst ( def Label ), Ġget Start Jvm Label Inst (), Ġget Start Jvm Line ()) ĊĠĠĠĠĠĠĠ Ġj vm Inst Manager . push Jvm Inst ( jvm Inst ) ĊĠĠĠĠĠĠĠ Ġcurrent Inst List . add ( jvm Inst ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġpush Sparse Switch Payload Inst ( target : ĠInt , Ġdef Label : ĠLabel ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġj vm Inst Ġ= ĠJ vm Inst . Create Sparse Switch Payload Inst ( target , ĠLabel Inst ( def Label ), Ġget Start Jvm Label Inst (), Ġget Start Jvm Line ()) ĊĠĠĠĠĠĠĠ Ġj vm Inst Manager . push Jvm Inst ( jvm Inst ) ĊĠĠĠĠĠĠĠ Ġcurrent Inst List . add ( jvm Inst ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġpush Multi AN ew Array Insn ( typeName : ĠString , Ġnum : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġj vm Inst Ġ= ĠJ vm Inst . Create Multi AN ew Array Insn ( typeName , Ġnum , Ġget Start Jvm Label Inst (), Ġget Start Jvm Line ()) ĊĠĠĠĠĠĠĠ Ġj vm Inst Manager . push Jvm Inst ( jvm Inst ) ĊĠĠĠĠĠĠĠ Ġcurrent Inst List . add ( jvm Inst ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠDe coded Instruction . reg A () Ġ= Ġslot Num ( a ) ĊĠĠĠ Ġprivate Ġfun ĠDe coded Instruction . reg B () Ġ= Ġslot Num ( b ) ĊĠĠĠ Ġprivate Ġfun ĠDe coded Instruction . reg C () Ġ= Ġslot Num ( c ) ĊĠĠĠ Ġprivate Ġfun ĠDe coded Instruction . reg D () Ġ= Ġslot Num ( d ) ĊĠĠĠ Ġprivate Ġfun ĠDe coded Instruction . reg E () Ġ= Ġslot Num ( e ) ĊĊĠĠĠ Ġprivate Ġfun Ġnormal Process ( inst : ĠInst Node ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/* should Ġuse Ġa Ġsa fer Ġway Ġof Ġassigning */ ĊĠĠĠĠĠĠĠ Ġset Start Jvm Label Inst ( inst . getLabel Or Put (). value ) ĊĠĠĠĠĠĠĠ Ġj vm Line Ġ= Ġinst . get LineNumber () ĊĊĠĠĠĠĠĠĠ Ġval Ġframe Ġ= ĠStack Frame . get Frame Or Put ( inst . cursor ). merge () ĊĠĠĠĠĠĠĠ Ġval Ġdal vik Inst Ġ= Ġinst . instruction ĊĠĠĠĠĠĠĠ Ġwhen Ġ( dal vik Inst . opcode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠOp codes . MOVE .. Op codes . MOVE _ OBJECT _ 1 6 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Move ( dal vik Inst Ġas ĠTwo Register Decoded Instruction , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠOp codes . MOVE _ RESULT .. Op codes . MOVE _ RESULT _ OBJECT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Store ( new est Return Ġ?: Ġthrow ĠDecode Exception (" MOVE _ RESULT Ġby Ġnull ", Ġinst . cursor ), Ġdal vik Inst . reg A (), Ġframe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . MOVE _ EXCEPTION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Move Exception ( dal vik Inst Ġas ĠOne Register Decoded Instruction , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . RETURN _ VOID Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Return Void () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠOp codes . RETURN .. Op codes . RETURN _ OBJECT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Return ( dal vik Inst . reg A (), ĠSlot Type . convert ( mth Node . get ReturnType ()) !! , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠOp codes . CONST _ 4 .. Op codes . CONST _ CLASS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Const ( dal vik Inst Ġas ĠOne Register Decoded Instruction , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . MONITOR _ ENTER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Monitor ( true , Ġdal vik Inst Ġas ĠOne Register Decoded Instruction , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . MONITOR _ EXIT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Monitor ( false , Ġdal vik Inst Ġas ĠOne Register Decoded Instruction , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . CHECK _ CAST Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Check Cast ( dal vik Inst Ġas ĠOne Register Decoded Instruction , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . INSTANCE _ OF Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit InstanceOf ( dal vik Inst Ġas ĠTwo Register Decoded Instruction , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . ARRAY _ LENGTH Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Array Length ( dal vik Inst Ġas ĠTwo Register Decoded Instruction , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . NEW _ INSTANCE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit New Instance ( dal vik Inst Ġas ĠOne Register Decoded Instruction , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . NEW _ ARRAY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit New Array ( dal vik Inst Ġas ĠTwo Register Decoded Instruction , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . FIL LED _ NEW _ ARRAY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Filled New Array ( dal vik Inst , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . FIL LED _ NEW _ ARRAY _ RANGE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Filled New Array Range ( dal vik Inst Ġas ĠRegister Range Decoded Instruction , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . FILL _ ARRAY _ DATA Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Payload Inst ( dal vik Inst Ġas ĠOne Register Decoded Instruction , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . THROW Ġ-> Ġvisit Throw ( dal vik Inst Ġas ĠOne Register Decoded Instruction , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠOp codes . GOTO .. Op codes . GOTO _ 3 2 Ġ-> Ġvisit G oto ( dal vik Inst Ġas ĠZero Register Decoded Instruction , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . PACK ED _ SWITCH Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Payload Inst ( dal vik Inst Ġas ĠOne Register Decoded Instruction , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . SPARSE _ SWITCH Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Payload Inst ( dal vik Inst Ġas ĠOne Register Decoded Instruction , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠOp codes . CMP L _ FLOAT .. Op codes . CMP _ LONG Ġ-> Ġvisit Cmp Stmt ( dal vik Inst Ġas ĠThree Register Decoded Instruction , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠOp codes . IF _ EQ .. Op codes . IF _ LE Ġ-> Ġvisit If Stmt ( dal vik Inst Ġas ĠTwo Register Decoded Instruction , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠOp codes . IF _ EQ Z .. Op codes . IF _ LE Z Ġ-> Ġvisit If Stmt ( dal vik Inst Ġas ĠOne Register Decoded Instruction , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠOp codes . AG ET .. Op codes . AG ET _ SHORT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Array Op ( dal vik Inst Ġas ĠThree Register Decoded Instruction , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠOp codes . AP UT .. Op codes . AP UT _ SHORT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Array Op ( dal vik Inst Ġas ĠThree Register Decoded Instruction , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠOp codes . IG ET .. Op codes . IP UT _ SHORT Ġ-> Ġvisit Instance Field ( dal vik Inst Ġas ĠTwo Register Decoded Instruction , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠOp codes . S GET .. Op codes . SP UT _ SHORT Ġ-> Ġvisit Static Field ( dal vik Inst Ġas ĠOne Register Decoded Instruction , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . IN VOKE _ VIRTUAL Ġ-> Ġnewest Return Ġ= Ġvisit Invoke ( dal vik Inst , ĠInvoke Type . IN VOKE VIRTUAL , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . IN VOKE _ SUPER Ġ-> Ġnewest Return Ġ= Ġvisit Invoke ( dal vik Inst , ĠInvoke Type . INV OK ES PE CIAL , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . IN VOKE _ DIRECT Ġ-> Ġnewest Return Ġ= Ġvisit Invoke ( dal vik Inst , ĠInvoke Type . INV OK ES PE CIAL , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . IN VOKE _ STATIC Ġ-> Ġnewest Return Ġ= Ġvisit Invoke ( dal vik Inst , ĠInvoke Type . IN VOKE STATIC , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . IN VOKE _ INTERFACE Ġ-> Ġnewest Return Ġ= Ġvisit Invoke ( dal vik Inst , ĠInvoke Type . IN VOKE INTERFACE , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . IN VOKE _ VIRTUAL _ RANGE Ġ-> Ġnewest Return Ġ= Ġvisit Invoke Range ( dal vik Inst Ġas ĠRegister Range Decoded Instruction , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInvoke Type . IN VOKE VIRTUAL , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . IN VOKE _ SUPER _ RANGE Ġ-> Ġnewest Return Ġ= Ġvisit Invoke Range ( dal vik Inst Ġas ĠRegister Range Decoded Instruction , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInvoke Type . INV OK ES PE CIAL , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . IN VOKE _ DIRECT _ RANGE Ġ-> Ġnewest Return Ġ= Ġvisit Invoke Range ( dal vik Inst Ġas ĠRegister Range Decoded Instruction , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInvoke Type . INV OK ES PE CIAL , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . IN VOKE _ STATIC _ RANGE Ġ-> Ġnewest Return Ġ= Ġvisit Invoke Range ( dal vik Inst Ġas ĠRegister Range Decoded Instruction , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInvoke Type . IN VOKE STATIC , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . IN VOKE _ INTERFACE _ RANGE Ġ-> Ġnewest Return Ġ= Ġvisit Invoke Range ( dal vik Inst Ġas ĠRegister Range Decoded Instruction , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInvoke Type . IN VOKE INTERFACE , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠOp codes . NEG _ INT .. Op codes . INT _ TO _ SHORT Ġ-> Ġvisit Un op ( dal vik Inst Ġas ĠTwo Register Decoded Instruction , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠOp codes . ADD _ INT .. Op codes . REM _ DOUBLE Ġ-> Ġvisit Bin Op ( dal vik Inst Ġas ĠThree Register Decoded Instruction , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠOp codes . ADD _ INT _ 2 ADDR .. Op codes . US HR _ INT _ 2 ADDR , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠOp codes . ADD _ FLOAT _ 2 ADDR .. Op codes . REM _ FLOAT _ 2 ADDR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Bin Op 2 Addr ( dal vik Inst Ġas ĠTwo Register Decoded Instruction , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠOp codes . ADD _ LONG _ 2 ADDR .. Op codes . US HR _ LONG _ 2 ADDR , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠOp codes . ADD _ DOUBLE _ 2 ADDR .. Op codes . REM _ DOUBLE _ 2 ADDR Ġ-> Ġvisit Bin Op Wide 2 Addr ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdal vik Inst Ġas ĠTwo Register Decoded Instruction , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠOp codes . ADD _ INT _ LIT 1 6 .. Op codes . US HR _ INT _ LIT 8 Ġ-> Ġvisit Bin Op ( dal vik Inst Ġas ĠTwo Register Decoded Instruction , Ġframe , Ġinst . cursor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Invoke ( dal vik Inst : ĠDe coded Instruction , Ġinvoke Type : ĠInt , Ġframe : ĠStack Frame , Ġoffset : ĠInt ): ĠSlot Type ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġm th Info Ġ= ĠMethodInfo . from Dex ( dex Node , Ġdal vik Inst . index ) ĊĠĠĠĠĠĠĠ Ġval Ġthis Pos Ġ= Ġwhen Ġ( invoke Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInvoke Type . IN VOKE STATIC Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġskip Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġfor Ġ( arg Pos Ġin Ġ 0 Ġuntil Ġdal vik Inst . register Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( skip ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskip Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġif Ġ( arg Pos Ġ== Ġ 0 Ġ&& Ġthis Pos Ġ== Ġ 1 ) ĠSlot Type . OBJECT Ġelse ĠSlot Type . convert ( mth Info . args [ arg Pos Ġ- Ġthis Pos ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠDecode Exception (" invoke Ġargument Ġtype Ġerror .", Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== ĠSlot Type . DOUBLE Ġ|| Ġtype Ġ== ĠSlot Type . LONG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskip Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( arg Pos ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġvisit Load ( dal vik Inst . reg A (), Ġtype , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġvisit Load ( dal vik Inst . reg B (), Ġtype , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġvisit Load ( dal vik Inst . reg C (), Ġtype , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> Ġvisit Load ( dal vik Inst . reg D (), Ġtype , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 4 Ġ-> Ġvisit Load ( dal vik Inst . reg E (), Ġtype , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠDecode Exception (" invoke Ġinstruction Ġregister Ġnumber Ġerror .", Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpush Invoke Inst ( invoke Type , Ġdal vik Inst . index ) ĊĠĠĠĠĠĠĠ Ġreturn ĠSlot Type . convert ( mth Info . ret Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Invoke Range ( dal vik Inst : ĠRegister Range Decoded Instruction , Ġinvoke Type : ĠInt , Ġframe : ĠStack Frame , Ġoffset : ĠInt ): ĠSlot Type ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġm th Info Ġ= ĠMethodInfo . from Dex ( dex Node , Ġdal vik Inst . index ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġdal vik Inst . register Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġslot Ġ= Ġslot Num ( dal vik Inst . a Ġ+ Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Load ( slot , Ġframe . get Slot ( slot )?. getType OrNull () Ġ?: Ġthrow ĠDecode Exception (" Empty Ġtype Ġin Ġslot Ġ[$ slot ] "), Ġoffset ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpush Invoke Inst ( invoke Type , Ġdal vik Inst . index ) ĊĠĠĠĠĠĠĠ Ġreturn ĠSlot Type . convert ( mth Info . ret Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Const ( dal vik Inst : ĠOne Register Decoded Instruction , Ġframe : ĠStack Frame , Ġoffset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġslot Ġ= Ġdal vik Inst . reg A () ĊĠĠĠĠĠĠĠ Ġwhen Ġ( dal vik Inst . opcode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . CONST _ 4 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe . set Slot Literal ( slot , Ġdal vik Inst . literal Byte . to Long (), ĠSym Identifier . Number Literal ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . CONST _ 1 6 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe . set Slot Literal ( slot , Ġdal vik Inst . literal Unit . to Long (), ĠSym Identifier . Number Literal ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠOp codes . CONST .. Op codes . CONST _ HIGH 1 6 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe . set Slot Literal ( slot , Ġdal vik Inst . literal Int . to Long (), ĠSym Identifier . Number Literal ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠOp codes . CONST _ W IDE _ 1 6 .. Op codes . CONST _ W IDE _ HIGH 1 6 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe . set Slot Literal ( slot , Ġdal vik Inst . literal , ĠSym Identifier . Number Literal ) Ġ// Ġalso Ġdouble Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . CONST _ STRING , ĠOp codes . CONST _ STRING _ J UM BO Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe . set Slot Literal ( slot , Ġdal vik Inst . index . to Long (), ĠSym Identifier . String Index ) Ġ// Ġconstant Ġpool Ġindex Ġas Ġint Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . CONST _ CLASS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe . set Slot Literal ( slot , Ġdal vik Inst . index . to Long (), ĠSym Identifier . Symbol Type Index ) Ġ// Ġconstant Ġpool Ġindex Ġas Ġint Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit If Stmt ( dal vik Inst : ĠTwo Register Decoded Instruction , Ġframe : ĠStack Frame , Ġoffset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit Load ( dal vik Inst . reg A (), ĠSlot Type . INT , Ġoffset ) ĊĠĠĠĠĠĠĠ Ġvisit Load ( dal vik Inst . reg B (), ĠSlot Type . INT , Ġoffset ) ĊĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġcode ( dal vik Inst . target )?. getLabel Or Put ()?. value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠDecode Exception ("${ dal vik Inst . target } Ġhas Ġno Ġl able ", Ġoffset ) ĊĠĠĠĠĠĠĠ Ġpush Jump Inst ( dal vik Inst . opcode Ġ- ĠOp codes . IF _ EQ Ġ+ Ġj vm Op codes . IF _ IC M PE Q , Ġtarget ) ĊĠĠĠĠĠĠĠ ĠStack Frame . get Frame Or Put ( dal vik Inst . target ). add Pre Frame ( offset ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit If Stmt ( dal vik Inst : ĠOne Register Decoded Instruction , Ġframe : ĠStack Frame , Ġoffset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit Load ( dal vik Inst . reg A (), ĠSlot Type . INT , Ġoffset ) ĊĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġcode ( dal vik Inst . target )?. getLabel Or Put ()?. value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠDecode Exception ("${ dal vik Inst . target } Ġhas Ġno Ġl able ", Ġoffset ) ĊĠĠĠĠĠĠĠ Ġpush Jump Inst ( dal vik Inst . opcode Ġ- ĠOp codes . IF _ EQ Z Ġ+ Ġj vm Op codes . IF EQ , Ġtarget ) ĊĠĠĠĠĠĠĠ ĠStack Frame . get Frame Or Put ( dal vik Inst . target ). add Pre Frame ( offset ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Load ( slot : ĠInt , Ġslot Type : ĠSlot Type , Ġoffset : ĠInt ): ĠSlot Type Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Stack Frame . get Frame Or Except ( offset ). is Constant ( slot )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Push Or L dc ( slot , Ġslot Type , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġslot Type ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( slot Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . BOOLEAN , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠSlot Type . BYTE .. Slot Type . INT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Slot Inst ( jvm Op codes . I LOAD , Ġslot ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . LONG Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Slot Inst ( jvm Op codes . L LOAD , Ġslot ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . FLOAT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Slot Inst ( jvm Op codes . F LOAD , Ġslot ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . DOUBLE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Slot Inst ( jvm Op codes . D LOAD , Ġslot ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . OBJECT , ĠSlot Type . ARRAY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Slot Inst ( jvm Op codes . AL O AD , Ġslot ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġslot Type ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠStack Frame . is Constant ( slot : ĠInt ) Ġ= Ġget Slot ( slot ) Ġ== Ġnull Ġ|| Ġget Slot ( slot )?. is Symbol Type () Ġ== Ġfalse ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Push Or L dc ( slot : ĠInt , Ġslot Type : ĠSlot Type , Ġoffset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġframe Ġ= ĠStack Frame . get Frame Or Except ( offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġframe . get Slot ( slot ) Ġ?: Ġthrow ĠDecode Exception (" slot Ġ<$ slot > Ġis Ġempty Ġ[$ offset ]") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġliteral Ġ= Ġinfo . getNumber () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( info . isNumber Literal ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Push Or L dc ( literal , Ġslot Type , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( info . isString Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Constant Inst ( jvm Op codes . L DC , Ġliteral . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( info . is Symbol Type Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Type Inst ( jvm Op codes . L DC , Ġdex Node . getType ( literal . toInt ()). descriptor ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( de : ĠDecode Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDecode Exception (" L DC Ġinstruction Ġerror ", Ġoffset , Ġde ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Push Or L dc ( literal : ĠLong , Ġslot Type : ĠSlot Type , Ġoffset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( slot Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . BOOLEAN Ġ-> Ġpush Single Inst ( jvm Op codes . ICON ST _ 0 Ġ+ Ġliteral . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . BYTE Ġ-> Ġpush Int Inst ( jvm Op codes . B IP USH , Ġliteral . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . SHORT Ġ-> Ġpush Int Inst ( jvm Op codes . S IP USH , Ġliteral . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . INT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġint Literal Ġ= Ġliteral . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( int Literal Ġin Ġ- 1 .. 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Single Inst ( jvm Op codes . ICON ST _ M 1 Ġ+ Ġint Literal Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Literal Inst ( jvm Op codes . L DC , Ġliteral , ĠSlot Type . INT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . FLOAT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfloat Bits Ġ= Ġliteral . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( float Bits ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 f . to Raw Bits () Ġ-> Ġpush Single Inst ( jvm Op codes . F CONST _ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 f . to Raw Bits () Ġ-> Ġpush Single Inst ( jvm Op codes . F CONST _ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 . 0 f . to Raw Bits () Ġ-> Ġpush Single Inst ( jvm Op codes . F CONST _ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġpush Literal Inst ( jvm Op codes . L DC , Ġliteral , ĠSlot Type . FLOAT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . LONG Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( literal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 L Ġ-> Ġpush Single Inst ( jvm Op codes . L CONST _ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 L Ġ-> Ġpush Single Inst ( jvm Op codes . L CONST _ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġpush Literal Inst ( jvm Op codes . L DC , Ġliteral , ĠSlot Type . LONG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . DOUBLE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( literal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 . to Raw Bits () Ġ-> Ġpush Single Inst ( jvm Op codes . D CONST _ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 . to Raw Bits () Ġ-> Ġpush Single Inst ( jvm Op codes . D CONST _ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġpush Literal Inst ( jvm Op codes . L DC , Ġliteral , ĠSlot Type . DOUBLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . OBJECT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( literal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 L Ġ-> Ġpush Single Inst ( jvm Op codes . AC ON ST _ NULL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠDecode Exception (" Const Ġobject Ġerror ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDecode Exception (" Const Ġtype Ġerror ", Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Store ( type : ĠSlot Type , Ġslot : ĠInt , Ġframe : ĠStack Frame ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . BOOLEAN , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠSlot Type . BYTE .. Slot Type . INT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Slot Inst ( jvm Op codes . IST ORE , Ġslot ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe . set Slot ( slot , Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . LONG Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Slot Inst ( jvm Op codes . L STORE , Ġslot ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe . set Slot Wide ( slot , ĠSlot Type . LONG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . FLOAT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Slot Inst ( jvm Op codes . F STORE , Ġslot ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe . set Slot ( slot , ĠSlot Type . FLOAT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . DOUBLE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Slot Inst ( jvm Op codes . D STORE , Ġslot ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe . set Slot Wide ( slot , ĠSlot Type . DOUBLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . OBJECT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Slot Inst ( jvm Op codes . AST ORE , Ġslot ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe . set Slot ( slot , ĠSlot Type . OBJECT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . ARRAY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Slot Inst ( jvm Op codes . AST ORE , Ġslot ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe . set Slot ( slot , ĠSlot Type . ARRAY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Return Void () Ġ{ ĊĠĠĠĠĠĠĠ Ġpush Single Inst ( jvm Op codes . RETURN ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Return ( slot : ĠInt , Ġtype : ĠSlot Type , Ġoffset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit Load ( slot , Ġtype , Ġoffset ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . BOOLEAN , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠSlot Type . BYTE .. Slot Type . INT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Single Inst ( jvm Op codes . I RETURN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . LONG Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Single Inst ( jvm Op codes . L RETURN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . FLOAT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Single Inst ( jvm Op codes . F RETURN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . DOUBLE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Single Inst ( jvm Op codes . D STORE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . OBJECT , ĠSlot Type . ARRAY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Single Inst ( jvm Op codes . ARE T URN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDecode Exception (" return Ġun know Ġtype : Ġ$ type Ġ[$ offset ]") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit G oto ( dal vik Inst : ĠZero Register Decoded Instruction , Ġoffset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtarget Code Ġ= Ġcode ( dal vik Inst . target ) Ġ?: Ġthrow ĠDecode Exception (" G oto Ġtarget Ġ[ ${ dal vik Inst . target }] Ġis Ġerror ", Ġoffset ) ĊĠĠĠĠĠĠĠ Ġif Ġ( target Code . instruction . opcode Ġin ĠOp codes . RETURN .. Op codes . RETURN _ OBJECT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Return ( target Code . instruction . reg A (), ĠSlot Type . convert ( mth Node . get ReturnType ()) !! , Ġoffset ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġtarget Code . getLabel Or Put (). value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpush Jump Inst ( jvm Op codes . GOTO , Ġtarget ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStack Frame . get Frame Or Put ( dal vik Inst . target ). add Pre Frame ( offset ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Instance Field ( dal vik Inst : ĠTwo Register Decoded Instruction , Ġframe : ĠStack Frame , Ġoffset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfield Info Ġ= ĠField Info . from Dex ( dex Node , Ġdal vik Inst . index ) ĊĠĠĠĠĠĠĠ Ġvisit Load ( dal vik Inst . reg B (), ĠSlot Type . OBJECT , Ġoffset ) ĊĠĠĠĠĠĠĠ Ġif Ġ( dal vik Inst . opcode Ġ< ĠOp codes . IP UT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpush Field Inst ( jvm Op codes . GET FIELD , Ġdal vik Inst . index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Store ( Slot Type . convert ( field Info . type ) !! , Ġdal vik Inst . reg A (), Ġframe ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Load ( dal vik Inst . reg A (), ĠSlot Type . convert ( field Info . type ) !! , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpush Field Inst ( jvm Op codes . PUT FIELD , Ġdal vik Inst . index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Static Field ( dal vik Inst : ĠOne Register Decoded Instruction , Ġframe : ĠStack Frame , Ġoffset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfield Info Ġ= ĠField Info . from Dex ( dex Node , Ġdal vik Inst . index ) ĊĠĠĠĠĠĠĠ Ġif Ġ( dal vik Inst . opcode Ġ< ĠOp codes . SP UT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpush Field Inst ( jvm Op codes . GET STATIC , Ġdal vik Inst . index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Store ( Slot Type . convert ( field Info . type ) !! , Ġdal vik Inst . reg A (), Ġframe ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Load ( dal vik Inst . reg A (), ĠSlot Type . convert ( field Info . type ) !! , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpush Field Inst ( jvm Op codes . PUT STATIC , Ġdal vik Inst . index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Bin Op 2 Addr ( dal vik Inst : ĠTwo Register Decoded Instruction , Ġframe : ĠStack Frame , Ġoffset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtype Ġ= ĠSlot Type . INT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dal vik Inst . opcode Ġ>= ĠOp codes . ADD _ FLOAT _ 2 ADDR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠSlot Type . FLOAT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreg A Ġ= Ġdal vik Inst . reg A () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreg B Ġ= Ġdal vik Inst . reg B () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Load ( reg A , Ġtype , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Load ( reg B , Ġtype , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( dal vik Inst . opcode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . ADD _ INT _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . I ADD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . SUB _ INT _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . IS UB ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . MUL _ INT _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . IM UL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . DIV _ INT _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . ID IV ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . REM _ INT _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . I REM ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . AND _ INT _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . I AND ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . OR _ INT _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . IOR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . XOR _ INT _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . IX OR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . SH L _ INT _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . IS HL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . SH R _ INT _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . IS HR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . US HR _ INT _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . IUS HR ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . ADD _ FLOAT _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . F ADD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . SUB _ FLOAT _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . FS UB ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . MUL _ FLOAT _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . F MUL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . DIV _ FLOAT _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . F DIV ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . REM _ FLOAT _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . F REM ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Store ( type , Ġreg A , Ġframe ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( ex ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDecode Exception , Ġis ĠType Conf li ction Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDecode Exception (" Bin Op 2 Addr Ġerror ", Ġoffset , Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow Ġex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Bin Op Wide 2 Addr ( dal vik Inst : ĠTwo Register Decoded Instruction , Ġframe : ĠStack Frame , Ġoffset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtype Ġ= ĠSlot Type . LONG ĊĠĠĠĠĠĠĠ Ġif Ġ( dal vik Inst . opcode Ġ>= ĠOp codes . ADD _ DOUBLE _ 2 ADDR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠSlot Type . DOUBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġreg A Ġ= Ġdal vik Inst . reg A () ĊĠĠĠĠĠĠĠ Ġval Ġreg B Ġ= Ġdal vik Inst . reg B () ĊĠĠĠĠĠĠĠ Ġvisit Load ( reg A , Ġtype , Ġoffset ) ĊĠĠĠĠĠĠĠ Ġvisit Load ( reg B , Ġtype , Ġoffset ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( dal vik Inst . opcode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . ADD _ LONG _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . L ADD ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . SUB _ LONG _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . LS UB ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . MUL _ LONG _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . L MUL ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . DIV _ LONG _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . L DIV ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . REM _ LONG _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . L REM ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . AND _ LONG _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . LAND ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . OR _ LONG _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . L OR ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . XOR _ LONG _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . LX OR ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . SH L _ LONG _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . L SH L ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . SH R _ LONG _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . L SH R ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . US HR _ LONG _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . L US HR ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . ADD _ DOUBLE _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . D ADD ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . SUB _ DOUBLE _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . DS UB ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . MUL _ DOUBLE _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . DM UL ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . DIV _ DOUBLE _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . D DIV ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . REM _ DOUBLE _ 2 ADDR Ġ-> Ġpush Single Inst ( jvm Op codes . D REM ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvisit Store ( type , Ġreg A , Ġframe ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Bin Op ( dal vik Inst : ĠTwo Register Decoded Instruction , Ġframe : ĠStack Frame , Ġoffset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreg A Ġ= Ġdal vik Inst . reg A () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreg B Ġ= Ġdal vik Inst . reg B () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dal vik Inst . opcode Ġ== ĠOp codes . R SUB _ INT Ġ|| Ġdal vik Inst . opcode Ġ== ĠOp codes . R SUB _ INT _ LIT 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Push Or L dc ( dal vik Inst . literal Int . to Long (), ĠSlot Type . INT , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Load ( reg B , ĠSlot Type . INT , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Load ( reg B , ĠSlot Type . INT , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Push Or L dc ( dal vik Inst . literal Int . to Long (), ĠSlot Type . INT , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( dal vik Inst . opcode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . ADD _ INT _ LIT 8 , ĠOp codes . ADD _ INT _ LIT 1 6 Ġ-> Ġpush Single Inst ( jvm Op codes . I ADD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . R SUB _ INT _ LIT 8 , ĠOp codes . R SUB _ INT Ġ-> Ġpush Single Inst ( jvm Op codes . IS UB ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . MUL _ INT _ LIT 8 , ĠOp codes . MUL _ INT _ LIT 1 6 Ġ-> Ġpush Single Inst ( jvm Op codes . IM UL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . DIV _ INT _ LIT 8 , ĠOp codes . DIV _ INT _ LIT 1 6 Ġ-> Ġpush Single Inst ( jvm Op codes . ID IV ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . REM _ INT _ LIT 8 , ĠOp codes . REM _ INT _ LIT 1 6 Ġ-> Ġpush Single Inst ( jvm Op codes . I REM ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . AND _ INT _ LIT 8 , ĠOp codes . AND _ INT _ LIT 1 6 Ġ-> Ġpush Single Inst ( jvm Op codes . I AND ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . OR _ INT _ LIT 8 , ĠOp codes . OR _ INT _ LIT 1 6 Ġ-> Ġpush Single Inst ( jvm Op codes . IOR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . XOR _ INT _ LIT 8 , ĠOp codes . XOR _ INT _ LIT 1 6 Ġ-> Ġpush Single Inst ( jvm Op codes . IX OR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . SH L _ INT _ LIT 8 Ġ-> Ġpush Single Inst ( jvm Op codes . IS HL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . SH R _ INT _ LIT 8 Ġ-> Ġpush Single Inst ( jvm Op codes . IS HR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . US HR _ INT _ LIT 8 Ġ-> Ġpush Single Inst ( jvm Op codes . IUS HR ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Store ( Slot Type . INT , Ġreg A , Ġframe ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( ex ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDecode Exception , Ġis ĠType Conf li ction Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDecode Exception (" Bin Op Ġerror ", Ġoffset , Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow Ġex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Un op ( dal vik Inst : ĠTwo Register Decoded Instruction , Ġframe : ĠStack Frame , Ġoffset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġfrom Type Ġ= ĠSlot Type . INT ĊĠĠĠĠĠĠĠ Ġvar Ġto Type Ġ= ĠSlot Type . INT ĊĠĠĠĠĠĠĠ Ġvar Ġop codes Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhen Ġ( dal vik Inst . opcode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . NEG _ INT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġop codes Ġ= Ġj vm Op codes . INE G ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Type Ġ= ĠSlot Type . INT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Type Ġ= ĠSlot Type . INT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . NOT _ INT Ġ-> Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . NEG _ LONG Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġop codes Ġ= Ġj vm Op codes . L NEG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Type Ġ= ĠSlot Type . LONG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Type Ġ= ĠSlot Type . LONG ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . NOT _ LONG Ġ-> Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . NEG _ FLOAT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġop codes Ġ= Ġj vm Op codes . F NEG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Type Ġ= ĠSlot Type . FLOAT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Type Ġ= ĠSlot Type . FLOAT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . NEG _ DOUBLE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġop codes Ġ= Ġj vm Op codes . D NEG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Type Ġ= ĠSlot Type . DOUBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Type Ġ= ĠSlot Type . DOUBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . INT _ TO _ LONG Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġop codes Ġ= Ġj vm Op codes . I 2 L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Type Ġ= ĠSlot Type . INT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Type Ġ= ĠSlot Type . LONG ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . INT _ TO _ FLOAT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġop codes Ġ= Ġj vm Op codes . I 2 F ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Type Ġ= ĠSlot Type . INT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Type Ġ= ĠSlot Type . FLOAT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . INT _ TO _ DOUBLE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġop codes Ġ= Ġj vm Op codes . I 2 D ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Type Ġ= ĠSlot Type . INT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Type Ġ= ĠSlot Type . DOUBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . LONG _ TO _ INT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġop codes Ġ= Ġj vm Op codes . L 2 I ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Type Ġ= ĠSlot Type . LONG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Type Ġ= ĠSlot Type . INT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . LONG _ TO _ FLOAT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġop codes Ġ= Ġj vm Op codes . L 2 F ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Type Ġ= ĠSlot Type . LONG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Type Ġ= ĠSlot Type . FLOAT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . LONG _ TO _ DOUBLE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġop codes Ġ= Ġj vm Op codes . L 2 D ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Type Ġ= ĠSlot Type . LONG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Type Ġ= ĠSlot Type . DOUBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . FLOAT _ TO _ INT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġop codes Ġ= Ġj vm Op codes . F 2 I ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Type Ġ= ĠSlot Type . FLOAT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Type Ġ= ĠSlot Type . INT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . FLOAT _ TO _ LONG Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġop codes Ġ= Ġj vm Op codes . F 2 L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Type Ġ= ĠSlot Type . FLOAT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Type Ġ= ĠSlot Type . LONG ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . FLOAT _ TO _ DOUBLE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġop codes Ġ= Ġj vm Op codes . F 2 D ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Type Ġ= ĠSlot Type . FLOAT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Type Ġ= ĠSlot Type . DOUBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . DOUBLE _ TO _ INT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġop codes Ġ= Ġj vm Op codes . D 2 I ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Type Ġ= ĠSlot Type . DOUBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Type Ġ= ĠSlot Type . INT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . DOUBLE _ TO _ LONG Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġop codes Ġ= Ġj vm Op codes . D 2 L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Type Ġ= ĠSlot Type . DOUBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Type Ġ= ĠSlot Type . LONG ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . DOUBLE _ TO _ FLOAT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġop codes Ġ= Ġj vm Op codes . D 2 F ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Type Ġ= ĠSlot Type . DOUBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Type Ġ= ĠSlot Type . FLOAT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . INT _ TO _ BYTE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġop codes Ġ= Ġj vm Op codes . I 2 B ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Type Ġ= ĠSlot Type . INT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Type Ġ= ĠSlot Type . BYTE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . INT _ TO _ CHAR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġop codes Ġ= Ġj vm Op codes . I 2 C ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Type Ġ= ĠSlot Type . INT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Type Ġ= ĠSlot Type . CHAR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . INT _ TO _ SHORT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġop codes Ġ= Ġj vm Op codes . I 2 S ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Type Ġ= ĠSlot Type . INT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Type Ġ= ĠSlot Type . SHORT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvisit Load ( dal vik Inst . reg B (), Ġfrom Type , Ġoffset ) ĊĠĠĠĠĠĠĠ Ġpush Single Inst ( op codes ) ĊĠĠĠĠĠĠĠ Ġvisit Store ( to Type , Ġdal vik Inst . reg A (), Ġframe ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Bin Op ( dal vik Inst : ĠThree Register Decoded Instruction , Ġframe : ĠStack Frame , Ġoffset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreg A Ġ= Ġdal vik Inst . reg A () ĊĠĠĠĠĠĠĠ Ġval Ġreg B Ġ= Ġdal vik Inst . reg B () ĊĠĠĠĠĠĠĠ Ġval Ġreg C Ġ= Ġdal vik Inst . reg C () ĊĠĠĠĠĠĠĠ Ġvar Ġtype Ġ= ĠSlot Type . INT ĊĠĠĠĠĠĠĠ Ġif Ġ( dal vik Inst . opcode Ġ>= ĠOp codes . ADD _ LONG Ġ&& Ġdal vik Inst . opcode Ġ<= ĠOp codes . US HR _ LONG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠSlot Type . LONG ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( dal vik Inst . opcode Ġ>= ĠOp codes . ADD _ FLOAT Ġ&& Ġdal vik Inst . opcode Ġ<= ĠOp codes . REM _ FLOAT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠSlot Type . FLOAT ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( dal vik Inst . opcode Ġ>= ĠOp codes . ADD _ DOUBLE Ġ&& Ġdal vik Inst . opcode Ġ<= ĠOp codes . REM _ DOUBLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠSlot Type . DOUBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvisit Load ( reg B , Ġtype , Ġoffset ) ĊĠĠĠĠĠĠĠ Ġvisit Load ( reg C , Ġtype , Ġoffset ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( dal vik Inst . opcode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . ADD _ INT Ġ-> Ġpush Single Inst ( jvm Op codes . I ADD ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . SUB _ INT Ġ-> Ġpush Single Inst ( jvm Op codes . IS UB ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . MUL _ INT Ġ-> Ġpush Single Inst ( jvm Op codes . IM UL ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . DIV _ INT Ġ-> Ġpush Single Inst ( jvm Op codes . ID IV ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . REM _ INT Ġ-> Ġpush Single Inst ( jvm Op codes . I REM ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . AND _ INT Ġ-> Ġpush Single Inst ( jvm Op codes . I AND ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . OR _ INT Ġ-> Ġpush Single Inst ( jvm Op codes . IOR ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . XOR _ INT Ġ-> Ġpush Single Inst ( jvm Op codes . IX OR ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . SH L _ INT Ġ-> Ġpush Single Inst ( jvm Op codes . IS HL ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . SH R _ INT Ġ-> Ġpush Single Inst ( jvm Op codes . IS HR ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . US HR _ INT Ġ-> Ġpush Single Inst ( jvm Op codes . IUS HR ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . ADD _ LONG Ġ-> Ġpush Single Inst ( jvm Op codes . L ADD ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . SUB _ LONG Ġ-> Ġpush Single Inst ( jvm Op codes . LS UB ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . MUL _ LONG Ġ-> Ġpush Single Inst ( jvm Op codes . L MUL ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . DIV _ LONG Ġ-> Ġpush Single Inst ( jvm Op codes . L DIV ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . REM _ LONG Ġ-> Ġpush Single Inst ( jvm Op codes . L REM ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . AND _ LONG Ġ-> Ġpush Single Inst ( jvm Op codes . LAND ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . OR _ LONG Ġ-> Ġpush Single Inst ( jvm Op codes . L OR ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . XOR _ LONG Ġ-> Ġpush Single Inst ( jvm Op codes . LX OR ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . SH L _ LONG Ġ-> Ġpush Single Inst ( jvm Op codes . L SH L ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . SH R _ LONG Ġ-> Ġpush Single Inst ( jvm Op codes . L SH R ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . US HR _ LONG Ġ-> Ġpush Single Inst ( jvm Op codes . L US HR ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . ADD _ FLOAT Ġ-> Ġpush Single Inst ( jvm Op codes . F ADD ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . SUB _ FLOAT Ġ-> Ġpush Single Inst ( jvm Op codes . FS UB ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . MUL _ FLOAT Ġ-> Ġpush Single Inst ( jvm Op codes . F MUL ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . DIV _ FLOAT Ġ-> Ġpush Single Inst ( jvm Op codes . F DIV ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . REM _ FLOAT Ġ-> Ġpush Single Inst ( jvm Op codes . F REM ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . ADD _ DOUBLE Ġ-> Ġpush Single Inst ( jvm Op codes . D ADD ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . SUB _ DOUBLE Ġ-> Ġpush Single Inst ( jvm Op codes . DS UB ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . MUL _ DOUBLE Ġ-> Ġpush Single Inst ( jvm Op codes . DM UL ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . DIV _ DOUBLE Ġ-> Ġpush Single Inst ( jvm Op codes . D DIV ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . REM _ DOUBLE Ġ-> Ġpush Single Inst ( jvm Op codes . D REM ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvisit Store ( type , Ġreg A , Ġframe ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Move ( dal vik Inst : ĠTwo Register Decoded Instruction , Ġframe : ĠStack Frame , Ġoffset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreg B Ġ= Ġdal vik Inst . reg B () ĊĠĠĠĠĠĠĠ Ġvar Ġslot Type Ġ= ĠSlot Type . INT ĊĠĠĠĠĠĠĠ Ġif Ġ( frame . is Constant ( reg B )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Load ( reg B , ĠSlot Type . INT , Ġoffset ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġslot Type Ġ= Ġvisit Load ( reg B , Ġframe . get Slot ( reg B )?. getType OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠDecode Exception (" Empty Ġtype Ġin Ġslot Ġ[$ reg B ] Ġoffset [$ offset ] "), Ġoffset ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvisit Store ( slot Type , Ġdal vik Inst . reg A (), Ġframe ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Throw ( dal vik Inst : ĠOne Register Decoded Instruction , Ġoffset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreg A Ġ= Ġdal vik Inst . reg A () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠStack Frame . check Type ( Slot Type . OBJECT , Ġoffset , Ġreg A ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Load ( reg A , ĠSlot Type . OBJECT , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpush Single Inst ( jvm Op codes . ATH ROW ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( ex ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDecode Exception , Ġis ĠType Conf li ction Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDecode Exception (" Throw Ġerror ", Ġoffset , Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow Ġex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Cmp Stmt ( dal vik Inst : ĠThree Register Decoded Instruction , Ġframe : ĠStack Frame , Ġoffset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreg A Ġ= Ġdal vik Inst . reg A () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreg B Ġ= Ġdal vik Inst . reg B () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreg C Ġ= Ġdal vik Inst . reg C () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( dal vik Inst . opcode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . CMP L _ FLOAT , ĠOp codes . CMP G _ FLOAT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Load ( reg B , ĠSlot Type . FLOAT , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Load ( reg C , ĠSlot Type . FLOAT , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Single Inst ( jvm Op codes . FC MPL Ġ+ Ġdal vik Inst . opcode Ġ- ĠOp codes . CMP L _ FLOAT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . CMP L _ DOUBLE , ĠOp codes . CMP G _ DOUBLE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Load ( reg B , ĠSlot Type . DOUBLE , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Load ( reg C , ĠSlot Type . DOUBLE , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Single Inst ( jvm Op codes . DC MPL Ġ+ Ġdal vik Inst . opcode Ġ- ĠOp codes . CMP L _ DOUBLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . CMP _ LONG Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Load ( reg B , ĠSlot Type . LONG , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Load ( reg C , ĠSlot Type . LONG , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Single Inst ( jvm Op codes . LC MP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Store ( Slot Type . INT , Ġreg A , Ġframe ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Monitor ( is Entry : ĠBoolean , Ġdal vik Inst : ĠOne Register Decoded Instruction , Ġframe : ĠStack Frame , Ġoffset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreg A Ġ= Ġdal vik Inst . reg A () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Load ( reg A , ĠSlot Type . OBJECT , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Entry ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Single Inst ( jvm Op codes . MON IT ORE N TER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Single Inst ( jvm Op codes . MON IT ORE X IT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit New Instance ( dal vik Inst : ĠOne Register Decoded Instruction , Ġframe : ĠStack Frame , Ġoffset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclazz Ġ= Ġdex Node . getType ( dal vik Inst . index ). getAs ObjectType () Ġ?: Ġthrow ĠDecode Exception (" New - Instance Ġerror ", Ġoffset ) ĊĠĠĠĠĠĠĠ Ġpush Type Inst ( jvm Op codes . NEW , Ġclazz . name With Slash ()) ĊĠĠĠĠĠĠĠ Ġpush Single Inst ( jvm Op codes . DUP ) ĊĠĠĠĠĠĠĠ Ġvar Ġnext Inst Ġ= Ġm th Node . getNext Inst ( offset ) Ġ?: Ġthrow ĠDecode Exception (" New - Instance Ġerror ", Ġoffset ) ĊĠĠĠĠĠĠĠ Ġskip Inst Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( next Inst . instruction . opcode Ġ!= ĠOp codes . IN VOKE _ DIRECT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnormal Process ( next Inst ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Inst Ġ= Ġm th Node . getNext Inst ( next Inst . cursor ) Ġ?: Ġthrow ĠDecode Exception (" New - Instance Ġerror ", Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġskip Inst Ġ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġm th Info Ġ= ĠMethodInfo . from Dex ( dex Node , Ġnext Inst . instruction . index ) ĊĠĠĠĠĠĠĠ Ġval Ġnext Frame Ġ= ĠStack Frame . get Frame Or Except ( next Inst . cursor ). merge () ĊĠĠĠĠĠĠĠ Ġ// Ġconstructor Ġignore Ġthis Ġpointer ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 Ġuntil Ġnext Inst . instruction . register Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( i ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġvisit Load ( next Inst . instruction . reg B (), ĠSlot Type . convert ( mth Info . args [ i Ġ- Ġ 1 ]) !! , Ġnext Inst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġvisit Load ( next Inst . instruction . reg C (), ĠSlot Type . convert ( mth Info . args [ i Ġ- Ġ 1 ]) !! , Ġnext Inst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> Ġvisit Load ( next Inst . instruction . reg D (), ĠSlot Type . convert ( mth Info . args [ i Ġ- Ġ 1 ]) !! , Ġnext Inst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 4 Ġ-> Ġvisit Load ( next Inst . instruction . reg E (), ĠSlot Type . convert ( mth Info . args [ i Ġ- Ġ 1 ]) !! , Ġnext Inst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠDecode Exception (" invoke Ġinstruction Ġregister Ġnumber Ġerror .", Ġnext Inst . cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpush Invoke Inst ( Invoke Type . INV OK ES PE CIAL , Ġnext Inst . instruction . index ) ĊĠĠĠĠĠĠĠ Ġvisit Store ( Slot Type . OBJECT , Ġdal vik Inst . reg A (), Ġnext Frame ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Array Length ( dal vik Inst : ĠTwo Register Decoded Instruction , Ġframe : ĠStack Frame , Ġoffset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit Load ( dal vik Inst . reg B (), ĠSlot Type . ARRAY , Ġoffset ) ĊĠĠĠĠĠĠĠ Ġpush Single Inst ( jvm Op codes . ARRAY LENGTH ) ĊĠĠĠĠĠĠĠ Ġvisit Store ( Slot Type . INT , Ġdal vik Inst . reg A (), Ġframe ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit New Array ( dal vik Inst : ĠTwo Register Decoded Instruction , Ġframe : ĠStack Frame , Ġoffset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit Load ( dal vik Inst . reg B (), ĠSlot Type . INT , Ġoffset ) ĊĠĠĠĠĠĠĠ Ġval Ġarray Type Ġ= Ġdex Node . getType ( dal vik Inst . index ). getAs ArrayType () Ġ?: Ġthrow ĠDecode Exception (" New Ġarray Ġtype Ġerror ", Ġoffset ) ĊĠĠĠĠĠĠĠ Ġif Ġ( array Type . sub Type . getAs ObjectType () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpush Type Inst ( jvm Op codes . ANE WAR R AY , Ġarray Type . sub Type . getAs ObjectType () !!. name With Slash ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Store Array ( Slot Type . OBJECT , Ġdal vik Inst . reg A (), Ġframe ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( array Type . sub Type . getAs Basic Type () Ġ?: Ġthrow ĠDecode Exception (" New Ġarray Ġis Ġnot Ġcorrect Ġtype ", Ġoffset )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBasic Type . BOOLEAN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Int Inst ( jvm Op codes . NE WAR R AY , Ġj vm Op codes . T _ BOOLEAN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Store Array ( Slot Type . BOOLEAN , Ġdal vik Inst . reg A (), Ġframe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBasic Type . BYTE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Int Inst ( jvm Op codes . NE WAR R AY , Ġj vm Op codes . T _ BYTE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Store Array ( Slot Type . BYTE , Ġdal vik Inst . reg A (), Ġframe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBasic Type . CHAR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Int Inst ( jvm Op codes . NE WAR R AY , Ġj vm Op codes . T _ CHAR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Store Array ( Slot Type . CHAR , Ġdal vik Inst . reg A (), Ġframe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBasic Type . SHORT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Int Inst ( jvm Op codes . NE WAR R AY , Ġj vm Op codes . T _ SHORT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Store Array ( Slot Type . SHORT , Ġdal vik Inst . reg A (), Ġframe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBasic Type . INT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Int Inst ( jvm Op codes . NE WAR R AY , Ġj vm Op codes . T _ INT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Store Array ( Slot Type . INT , Ġdal vik Inst . reg A (), Ġframe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBasic Type . FLOAT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Int Inst ( jvm Op codes . NE WAR R AY , Ġj vm Op codes . T _ FLOAT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Store Array ( Slot Type . FLOAT , Ġdal vik Inst . reg A (), Ġframe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBasic Type . LONG Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Int Inst ( jvm Op codes . NE WAR R AY , Ġj vm Op codes . T _ LONG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Store Array ( Slot Type . LONG , Ġdal vik Inst . reg A (), Ġframe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBasic Type . DOUBLE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Int Inst ( jvm Op codes . NE WAR R AY , Ġj vm Op codes . T _ DOUBLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Store Array ( Slot Type . DOUBLE , Ġdal vik Inst . reg A (), Ġframe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDecode Exception (" New Ġarray Ġbasic Ġtype Ġerror ", Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Store Array ( type : ĠSlot Type , Ġslot : ĠInt , Ġframe : ĠStack Frame ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpush Slot Inst ( jvm Op codes . AST ORE , Ġslot ) ĊĠĠĠĠĠĠĠ Ġframe . set Slot Array ( slot , Ġtype ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Check Cast ( dal vik Inst : ĠOne Register Decoded Instruction , Ġframe : ĠStack Frame , Ġoffset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit Load ( dal vik Inst . reg A (), ĠSlot Type . OBJECT , Ġoffset ) ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġdex Node . getType ( dal vik Inst . index ) ĊĠĠĠĠĠĠĠ Ġpush Type Inst ( jvm Op codes . CHECK CAST , Ġtype . name With Slash ()) ĊĠĠĠĠĠĠĠ Ġvisit Store ( Slot Type . OBJECT , Ġdal vik Inst . reg A (), Ġframe ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit InstanceOf ( dal vik Inst : ĠTwo Register Decoded Instruction , Ġframe : ĠStack Frame , Ġoffset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit Load ( dal vik Inst . reg B (), ĠSlot Type . OBJECT , Ġoffset ) ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġdex Node . getType ( dal vik Inst . index ). getAs ObjectType () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠDecode Exception (" Check Cast Ġwithout Ġobject Ġtype ", Ġoffset ) ĊĠĠĠĠĠĠĠ Ġpush Type Inst ( jvm Op codes . INSTANCE OF , Ġtype . name With Slash ()) ĊĠĠĠĠĠĠĠ Ġvisit Store ( Slot Type . INT , Ġdal vik Inst . reg A (), Ġframe ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Array Op ( dal vik Inst : ĠThree Register Decoded Instruction , Ġframe : ĠStack Frame , Ġoffset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit Load ( dal vik Inst . reg B (), ĠSlot Type . OBJECT , Ġoffset ) ĊĠĠĠĠĠĠĠ Ġvisit Load ( dal vik Inst . reg C (), ĠSlot Type . INT , Ġoffset ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( dal vik Inst . opcode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . AG ET Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Type Ġ= Ġframe . get ArrayType Expect ( dal vik Inst . reg B ()). last Type () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( array Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . INT Ġ-> Ġpush Single Inst ( jvm Op codes . IAL O AD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . FLOAT Ġ-> Ġpush Single Inst ( jvm Op codes . F AL O AD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠDecode Exception (" Error Ġarray Ġtype : Ġ$ array Type Ġfor ĠOp codes . AG ET ", Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Store ( array Type , Ġdal vik Inst . reg A (), Ġframe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . AG ET _ W IDE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Type Ġ= Ġframe . get ArrayType Expect ( dal vik Inst . reg B ()). last Type () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( array Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . LONG Ġ-> Ġpush Single Inst ( jvm Op codes . L AL O AD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . DOUBLE Ġ-> Ġpush Single Inst ( jvm Op codes . DAL O AD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠDecode Exception (" Error Ġarray Ġtype : Ġ$ array Type Ġfor ĠOp codes . AG ET _ WID R ", Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Store ( array Type , Ġdal vik Inst . reg A (), Ġframe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . AG ET _ OBJECT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Single Inst ( jvm Op codes . A AL O AD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Store ( Slot Type . OBJECT , Ġdal vik Inst . reg A (), Ġframe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . AG ET _ BOOLEAN , ĠOp codes . AG ET _ BYTE , ĠOp codes . AG ET _ CHAR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Single Inst ( jvm Op codes . BAL O AD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Store ( Slot Type . BYTE , Ġdal vik Inst . reg A (), Ġframe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . AG ET _ SHORT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Single Inst ( jvm Op codes . SAL O AD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Store ( Slot Type . SHORT , Ġdal vik Inst . reg A (), Ġframe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . AP UT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Type Ġ= Ġframe . get ArrayType Expect ( dal vik Inst . reg B ()). last Type () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Load ( dal vik Inst . reg A (), Ġarray Type , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( array Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . INT Ġ-> Ġpush Single Inst ( jvm Op codes . I AST ORE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . FLOAT Ġ-> Ġpush Single Inst ( jvm Op codes . FA STORE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠDecode Exception (" Error Ġarray Ġtype : Ġ$ array Type Ġfor ĠOpcode . AP UT ", Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . AP UT _ W IDE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Type Ġ= Ġframe . get ArrayType Expect ( dal vik Inst . reg B ()). last Type () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Load ( dal vik Inst . reg A (), Ġarray Type , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( array Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . LONG Ġ-> Ġpush Single Inst ( jvm Op codes . LAST ORE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSlot Type . DOUBLE Ġ-> Ġpush Single Inst ( jvm Op codes . D AST ORE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠDecode Exception (" Error Ġarray Ġtype : Ġ$ array Type Ġfor ĠOpcode . AP UT _ W IDE ", Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . AP UT _ OBJECT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Load ( dal vik Inst . reg A (), ĠSlot Type . OBJECT , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Single Inst ( jvm Op codes . AA STORE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . AP UT _ BOOLEAN , ĠOp codes . AP UT _ BYTE , ĠOp codes . AP UT _ CHAR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Load ( dal vik Inst . reg A (), ĠSlot Type . BYTE , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Single Inst ( jvm Op codes . B AST ORE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . AP UT _ SHORT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Load ( dal vik Inst . reg A (), ĠSlot Type . SHORT , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Single Inst ( jvm Op codes . SA STORE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Payload Inst ( dal vik Inst : ĠOne Register Decoded Instruction , Ġframe : ĠStack Frame , Ġoffset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġslot Ġ= Ġdal vik Inst . reg A () ĊĠĠĠĠĠĠĠ Ġwhen Ġ( dal vik Inst . opcode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . FILL _ ARRAY _ DATA Ġ-> Ġpush Fill Array Data Payload Inst ( slot , Ġdal vik Inst . target , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe . get ArrayType Expect ( slot ). last Type ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . PACK ED _ SWITCH Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Load ( slot , Ġframe . get Slot ( slot )?. getType OrNull () Ġ?: Ġthrow ĠDecode Exception (" Empty Ġslot Ġtype Ġ[$ slot ] Ġfor ĠPACK ED _ SWITCH ", Ġoffset ), Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdef Label Ġ= Ġm th Node . getNext Inst ( offset )?. getLabel Or Put ()?. value Ġ?: Ġthrow ĠDecode Exception (" No Ġdefault Ġlabel ", Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Packed Switch Payload Inst ( dal vik Inst . target , Ġdef Label ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . SPARSE _ SWITCH Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Load ( slot , Ġframe . get Slot ( slot )?. getType OrNull () Ġ?: Ġthrow ĠDecode Exception (" Empty Ġslot Ġtype Ġ[$ slot ] Ġfor ĠS PARSE _ SWITCH ", Ġoffset ), Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdef Label Ġ= Ġm th Node . getNext Inst ( offset )?. getLabel Or Put ()?. value Ġ?: Ġthrow ĠDecode Exception (" No Ġdefault Ġlabel ", Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Sparse Switch Payload Inst ( dal vik Inst . target , Ġdef Label ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Filled New Array ( dal vik Inst : ĠDe coded Instruction , Ġframe : ĠStack Frame , Ġoffset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġdal vik Inst . register Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( i ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġvisit Push Or L dc ( dal vik Inst . reg A (), ĠSlot Type . INT , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġvisit Push Or L dc ( dal vik Inst . reg B (), ĠSlot Type . INT , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġvisit Push Or L dc ( dal vik Inst . reg C (), ĠSlot Type . INT , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> Ġvisit Push Or L dc ( dal vik Inst . reg D (), ĠSlot Type . INT , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 4 Ġ-> Ġvisit Push Or L dc ( dal vik Inst . reg E (), ĠSlot Type . INT , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpush Multi AN ew Array Insn (" I ", Ġdal vik Inst . register Count ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Filled New Array Range ( dal vik Inst : ĠRegister Range Decoded Instruction , Ġframe : ĠStack Frame , Ġoffset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġdal vik Inst . register Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Push Or L dc ( slot Num ( dal vik Inst . a Ġ+ Ġi ), ĠSlot Type . INT , Ġoffset ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpush Multi AN ew Array Insn (" I ", Ġdal vik Inst . register Count ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit Move Exception ( dal vik Inst : ĠOne Register Decoded Instruction , Ġframe : ĠStack Frame , Ġoffset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġnow Ġonly Ġmerge Ġtry - catch Ġblock Ġ` start ` Ġinst ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġneed Ġanalysis Ġinst Ġwhich Ġcan Ġthrow Ġexception ĊĠĠĠĠĠĠĠ Ġcatch 2 Exception [ offset ]?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġframe . add Pre Frame ( it . second . first ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġframe . merge () ĊĠĠĠĠĠĠĠ Ġvisit Store ( Slot Type . OBJECT , Ġdal vik Inst . reg A (), Ġframe ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlog Info () Ġ= Ġ"${ mth Node . mth Info }" Ċ } Ċ