package Ġdev . bin club . bin sc ure . processors . ar ithmetic Ċ Ċ import Ġdev . bin club . bin sc ure . IC lass Processor Ċ import Ġdev . bin club . bin sc ure . classpath . Class Sources Ċ import Ġdev . bin club . bin sc ure . configuration . Configuration Manager . root Config Ċ import Ġdev . bin club . bin sc ure . for Class Ċ import Ġdev . bin club . bin sc ure . for Method Ċ import Ġdev . bin club . bin sc ure . utils . Instruction Modifier Ċ import Ġdev . bin club . bin sc ure . utils . insn Builder Ċ import Ġdev . bin club . bin sc ure . utils . random Branch Ċ import Ġorg . object web . asm . Op codes .* Ċ import Ġorg . object web . asm . tree . Abstract Insn Node Ċ import Ġorg . object web . asm . tree . Class Node Ċ import Ġjava . lang . NullPointerException Ċ Ċ import Ġkotlin . math . round ToInt Ċ Ċ /** Ċ Ġ* ĠM ixed Ġboolean Ġarithmetic Ġis Ġthe Ġprocess Ġof Ġconverting Ġa Ġclass ical Ġarithmetic Ġoperation Ġ( e . g . Ġadd , Ġsub , Ġmul ...) Ġinto Ċ Ġ* Ġa Ġcombination Ġof Ġboth Ġclass ical Ġand Ġboolean Ġarithmetic Ġoperations Ċ Ġ* Ċ Ġ* ĠWe Ġdo Ġthis Ġby Ġusing Ġa Ġlist Ġof Ġknown Ġboolean Ġident ities Ġand Ġrepeatedly Ġapplying Ġthem Ċ Ġ* Ċ Ġ* ĠWe Ġcan Ġeven Ġapply Ġident ities Ġto Ġexisting Ġident ities Ġmaking Ġthe Ġcalculation Ġrecursively Ġlarger Ċ Ġ* Ċ Ġ* Ġ@ author Ġcook Ġ 0 9 / Oct / 2 0 2 0 Ċ Ġ*/ Ċ class ĠM ba Transformer ( source : ĠClass Sources ): ĠI Class Processor ( source ) Ġ{ Ċ ĉ override Ġval Ġprogress Description : ĠString Ġ= Ġ" Apply ing Ġmixed Ġboolean Ġarithmetic " Ċ ĉ override Ġval Ġconfig Ġ= Ġroot Config . ar ithmetic ĊĉĊ ĉ private Ġval Ġmax Method Size Ġ= Ġ 6 5 5 3 5 Ċ ĉ // Ġabout Ġ 2 Ġbytes Ġper Ġinstruction Ġso Ġmake Ġcon serv ative Ġestimate Ċ ĉ private Ġval Ġmax Ins ns Ġ= Ġ( max Method Size Ġ/ Ġ 3 . 5 ). round ToInt () ĊĉĊ ĉ override Ġfun Ġprocess ( Ċĉ ĉ source : ĠClass Sources , Ċĉ ĉ classes : ĠMutable Collection < Class Node >, Ċĉ ĉ pass Through : ĠMutable Map < String , ĠByteArray > Ċ ĉ ) Ġ{ Ċĉ ĉ if Ġ(! config . enabled ) Ġreturn ĊĉĉĊĉ ĉ for Class ( classes ) Ġ{ Ġcn Ġ-> Ċĉĉ ĉ for Method ( cn ) Ġ{ Ġmn Ġ-> Ċĉĉĉ ĉ try Ġ{ Ċĉĉĉĉ ĉ val Ġlist Ġ= Ġmn . instructions Ċĉĉĉĉ ĉ if Ġ( list Ġ!= Ġnull Ġ&& Ġlist . size () Ġ> Ġ 0 ) Ġ{ Ċĉĉĉĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġconfig . repeat ) Ġ{ Ċĉĉĉĉĉĉ ĉ val Ġmodifier Ġ= ĠInstruction Modifier () Ċĉĉĉĉĉĉ ĉ var Ġskip Ġ= Ġ 0 Ċĉĉĉĉĉĉ ĉ for Ġ( op Ġin Ġlist ) Ġ{ Ċĉĉĉĉĉĉĉ ĉ if Ġ( skip Ġ> Ġ 0 ) Ġ{ Ċĉĉĉĉĉĉĉĉ ĉ skip Ġ-= Ġ 1 Ċĉĉĉĉĉĉĉĉ ĉ continue Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉĉ ĉ skip Ġ+= Ġsubstitute ( op , Ġmodifier ) Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ if Ġ( modifier . isEmpty ()) Ġbreak Ċĉĉĉĉĉĉ ĉ if Ġ(! modifier . apply ( list )) Ġ{ Ċĉĉĉĉĉĉĉ ĉ println ("\ r Warning : ĠSto pped ĠM BA Ġfor Ġmethod Ġ${ cn . getN ice Name ()}. ${ mn . name }${ mn . desc } Ġ($ max Ins ns Ġinstructions )") Ċĉĉĉĉĉĉĉ ĉ break Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ġcatch Ġ( n : ĠNullPointerException ) Ġ{ Ċĉĉĉĉ ĉ n . printStackTrace () Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĉĊ ĉ fun Ġsubstitute ( op : ĠAbstract Insn Node , Ġmodifier : ĠInstruction Modifier ): ĠInt Ġ{ Ċĉ ĉ var Ġskip Ġ= Ġ 0 Ċĉ ĉ when Ġ{ Ċĉĉ ĉ op . opcode Ġ== ĠI CONST _ M 1 Ġ&& Ġop . next ?. opcode Ġ== ĠI XOR Ġ&& Ġop . next . next ?. opcode Ġ== ĠI AND Ġ-> Ġ{ Ċĉĉĉ ĉ modifier . remove ( op . next . next ) Ċĉĉĉ ĉ modifier . remove ( op . next ) Ċĉĉĉ ĉ val Ġsub Ġ= Ġrandom Branch ( random , Ġ{ Ċĉĉĉĉ ĉ // Ġx Ġ& Ġ~ y Ġ== Ġ( x Ġ| Ġy ) Ġ- Ġy Ċĉĉĉĉ ĉ insn Builder Ġ{ Ċĉĉĉĉĉ ĉ dup _ x 1 () Ċĉĉĉĉĉ ĉ ior () Ċĉĉĉĉĉ ĉ swap () Ċĉĉĉĉĉ ĉ is ub () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ }, Ġ{ Ċĉĉĉĉ ĉ // Ġx Ġ& Ġ~ y Ġ== Ġx Ġ- Ġ( x Ġ& Ġy ) Ċĉĉĉĉ ĉ insn Builder Ġ{ Ċĉĉĉĉĉ ĉ swap () Ċĉĉĉĉĉ ĉ dup _ x 1 () Ċĉĉĉĉĉ ĉ i and () Ċĉĉĉĉĉ ĉ is ub () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ }) Ċĉĉĉ ĉ modifier . replace ( op , Ġsub ) Ċĉĉĉ ĉ skip Ġ= Ġ 2 Ċĉĉ ĉ } Ċĉĉ ĉ op . opcode Ġ== ĠIS UB Ġ&& Ġop . next ?. opcode Ġ== ĠI CONST _ M 1 Ġ&& Ġop . next . next ?. opcode Ġ== ĠI XOR Ġ-> Ġ{ Ċĉĉĉ ĉ modifier . remove ( op . next . next ) Ċĉĉĉ ĉ modifier . remove ( op . next ) Ċĉĉĉ ĉ val Ġsub Ġ= Ġrandom Branch ( random , Ġ{ Ċĉĉĉĉ ĉ // Ġ~( x Ġ- Ġy ) Ġ== Ġy Ġ- Ġx Ġ- Ġ 1 Ċĉĉĉĉ ĉ insn Builder Ġ{ Ċĉĉĉĉĉ ĉ swap () Ċĉĉĉĉĉ ĉ is ub () Ċĉĉĉĉĉ ĉ iconst _ 1 () Ċĉĉĉĉĉ ĉ is ub () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ }, Ġ{ Ċĉĉĉĉ ĉ // Ġ~( x Ġ- Ġy ) Ġ== Ġ~ x Ġ+ Ġy Ċĉĉĉĉ ĉ insn Builder Ġ{ Ċĉĉĉĉĉ ĉ swap () Ċĉĉĉĉĉ ĉ iconst _ m 1 () Ċĉĉĉĉĉ ĉ ix or () Ċĉĉĉĉĉ ĉ i add () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ }) Ċĉĉĉ ĉ modifier . replace ( op , Ġsub ) Ċĉĉĉ ĉ skip Ġ= Ġ 2 Ċĉĉ ĉ } Ċĉĉ ĉ op . opcode Ġ== ĠI CONST _ M 1 Ġ&& Ġop . next ?. opcode Ġ== ĠI XOR Ġ-> Ġ{ Ċĉĉĉ ĉ // Ġ~ x Ġ== Ġ(- x )- 1 Ċĉĉĉ ĉ modifier . remove ( op . next ) Ċĉĉĉ ĉ modifier . replace ( op , Ġinsn Builder Ġ{ Ċĉĉĉĉ ĉ ine g () Ċĉĉĉĉ ĉ iconst _ m 1 () Ċĉĉĉĉ ĉ i add () Ċĉĉĉ ĉ }) Ċĉĉĉ ĉ skip Ġ= Ġ 1 Ċĉĉ ĉ } Ċĉĉ ĉ op . opcode Ġ== ĠIN EG Ġ-> Ġ{ Ċĉĉĉ ĉ val Ġsub Ġ= Ġrandom Branch ( random , Ġ{ Ċĉĉĉĉ ĉ // Ġ- x Ġ== Ġ(~ x )+ 1 Ċĉĉĉĉ ĉ insn Builder Ġ{ Ċĉĉĉĉĉ ĉ iconst _ m 1 () Ċĉĉĉĉĉ ĉ ix or () Ċĉĉĉĉĉ ĉ iconst _ 1 () Ċĉĉĉĉĉ ĉ i add () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ }, Ġ{ Ċĉĉĉĉ ĉ // Ġ~ x Ġ== Ġ~( x - 1 ) Ċĉĉĉĉ ĉ insn Builder Ġ{ Ċĉĉĉĉĉ ĉ iconst _ 1 () Ċĉĉĉĉĉ ĉ is ub () Ċĉĉĉĉĉ ĉ iconst _ m 1 () Ċĉĉĉĉĉ ĉ ix or () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ }) Ċĉĉĉ ĉ modifier . replace ( op , Ġsub ) Ċĉĉ ĉ } Ċĉĉ ĉ op . opcode Ġ== ĠI ADD Ġ-> Ġ{ Ċĉĉĉ ĉ val Ġsub Ġ= Ġrandom Branch ( random , Ġ{ Ċĉĉĉĉ ĉ // Ġx Ġ+ Ġy Ġ== Ġ( x Ġ- Ġ~ y ) Ġ- Ġ 1 Ċĉĉĉĉ ĉ insn Builder Ġ{ Ċĉĉĉĉĉ ĉ iconst _ m 1 () Ċĉĉĉĉĉ ĉ ix or () Ċĉĉĉĉĉ ĉ is ub () Ċĉĉĉĉĉ ĉ iconst _ 1 () Ċĉĉĉĉĉ ĉ is ub () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ }, Ġ{ Ċĉĉĉĉ ĉ // Ġx Ġ+ Ġy Ġ== Ġ( x Ġ^ Ġy ) Ġ+ Ġ( 2 Ġ* Ġ( x Ġ& Ġy )) Ċĉĉĉĉ ĉ insn Builder Ġ{ Ċĉĉĉĉĉ ĉ dup 2 () Ġ// Ġ[ x , Ġy , Ġx , Ġy ] Ċĉĉĉĉĉ ĉ ix or () Ġ// Ġ[ x ^ y , Ġx , Ġy ] Ċĉĉĉĉĉ ĉ dup _ x 2 () Ġ// Ġ[ x ^ y , Ġx , Ġy , Ġx ^ y ] Ċĉĉĉĉĉ ĉ pop () Ġ// Ġ[ x , Ġy , Ġx ^ y ] Ċĉĉĉĉĉ ĉ i and () Ġ// Ġ[ x & y , Ġx ^ y ] Ċĉĉĉĉĉ ĉ iconst _ 2 () Ġ// Ġ[ 2 , Ġ( x & y ), Ġx ^ y ] Ċĉĉĉĉĉ ĉ im ul () Ġ// Ġ[ 2 *( x & y ), Ġx ^ y ] Ċĉĉĉĉĉ ĉ i add () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ }, Ġ{ Ċĉĉĉĉ ĉ // Ġx Ġ+ Ġy Ġ== Ġ( x Ġ| Ġy ) Ġ+ Ġ( x Ġ& Ġy ) Ċĉĉĉĉ ĉ insn Builder Ġ{ Ċĉĉĉĉĉ ĉ dup 2 () Ċĉĉĉĉĉ ĉ ior () Ċĉĉĉĉĉ ĉ dup _ x 2 () Ċĉĉĉĉĉ ĉ pop () Ċĉĉĉĉĉ ĉ i and () Ċĉĉĉĉĉ ĉ i add () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ }, Ġ{ Ċĉĉĉĉ ĉ // Ġx Ġ+ Ġy Ġ== Ġ( 2 *( x | y )) Ġ- Ġ( x ^ y ) Ċĉĉĉĉ ĉ insn Builder Ġ{ Ċĉĉĉĉĉ ĉ dup 2 () Ġ// Ġ[ x , Ġy , Ġx , Ġy ] Ċĉĉĉĉĉ ĉ ior () Ġ// Ġ[ x | y , Ġx , Ġy ] Ċĉĉĉĉĉ ĉ iconst _ 2 () Ġ// Ġ[ 2 , Ġx | y , Ġx , Ġy ] Ċĉĉĉĉĉ ĉ im ul () Ġ// Ġ[ 2 *( x | y ), Ġx , Ġy ] Ċĉĉĉĉĉ ĉ dup _ x 2 () Ġ// Ġ[ x | y , Ġx , Ġy , Ġx | y ] Ċĉĉĉĉĉ ĉ pop () Ġ// Ġ[ x , Ġy , Ġx | y ] Ċĉĉĉĉĉ ĉ ix or () Ġ// Ġ[ x ^ y , Ġx | y ] Ċĉĉĉĉĉ ĉ is ub () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ }) Ċĉĉĉ ĉ modifier . replace ( op , Ġsub ) Ċĉĉ ĉ } Ċĉĉ ĉ op . opcode Ġ== ĠIS UB Ġ-> Ġ{ Ċĉĉĉ ĉ val Ġsub Ġ= Ġrandom Branch ( random , Ġ{ Ċĉĉĉĉ ĉ // Ġx Ġ- Ġy Ġ== Ġx Ġ+ Ġ~ y Ġ+ Ġ 1 Ċĉĉĉĉ ĉ insn Builder Ġ{ Ċĉĉĉĉĉ ĉ iconst _ m 1 () Ċĉĉĉĉĉ ĉ ix or () Ċĉĉĉĉĉ ĉ i add () Ċĉĉĉĉĉ ĉ iconst _ 1 () Ċĉĉĉĉĉ ĉ i add () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ }, Ġ{ Ċĉĉĉĉ ĉ // Ġx Ġ- Ġy Ġ== Ġ( x ^ y ) Ġ- Ġ 2 ( ~ x Ġ& Ġy ) Ċĉĉĉĉ ĉ insn Builder Ġ{ Ċĉĉĉĉĉ ĉ dup 2 () Ċĉĉĉĉĉ ĉ ix or () Ċĉĉĉĉĉ ĉ dup _ x 2 () Ċĉĉĉĉĉ ĉ pop () Ċĉĉĉĉĉ ĉ swap () Ċĉĉĉĉĉ ĉ iconst _ m 1 () Ċĉĉĉĉĉ ĉ ix or () Ċĉĉĉĉĉ ĉ i and () Ċĉĉĉĉĉ ĉ iconst _ 2 () Ċĉĉĉĉĉ ĉ im ul () Ċĉĉĉĉĉ ĉ is ub () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ }, Ġ{ Ċĉĉĉĉ ĉ // Ġx Ġ- Ġy Ġ== Ġ( x Ġ& Ġ~ y ) Ġ- Ġ(~ x Ġ& Ġy ) Ċĉĉĉĉ ĉ insn Builder Ġ{ Ċĉĉĉĉĉ ĉ dup 2 () Ċĉĉĉĉĉ ĉ iconst _ m 1 () Ċĉĉĉĉĉ ĉ ix or () Ċĉĉĉĉĉ ĉ i and () Ċĉĉĉĉĉ ĉ dup _ x 2 () Ċĉĉĉĉĉ ĉ pop () Ċĉĉĉĉĉ ĉ swap () Ċĉĉĉĉĉ ĉ iconst _ m 1 () Ċĉĉĉĉĉ ĉ ix or () Ċĉĉĉĉĉ ĉ i and () Ċĉĉĉĉĉ ĉ is ub () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ }, Ġ{ Ċĉĉĉĉ ĉ // Ġx Ġ- Ġy Ġ== Ġ 2 ( x Ġ& Ġ~ y ) Ġ- Ġ( x Ġ^ Ġy ) Ċĉĉĉĉ ĉ insn Builder Ġ{ Ċĉĉĉĉĉ ĉ dup 2 () Ċĉĉĉĉĉ ĉ iconst _ m 1 () Ċĉĉĉĉĉ ĉ ix or () Ċĉĉĉĉĉ ĉ i and () Ċĉĉĉĉĉ ĉ iconst _ 2 () Ċĉĉĉĉĉ ĉ im ul () Ċĉĉĉĉĉ ĉ dup _ x 2 () Ċĉĉĉĉĉ ĉ pop () Ċĉĉĉĉĉ ĉ ix or () Ċĉĉĉĉĉ ĉ is ub () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ }) Ċĉĉĉ ĉ modifier . replace ( op , Ġsub ) Ċĉĉ ĉ } Ċĉĉ ĉ op . opcode Ġ== ĠI XOR Ġ-> Ġ{ Ċĉĉĉ ĉ val Ġsub Ġ= Ġrandom Branch ( random , Ġ{ Ċĉĉĉĉ ĉ // Ġx Ġ^ Ġy Ġ== Ġ( x Ġ| Ġy ) Ġ- Ġ( x Ġ& Ġy ) Ċĉĉĉĉ ĉ insn Builder Ġ{ Ċĉĉĉĉĉ ĉ dup 2 () Ċĉĉĉĉĉ ĉ ior () Ċĉĉĉĉĉ ĉ dup _ x 2 () Ċĉĉĉĉĉ ĉ pop () Ċĉĉĉĉĉ ĉ i and () Ċĉĉĉĉĉ ĉ is ub () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ }, Ġ{ Ċĉĉĉĉ ĉ // Ġx Ġ^ Ġy Ġ== Ġ( x Ġ& Ġ~ y ) Ġ| Ġ(~ x Ġ& Ġy ) Ċĉĉĉĉ ĉ insn Builder Ġ{ Ċĉĉĉĉĉ ĉ dup 2 () Ċĉĉĉĉĉ ĉ iconst _ m 1 () Ċĉĉĉĉĉ ĉ ix or () Ċĉĉĉĉĉ ĉ i and () Ċĉĉĉĉĉ ĉ dup _ x 2 () Ċĉĉĉĉĉ ĉ pop () Ċĉĉĉĉĉ ĉ swap () Ċĉĉĉĉĉ ĉ iconst _ m 1 () Ċĉĉĉĉĉ ĉ ix or () Ċĉĉĉĉĉ ĉ i and () Ċĉĉĉĉĉ ĉ ior () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ }, Ġ{ Ċĉĉĉĉ ĉ // Ġx Ġ^ Ġy Ġ== Ġ( x Ġ| Ġy ) Ġ& Ġ(~ x Ġ| Ġ~ y ) Ċĉĉĉĉ ĉ insn Builder Ġ{ Ċĉĉĉĉĉ ĉ dup 2 () Ċĉĉĉĉĉ ĉ ior () Ċĉĉĉĉĉ ĉ dup _ x 2 () Ċĉĉĉĉĉ ĉ pop () Ċĉĉĉĉĉ ĉ iconst _ m 1 () Ċĉĉĉĉĉ ĉ ix or () Ċĉĉĉĉĉ ĉ swap () Ċĉĉĉĉĉ ĉ iconst _ m 1 () Ċĉĉĉĉĉ ĉ ix or () Ċĉĉĉĉĉ ĉ ior () Ċĉĉĉĉĉ ĉ i and () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ }, Ġ{ Ċĉĉĉĉ ĉ // Ġx Ġ^ Ġy Ġ== Ġ( x Ġ| Ġy ) Ġ& Ġ~( x Ġ& Ġy ) Ċĉĉĉĉ ĉ insn Builder Ġ{ Ċĉĉĉĉĉ ĉ dup 2 () Ċĉĉĉĉĉ ĉ ior () Ċĉĉĉĉĉ ĉ dup _ x 2 () Ċĉĉĉĉĉ ĉ pop () Ċĉĉĉĉĉ ĉ i and () Ċĉĉĉĉĉ ĉ iconst _ m 1 () Ċĉĉĉĉĉ ĉ ix or () Ċĉĉĉĉĉ ĉ i and () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ }) Ċĉĉĉ ĉ modifier . replace ( op , Ġsub ) Ċĉĉ ĉ } Ċĉĉ ĉ op . opcode Ġ== ĠI OR Ġ-> Ġ{ Ċĉĉĉ ĉ // Ġx Ġ| Ġy Ġ== Ġ( x Ġ& Ġ~ y ) Ġ+ Ġy Ċĉĉĉ ĉ modifier . replace ( op , Ġinsn Builder Ġ{ Ċĉĉĉĉ ĉ dup _ x 1 () Ċĉĉĉĉ ĉ iconst _ m 1 () Ċĉĉĉĉ ĉ ix or () Ċĉĉĉĉ ĉ i and () Ċĉĉĉĉ ĉ i add () Ċĉĉĉ ĉ }) Ċĉĉ ĉ } Ċĉĉ ĉ op . opcode Ġ== ĠI AND Ġ-> Ġ{ Ċĉĉĉ ĉ // Ġx Ġ& Ġy Ġ== Ġ(~ x Ġ| Ġy ) Ġ- Ġ~ x Ċĉĉĉ ĉ modifier . replace ( op , Ġinsn Builder Ġ{ Ċĉĉĉĉ ĉ swap () Ċĉĉĉĉ ĉ dup _ x 1 () Ċĉĉĉĉ ĉ iconst _ m 1 () Ċĉĉĉĉ ĉ ix or () Ċĉĉĉĉ ĉ ior () Ċĉĉĉĉ ĉ swap () Ċĉĉĉĉ ĉ iconst _ m 1 () Ċĉĉĉĉ ĉ ix or () Ċĉĉĉĉ ĉ is ub () Ċĉĉĉ ĉ }) Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ return Ġskip Ċ ĉ } Ċ } Ċ