package Ġcom . ree va js . ree va . transformer Ċ Ċ import Ġcom . ree va js . ree va . transformer . op codes . Jump Instr Ċ import Ġcom . ree va js . ree va . transformer . op codes . Return Ċ import Ġcom . ree va js . ree va . utils . expect Ċ Ċ class ĠIR Validator ( private Ġval Ġinfo : ĠFunction Info ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġir : ĠIR Ġinline Ġget () Ġ= Ġinfo . ir ĊĠĠĠ Ġprivate Ġvar Ġstack Height Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġval Ġpost Stack Height s Ġ= Ġmutable Map Of < Int , ĠInt >() ĊĊĠĠĠ Ġfun Ġvalidate () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ(( index , Ġopcode ) Ġin Ġir . op codes . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( handler Ġin Ġir . handlers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġhandler . handler ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( stack Height Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected Ġstack Ġheight Ġto Ġbe Ġ 1 Ġgoing Ġinto Ġhandler Ġat Ġ@$ index " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġa Ġhandler , Ġthe Ġonly Ġthing Ġon Ġthe Ġstack Ġis Ġthe Ġexception ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack Height Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( opcode Ġ! is ĠReturn Ġ|| Ġstack Height Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected Ġa Ġreturning Ġstack Ġheight Ġof Ġ 1 Ġat Ġopcode Ġ$ index Ġbut Ġfound Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" a Ġheight Ġof Ġ$ stack Height " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack Height Ġ+= Ġopcode . stack Height Modifier ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( stack Height Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Detected Ġnegative Ġstack Ġheight Ġof Ġ$ stack Height Ġafter Ġopcode Ġ$ index " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting Height Ġ= Ġpost Stack Height s [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( existing Height Ġ== Ġnull Ġ|| Ġexisting Height Ġ== Ġstack Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠInclude Ġjump Ġlocation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected Ġstack Ġheight Ġof Ġ$ existing Height Ġat Ġopcode Ġ$ index , Ġbut Ġfound Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" a Ġheight Ġof Ġ$ stack Height Ġfrom Ġa Ġpreviously Ġencountered Ġjump " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Stack Height s [ index ] Ġ= Ġstack Height ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( opcode Ġis ĠJump Instr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting Height Ġ= Ġpost Stack Height s [ opcode . to Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( existing Height Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( existing Height Ġ== Ġstack Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected Ġstack Ġheight Ġof Ġ$ existing Height Ġwhen Ġjump ing Ġfrom Ġopcode Ġ$ index Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" to Ġ${ opcode . to }, Ġbut Ġfound Ġa Ġheight Ġof Ġ$ stack Height " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Stack Height s [ opcode . to Ġ- Ġ 1 ] Ġ= Ġstack Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ