package Ġcom . elements . jvm by kotlin . runtime data Ċ Ċ import Ġcom . elements . jvm by kotlin . runtime data . heap . Yu Object Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠOper and Ġstack Ġin ĠJava Ġstack , Ġfor Ġmethod Ġinstruction Ġexecution Ċ Ġ* ĠRefer Ġto Ġ< a Ġhref =" https :// docs . oracle . com / javase / specs / jv ms / se 8 / html / jv ms - 2 . html # jv ms - 2 . 6 . 2 "> Operand ĠStack s </ a > Ċ Ġ* Ċ Ġ* Ġ@ param Ġmax Stack Ġdepth Ġof Ġthe Ġoperand Ġstack Ġdepends Ġon Ġmethod , Ċ Ġ* Ġdetermined Ġat Ġcompile Ġtime Ġand Ġincluded Ġin Ġthe Ġclass Ġfile Ġdata Ġfor Ġeach Ġmethod . Ċ Ġ* Ċ Ġ* Ġ@ author Ġhan zhang Ċ Ġ*/ Ċ class ĠOper and Stack ( val Ġmax Stack : ĠInt ) Ġ{ ĊĠĠĠ Ġval Ġslots : ĠStack < Slot > Ġ= ĠStack () ĊĊĠĠĠ Ġfun Ġpush Slot ( slot : ĠSlot ) Ġ{ ĊĠĠĠĠĠĠĠ Ġslots . push ( slot ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpop Slot (): ĠSlot Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġslots . pop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpush Int ( i : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġslots . push ( Slot ( i )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpop Int (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġslots . pop (). base Type ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpush Float ( i : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġslots . push ( Slot ( i . to Bits ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpop Float (): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFloat . from Bits ( slots . pop (). base Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġtodo Ġfix Ġthe Ġint Ġoverflow ĊĠĠĠ Ġfun Ġpush Long ( value : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġslots . push ( Slot ( value . toInt ())) ĊĠĠĠĠĠĠĠ Ġslots . push ( Slot (( value Ġshr Ġ 3 2 ). toInt ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpop Long (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhigh Ġ= Ġslots . pop (). base Type . to Long () ĊĠĠĠĠĠĠĠ Ġval Ġlow Ġ= Ġslots . pop (). base Type . to Long () ĊĠĠĠĠĠĠĠ Ġreturn Ġ( high Ġshl Ġ 3 2 ) Ġor Ġlow ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpush Double ( value : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlong Value : ĠLong Ġ= Ġvalue . to Bits () ĊĠĠĠĠĠĠĠ Ġpush Long ( longValue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpop Double (): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlong Value : ĠLong Ġ= Ġpop Long () ĊĠĠĠĠĠĠĠ Ġreturn ĠDouble . from Bits ( longValue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpush Boolean ( value : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpush Int ( if Ġ( value ) Ġ 1 Ġelse Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpop Boolean (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġpop Int () Ġ== Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpush Ref ( value : ĠY u Object ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġslots . push ( Slot ( value )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpop Ref (): ĠY u Object ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġslots . pop (). reference Type ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Ref From Top ( n : ĠInt ): ĠY u Object ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġslots [ slots . size Ġ- Ġn Ġ- Ġ 1 ]. reference Type ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġslots . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Operand Stack Ġmax Stack =$ max Stack , Ġslots =\ n ${ slots . join ToString ("\ n ") }" ĊĠĠĠ Ġ} Ċ }