/* Ċ Ġ* ĠĠĠĠĠ ĠK ores - Byte code Writer Ġ- ĠTrans lates ĠK ores ĠStructure Ġto ĠJVM ĠByte code Ġ< https :// github . com / Jon athan xD / Code API - Byte code Writer > Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠ ĠThe ĠMIT ĠLicense Ġ( MIT ) Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠThe Real Bug gy / Jon athan xD Ġ( https :// github . com / Jon athan xD /) Ġ< jon athan . script er @ program mer . net > Ċ Ġ* ĠĠĠĠĠ ĠCopyright Ġ( c ) Ġcontributors Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* ĠĠĠĠĠ Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* ĠĠĠĠĠ Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* ĠĠĠĠĠ Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* ĠĠĠĠĠ Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* ĠĠĠĠĠ Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ċ Ġ* ĠĠĠĠĠ Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠĠĠĠĠ ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠĠĠĠĠ ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠĠĠĠĠ ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠĠĠĠĠ ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠĠĠĠĠ ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN Ċ Ġ* ĠĠĠĠĠ ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ package Ġcom . k ores framework . k ores . byte code . util Ċ Ċ import Ġcom . k ores framework . k ores . Instruction Ċ import Ġcom . k ores framework . k ores . Instructions Ċ import Ġcom . k ores framework . k ores . Mutable Instructions Ċ import Ġcom . k ores framework . k ores . base .* Ċ import Ġcom . k ores framework . k ores . byte code . common . Method Visitor Helper Ċ import Ġcom . k ores framework . k ores . byte code . processor . IN _ EXPRESSION Ċ import Ġcom . k ores framework . k ores . byte code . processor . increment In Context Ċ import Ġcom . k ores framework . k ores . common . K ores Nothing Ċ import Ġcom . k ores framework . k ores . factory . set FieldValue Ċ import Ġcom . k ores framework . k ores . processor . Processor Manager Ċ import Ġcom . k ores framework . k ores . safe For Comparison Ċ import Ġcom . k ores framework . k ores . type . internal Name Ċ import Ġcom . k ores framework . k ores . util . type Desc Ċ import Ġcom . github . jon athan xd . i utils . data . Typed Data Ċ import Ġorg . object web . asm . Label Ċ import Ġorg . object web . asm . Method Visitor Ċ import Ġorg . object web . asm . Op codes Ċ Ċ // ĠSome Ġoperations Ġcalls Ġdirectly Ġasm ĠMethod Visitor Ġto Ġavoid Ġprocessor Ġoverhead , Ġthis Ġdoes Ġnot Ċ // Ġmeans Ġthat Ġoperation Ġis Ġfaster Ġor Ġthat Ġprocessors Ġwill Ġslow Ġdown Ġthe Ġprocess Ġ( at Ġthis Ġpoint Ċ // Ġprobably ĠJVM Ġalready Ġmade Ġa Ġlot Ġof Ġoptimizations Ġwhich Ġmakes Ġthe Ġcode Ġruns Ġfaster Ġeven Ċ // Ġcalling Ġprocessors . ĠBut Ġprocessors Ġare Ġdesigned Ġto Ġprocess Ġvalues Ġin Ġan Ġenvironment Ġwhich Ċ // Ġstates Ġcan Ġchange Ġthe Ġbehavior Ġand Ġprocessors Ġare Ġdesigned Ġto Ġavoid Ġcode Ġduplication , Ġbut Ġfor Ġthis Ċ // Ġutility Ġclass , Ġthere Ġis Ġno Ġreason Ġto Ġuse Ġprocessors , Ġnot Ġonly Ġbecause Ġof Ġthe Ġoverhead Ċ // Ġbut Ġbecause Ġsome Ġoperations Ġare Ġconstants Ġ( never Ġchange ). ĠIn Ġfuture Ġwe Ġcan Ġchange Ġto Ċ // Ġprocessor Ġif Ġneeded , Ġbut Ġat Ġthe Ġmoment , Ġthis Ġis Ġnot Ġrequired . Ċ Ċ /** Ċ Ġ* ĠUtilities Ġmethod Ġto Ġfind Ġ` super ` Ġand Ġ` this ` Ġcall Ġand Ġfield Ġdefault Ġvalues Ġdeclaration . Ċ Ġ*/ Ċ object ĠConstructor Util Ġ{ ĊĊĠĠĠ Ġfun Ġis Init For That ( method Invocation : ĠMethod Invocation ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠConstructors Ġrequires Ġa Ġ[ New ] Ġtarget , Ġsuper Ġinv ocations Ġdoes Ġnot Ġhave Ġthis Ġtarget ĊĠĠĠĠĠĠĠ Ġval Ġsafe Target Ġ= Ġmethod Invocation . target . safe For Comparison ĊĠĠĠĠĠĠĠ Ġval Ġsuper Invocation Ġ= Ġsafe Target Ġ! is ĠNew ĊĊĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġsafe Target ĊĊĠĠĠĠĠĠĠ Ġval Ġaccept Ġ= Ġ( target Ġis ĠAccess ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( target Ġ== ĠAccess . THIS Ġ|| Ġtarget Ġ== ĠAccess . SUPER )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġ( target Ġ=== ĠAlias . SUPER Ġ|| Ġtarget Ġ=== ĠAlias . THIS ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsuper Invocation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġaccept ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġmethod Invocation . invoke Type Ġ== ĠInvoke Type . IN VOKE _ SPECIAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġmethod Invocation . spec . methodName Ġ== Ġ"< init >" ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsearch For Init To ( ĊĠĠĠĠĠĠĠ Ġtype Declaration : ĠType Declaration , ĊĠĠĠĠĠĠĠ Ġsource : ĠInstructions , ĊĠĠĠĠĠĠĠ Ġtarget Access Predicate : Ġ( Instruction ) Ġ-> ĠBoolean ĊĠĠĠ Ġ): ĠSearch Result Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠConstructor Util . search For Init To ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Declaration , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Access Predicate , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsearch For Init To ( ĊĠĠĠĠĠĠĠ Ġtype Declaration : ĠType Declaration , ĊĠĠĠĠĠĠĠ Ġcode Parts : ĠInstructions ?, ĊĠĠĠĠĠĠĠ Ġinclude Child : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġtarget Access Predicate : Ġ( Instruction ) Ġ-> ĠBoolean , Ġis Sub : ĠBoolean ĊĠĠĠ Ġ): ĠSearch Result Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( code Parts Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSearch Result . FALSE ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( code Part Ġin Ġcode Parts ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsafe Ġ= Ġcode Part . safe For Comparison ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( safe Ġis ĠBody Holder Ġ&& Ġinclude Child ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsearch Result Ġ= ĠConstructor Util . search For Init To ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Declaration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsafe . body , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinclude Child , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Access Predicate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( search Result . found ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsearch Result ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( safe Ġis ĠMethod Invocation ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠConstructors Ġrequires Ġa Ġ[ New ] Ġtarget , Ġsuper Ġinv ocations Ġdoes Ġnot Ġhave Ġthis Ġtarget ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( safe . target . safe For Comparison Ġ! is ĠNew ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġtarget Access Predicate ( safe . target . safe For Comparison ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġsafe . invoke Type Ġ== ĠInvoke Type . IN VOKE _ SPECIAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġsafe . spec . methodName Ġ== Ġ"< init >" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSearch Result ( true , Ġis Sub ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSearch Result . FALSE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsearch Init This ( ĊĠĠĠĠĠĠĠ Ġtype Declaration : ĠType Declaration , ĊĠĠĠĠĠĠĠ Ġcode Parts : ĠInstructions , ĊĠĠĠĠĠĠĠ Ġvalidate : ĠBoolean ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsearch Result Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConstructor Util . search For Init To ( type Declaration , Ġcode Parts , Ġ! validate , Ġ{ Ġinstruction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstruction Ġ== ĠAccess . THIS Ġ|| Ġinstruction Ġ== ĠAlias . THIS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( validate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Result Ġ= ĠConstructor Util . validate Constructor ( search Result ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsearch Result . found ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsearch For Super ( ĊĠĠĠĠĠĠĠ Ġtype Declaration : ĠType Declaration , ĊĠĠĠĠĠĠĠ Ġcode Parts : ĠInstructions ?, ĊĠĠĠĠĠĠĠ Ġvalidate : ĠBoolean ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsearch Result Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConstructor Util . search For Init To ( type Declaration , Ġcode Parts , Ġ! validate , Ġ{ Ġinstruction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstruction Ġ== ĠAccess . SUPER Ġ|| Ġinstruction Ġ== ĠAlias . SUPER ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( validate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Result Ġ= ĠConstructor Util . validate Constructor ( search Result ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsearch Result . found ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvalidate Constructor ( search Result : ĠSearch Result ): ĠSearch Result Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( search Result . found On Sub ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Don 't Ġinvoke Ġsuper () Ġor Ġthis () Ġinside Ġa ĠB od ied ĠElement .") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsearch Result ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdeclare Final Fields ( ĊĠĠĠĠĠĠĠ Ġprocessor Manager : ĠProcessor Manager <* >, ĊĠĠĠĠĠĠĠ Ġmethod Body : ĠInstructions , ĊĠĠĠĠĠĠĠ Ġtype Declaration : ĠType Declaration , ĊĠĠĠĠĠĠĠ Ġmv : ĠMethod Visitor Helper , ĊĠĠĠĠĠĠĠ Ġdata : ĠTyped Data , ĊĠĠĠĠĠĠĠ Ġvalidate : ĠBoolean ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Constructor Util . search Init This ( type Declaration , Ġmethod Body , Ġvalidate )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠDeclare Ġvariables ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġall Ġ= Ġtype Declaration . fields . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! it . modifiers . contains ( K ores Modifier . STATIC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġit . value Ġ!= ĠK ores Nothing ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġval Ġlabel Ġ= ĠLabel () ĊĠĠĠĠĠĠĠ Ġmv . method Visitor . visit Label ( label ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( field Declaration Ġin Ġall ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġfield Declaration . value ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value . safe For Comparison Ġ!= ĠK ores Nothing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġprocessor Ġoverhead . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmv . method Visitor . visit Var Insn ( Op codes . AL O AD , Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIN _ EXPRESSION . increment In Context ( data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor Manager . process ( value :: class . java , Ġvalue , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġprocessor Ġoverhead . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmv . method Visitor . visit Field Insn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . PUT FIELD , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Declaration . internal Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Declaration . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Declaration . type . type Desc ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate Super Invoke ( type Declaration : ĠType Declaration , Ġmv : ĠMethod Visitor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmv . visit Var Insn ( Op codes . AL O AD , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsuper Type Ġ= Ġ( type Declaration Ġas ĠSuper Class Holder ). super Class ĊĊĠĠĠĠĠĠĠ Ġ// ĠNo Ġprocessor Ġoverhead . ĊĠĠĠĠĠĠĠ Ġmv . visit Method Insn ( Op codes . INV OK ES PE CIAL , Ġsuper Type . internal Name , Ġ"< init >", Ġ" () V ", Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate Final Fields ( elements Holder : ĠElements Holder ): ĠInstructions Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinstructions Ġ= ĠMutable Instructions . create () ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠDeclare Ġvariables ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġall Ġ= Ġelements Holder . fields . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! it . modifiers . contains ( K ores Modifier . STATIC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġit . value Ġ!= ĠK ores Nothing ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġfor Ġ( field Declaration Ġin Ġall ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġfield Declaration . type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġfield Declaration . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġfield Declaration . value ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value . safe For Comparison Ġ!= ĠK ores Nothing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstructions . add ( set FieldValue ( Alias . THIS , ĠAccess . THIS , Ġtype , Ġname , Ġvalue )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġinstructions ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠSearch Result Ġconstructor ( val Ġfound : ĠBoolean , Ġval Ġfound On Sub : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠFALSE Ġ= ĠSearch Result ( false , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }