package Ġorg . open rs 2 . de ob . ast . transform Ċ Ċ import Ġcom . github . jav ap ar ser . ast . Compilation Unit Ċ import Ġcom . github . jav ap ar ser . ast . expr . Binary Expr Ċ import Ġcom . github . jav ap ar ser . ast . expr . Integer Literal Expr Ċ import Ġcom . github . jav ap ar ser . ast . expr . Long Literal Expr Ċ import Ġorg . open rs 2 . de ob . ast . Library Ċ import Ġorg . open rs 2 . de ob . ast . Library Group Ċ import Ġorg . open rs 2 . de ob . ast . util . checked As Int Ċ import Ġorg . open rs 2 . de ob . ast . util . checked As Long Ċ import Ġorg . open rs 2 . de ob . ast . util . to Long Literal Expr Ċ import Ġorg . open rs 2 . de ob . ast . util . walk Ċ import Ġjavax . inject . Singleton Ċ Ċ @ Singleton Ċ public Ġclass ĠBit Mask Transformer Ġ: ĠTransformer () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġtransform Unit ( group : ĠLibrary Group , Ġlibrary : ĠLibrary , Ġunit : ĠCompilation Unit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠ Ġ* ĠTransform : ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ( x Ġ& Ġy ) Ġ>> Ġz ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġto : ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ( x Ġ>> Ġz ) Ġ& Ġ( y Ġ>> Ġz ) ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠFor Ġexample : ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ( x Ġ& Ġ 0 xFF 0 0 ) Ġ>> Ġ 8 ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġto : ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ( x Ġ>> Ġ 8 ) Ġ& Ġ 0 xFF ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġunit . walk Ġ{ Ġexpr : ĠBinary Expr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshift Op Ġ= Ġexpr . operator ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbit wise Expr Ġ= Ġexpr . left ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsh amt Expr Ġ= Ġexpr . right ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( shift Op Ġ! in ĠRIGHT _ SHIFT _ OPS Ġ|| Ġbit wise Expr Ġ! is ĠBinary Expr Ġ|| Ġsh amt Expr Ġ! is ĠInteger Literal Expr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ walk ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbit wise Op Ġ= Ġbit wise Expr . operator ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarg Expr Ġ= Ġbit wise Expr . left ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmask Expr Ġ= Ġbit wise Expr . right ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bit wise Op Ġ! in ĠBIT WISE _ OPS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ walk ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsh amt Ġ= Ġsh amt Expr . checked As Int () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( mask Expr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInteger Literal Expr Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmask Ġ= Ġmask Expr . checked As Int () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmask Ġ= Ġwhen Ġ( shift Op ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBinary Expr . Operator . SIGNED _ RIGHT _ SHIFT Ġ-> Ġmask Ġshr Ġsh amt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBinary Expr . Operator . UNSIGNED _ RIGHT _ SHIFT Ġ-> Ġmask Ġ ush r Ġsh amt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Invalid Ġshift Op ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmask Expr Ġ= ĠInteger Literal Expr ( mask . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLong Literal Expr Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmask Ġ= Ġmask Expr . checked As Long () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmask Ġ= Ġwhen Ġ( shift Op ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBinary Expr . Operator . SIGNED _ RIGHT _ SHIFT Ġ-> Ġmask Ġshr Ġsh amt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBinary Expr . Operator . UNSIGNED _ RIGHT _ SHIFT Ġ-> Ġmask Ġ ush r Ġsh amt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Invalid Ġshift Op ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmask Expr Ġ= Ġmask . to Long Literal Expr () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn @ walk ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . replace ( Binary Expr ( Binary Expr ( arg Expr . clone (), Ġsh amt Expr . clone (), Ġshift Op ), Ġmask Expr , Ġbit wise Op )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠ Ġ* ĠTransform : ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ( x Ġ<< Ġy ) Ġ& Ġz ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġto : ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ( x Ġ& Ġ( z Ġ>>> Ġy )) Ġ<< Ġy ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠFor Ġexample : ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ( x Ġ<< Ġ 8 ) Ġ& Ġ 0 xFF 0 0 ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġto : ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġ( x Ġ& Ġ 0 xFF ) Ġ<< Ġ 8 ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġunit . walk Ġ{ Ġexpr : ĠBinary Expr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbit wise Op Ġ= Ġexpr . operator ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshift Expr Ġ= Ġexpr . left ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmask Expr Ġ= Ġexpr . right ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bit wise Op Ġ! in ĠBIT WISE _ OPS Ġ|| Ġshift Expr Ġ! is ĠBinary Expr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ walk ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshift Op Ġ= Ġshift Expr . operator ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarg Expr Ġ= Ġshift Expr . left ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsh amt Expr Ġ= Ġshift Expr . right ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( shift Op Ġ!= ĠBinary Expr . Operator . LEFT _ SHIFT Ġ|| Ġsh amt Expr Ġ! is ĠInteger Literal Expr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ walk ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsh amt Ġ= Ġsh amt Expr . checked As Int () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Mask Expr Ġ= Ġwhen Ġ( mask Expr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInteger Literal Expr Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmask Ġ= Ġmask Expr . checked As Int () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sh amt Ġ> ĠInteger . numberOf Trailing Z eros ( mask )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ walk ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmask Ġ= Ġmask Ġ ush r Ġsh amt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInteger Literal Expr ( mask . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLong Literal Expr Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmask Ġ= Ġmask Expr . checked As Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sh amt Ġ> Ġjava . lang . Long . numberOf Trailing Z eros ( mask )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ walk ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmask Ġ= Ġmask Ġ ush r Ġsh amt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmask . to Long Literal Expr () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn @ walk ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . replace ( Binary Expr ( Binary Expr ( arg Expr . clone (), Ġnew Mask Expr , Ġbit wise Op ), Ġsh amt Expr . clone (), Ġshift Op )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠRIGHT _ SHIFT _ OPS Ġ= Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBinary Expr . Operator . SIGNED _ RIGHT _ SHIFT , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBinary Expr . Operator . UNSIGNED _ RIGHT _ SHIFT ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠBIT WISE _ OPS Ġ= Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBinary Expr . Operator . BINARY _ AND , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBinary Expr . Operator . BINARY _ OR , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBinary Expr . Operator . XOR ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ