package Ġu y . ko hes ive . cu arent ena Ċ Ċ import Ġorg . object web . asm .* Ċ import Ġorg . object web . asm . signature . Signature Reader Ċ import Ġorg . object web . asm . signature . Signature Visitor Ċ import Ġu y . ko hes ive . cu arent ena . policy . Access Types Ċ import Ġu y . ko hes ive . cu arent ena . policy . Policy Allow ance Ċ Ċ object ĠClass Allow ance Detector Ġ{ ĊĊĠĠĠ Ġfun Ġscan Class Byte Code For Desired Allow ances ( class Names With Bytes : ĠList < Named Class Bytes >): ĠScan State Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcollected Ġ= ĠScan State () ĊĠĠĠĠĠĠĠ ĠclassName sWith Bytes . forEach Ġ{ ĠClass Reader ( it . bytes ). accept ( Class Allow ance Scanner ( it . className , Ġcollected ), Ġ 0 ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcollected ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠScan State ( val Ġallow ances : ĠMutable List < Policy Allow ance . Class Level > Ġ= Ġmutable ListOf (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcreates Methods : ĠMutable List < Created Class Method > Ġ= Ġmutable ListOf (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcreates Class : ĠMutable List < Created Class > Ġ= Ġmutable ListOf (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcreates Fields : ĠMutable List < Created Class Field > Ġ= Ġmutable ListOf ()) ĊĊĠĠĠ Ġprivate Ġfun ĠScan State . request Class Ref ( ref Class : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġallow ances . add ( Policy Allow ance . Class Level . Class Access ( ref Class , Ġset Of ( Access Types . ref _ Class ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠScan State . request Class Instance Ref ( ref Class : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġallow ances . add ( Policy Allow ance . Class Level . Class Access ( ref Class , Ġset Of ( Access Types . ref _ Class _ Instance ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠScan State . requests From Desc Sig ( desc : ĠString ?, Ġsignature : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdesc Ġis Ġsig Ġwithout Ġgener ics ĊĠĠĠĠĠĠĠ Ġval Ġsig Ġ= Ġsignature Ġ?: Ġdesc Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Need Ġeither Ġa Ġdescriptor Ġor Ġsignature ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsig Reader Ġ= ĠSignature Reader ( sig ) ĊĠĠĠĠĠĠĠ Ġsig Reader . accept ( Signature Allow ance Scanner ( this )) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun ĠScan State . createClass Method ( access Flags : ĠInt , ĠclassName : ĠString , ĠmethodName : ĠString , Ġdesc : ĠString ?, Ġsignature : ĠString ?, Ġexceptions : ĠList < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġcreates Methods . add ( Created Class Method ( access Flags , ĠclassName , ĠmethodName , Ġdesc , Ġsignature , Ġexceptions )) ĊĠĠĠĠĠĠĠ Ġexceptions . forEach Ġ{ Ġrequest Class Ref ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġrequests From Desc Sig ( desc , Ġsignature ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠScan State . createClass Field ( access Flags : ĠInt , ĠclassName : ĠString , ĠfieldName : ĠString , Ġdesc : ĠString ?, Ġsignature : ĠString ?, Ġvalue : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġcreates Fields . add ( Created Class Field ( access Flags , ĠclassName , ĠfieldName , Ġdesc , Ġsignature , Ġvalue )) ĊĠĠĠĠĠĠĠ Ġrequests From Desc Sig ( desc , Ġsignature ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun ĠScan State . createClass ( access Flags : ĠInt , ĠclassName : ĠString , Ġsignature : ĠString ?, Ġsuper Name : ĠString ?, Ġinterfaces : ĠList < String > Ġ= Ġempty List ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġcreates Class . add ( Created Class ( access Flags , ĠclassName , Ġsignature , Ġsuper Name , Ġinterfaces )) ĊĠĠĠĠĠĠĠ Ġsuper Name ?. let Ġ{ Ġrequest Class Instance Ref ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġinterfaces . forEach Ġ{ Ġrequest Class Ref ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġsignature ?. let Ġ{ Ġrequests From Desc Sig ( null , Ġit ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠCreated Class Method ( val Ġaccess Flags : ĠInt , Ġval ĠclassName : ĠString , Ġval ĠmethodName : ĠString , Ġval Ġdesc : ĠString ?, Ġval Ġsignature : ĠString ?, Ġval Ġexceptions : ĠList < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis Static : ĠBoolean Ġ= Ġaccess Flags . and ( Op codes . ACC _ STATIC ) Ġ!= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠCreated Class ( val Ġaccess Flags : ĠInt , Ġval ĠclassName : ĠString , Ġval Ġsignature : ĠString ?, Ġval Ġsuper Name : ĠString ?, Ġval Ġinterfaces : ĠList < String > Ġ= Ġempty List ()) Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠCreated Class Field ( val Ġaccess Flags : ĠInt , Ġval ĠclassName : ĠString , Ġval ĠfieldName : ĠString , Ġval Ġdesc : ĠString ?, Ġval Ġsignature : ĠString ?, Ġval Ġvalue : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis Static : ĠBoolean Ġ= Ġaccess Flags . and ( Op codes . ACC _ STATIC ) Ġ!= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠClass Allow ance Scanner ( val Ġmy ClassName : ĠString , Ġval Ġcollect : ĠScan State ) Ġ: ĠClass Visitor ( Op codes . ASM 5 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ( version : ĠInt , Ġaccess : ĠInt , Ġname : ĠString , Ġsignature : ĠString ?, Ġsuper Name : ĠString ?, Ġinterfaces : ĠArray < String > ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollect . createClass ( access , Ġname , Ġsignature , Ġsuper Name , Ġinterfaces ?. toList () Ġ?: Ġempty List ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Method ( access : ĠInt , Ġname : ĠString , Ġdesc : ĠString ?, Ġsignature : ĠString ?, Ġexceptions : ĠArray < out ĠString >? ): ĠMethod Visitor ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollect . createClass Method ( access , Ġmy ClassName , Ġname , Ġdesc , Ġsignature , Ġexceptions ?. toList () Ġ?: Ġempty List ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMethod Allow ance Scanner ( my ClassName , Ġname , Ġcollect ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Inner Class ( name : ĠString , Ġouter Name : ĠString ?, Ġinner Name : ĠString ?, Ġaccess : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġthis Ġlikely Ġisn 't Ġimportant , Ġwe Ġcatch Ġinner Ġclasses Ġon Ġ" create Ġclass ", Ġdo Ġwe Ġneed Ġa Ġreference Ġas Ġwell ? ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit OuterClass ( owner : ĠString , Ġname : ĠString ?, Ġdesc : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġ Ġthis Ġmight Ġnot Ġbe Ġimportant Ġif Ġnot Ġreferenced Ġor Ġdon 't Ġneed Ġto Ġserialize Ġit Ġwith Ġthe Ġlambda ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Field ( access : ĠInt , Ġname : ĠString , Ġdesc : ĠString ?, Ġsignature : ĠString ?, Ġvalue : ĠAny ?): ĠField Visitor ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollect . createClass Field ( access , Ġmy ClassName , Ġname , Ġdesc , Ġsignature , Ġvalue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠField Visitor ( Op codes . ASM 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Annotation ( desc : ĠString ?, Ġvisible : ĠBoolean ): ĠAnnotation Visitor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollect . requests From Desc Sig ( desc , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAnnotation Allow ance Scanner ( collect ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Type Annotation ( type Ref : ĠInt , Ġtype Path : ĠType Path ?, Ġdesc : ĠString ?, Ġvisible : ĠBoolean ): ĠAnnotation Visitor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollect . requests From Desc Sig ( desc , Ġtype Path ?. toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAnnotation Allow ance Scanner ( collect ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Annotation ( desc : ĠString ?, Ġvisible : ĠBoolean ): ĠAnnotation Visitor ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollect . requests From Desc Sig ( desc , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAnnotation Allow ance Scanner ( collect ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Type Annotation ( type Ref : ĠInt , Ġtype Path : ĠType Path ?, Ġdesc : ĠString ?, Ġvisible : ĠBoolean ): ĠAnnotation Visitor ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollect . requests From Desc Sig ( desc , Ġtype Path ?. toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAnnotation Allow ance Scanner ( collect ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠMethod Allow ance Scanner ( val Ġmy ClassName : ĠString , Ġval ĠmethodName : ĠString , Ġval Ġcollect : ĠScan State ) Ġ: ĠMethod Visitor ( Op codes . ASM 5 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Multi AN ew Array Insn ( desc : ĠString ?, Ġdims : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollect . requests From Desc Sig ( desc , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Frame ( type : ĠInt , Ġn Local : ĠInt , Ġlocal : ĠArray < out ĠAny > ?, Ġn Stack : ĠInt , Ġstack : ĠArray < out ĠAny > ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġshould Ġwe Ġscan Ġthe Ġframe Ġfor Ġextra Ġsafety ? ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Type Insn ( opcode : ĠInt , Ġtype : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( opcode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . NEW Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollect . allow ances . add ( Policy Allow ance . Class Level . Class Access ( type , Ġset Of ( Access Types . ref _ Class _ Instance ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . ANE WAR R AY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollect . allow ances . add ( Policy Allow ance . Class Level . Class Access ( type , Ġset Of ( Access Types . ref _ Class _ Instance ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . CHECK CAST , ĠOp codes . INSTANCE OF Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollect . allow ances . add ( Policy Allow ance . Class Level . Class Access ( type , Ġset Of ( Access Types . ref _ Class _ Instance ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" Unknown Ġopcode Ġfor Ġmethod . visit Type Insn : Ġ$ opcode ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Annotation Default (): ĠAnnotation Visitor ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAnnotation Allow ance Scanner ( collect ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Annotation ( desc : ĠString ?, Ġvisible : ĠBoolean ): ĠAnnotation Visitor ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollect . requests From Desc Sig ( desc , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAnnotation Allow ance Scanner ( collect ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Type Annotation ( type Ref : ĠInt , Ġtype Path : ĠType Path ?, Ġdesc : ĠString ?, Ġvisible : ĠBoolean ): ĠAnnotation Visitor ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollect . requests From Desc Sig ( desc , Ġtype Path ?. toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAnnotation Allow ance Scanner ( collect ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Try Catch Annotation ( type Ref : ĠInt , Ġtype Path : ĠType Path ?, Ġdesc : ĠString ?, Ġvisible : ĠBoolean ): ĠAnnotation Visitor ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġcheck Ġtype Ref Ġtypes Ġif Ġwe Ġwant Ġto Ġdo Ġanything Ġspecial ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollect . requests From Desc Sig ( desc , Ġtype Path ?. toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAnnotation Allow ance Scanner ( collect ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Insn Annotation ( type Ref : ĠInt , Ġtype Path : ĠType Path ?, Ġdesc : ĠString ?, Ġvisible : ĠBoolean ): ĠAnnotation Visitor ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġcheck Ġtype Ref Ġtypes Ġif Ġwe Ġwant Ġto Ġdo Ġanything Ġspecial ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollect . requests From Desc Sig ( desc , Ġtype Path ?. toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAnnotation Allow ance Scanner ( collect ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Parameter Annotation ( parameter : ĠInt , Ġdesc : ĠString ?, Ġvisible : ĠBoolean ): ĠAnnotation Visitor ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollect . requests From Desc Sig ( desc , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAnnotation Allow ance Scanner ( collect ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Invoke Dynamic Insn ( name : ĠString ?, Ġdesc : ĠString ?, Ġb sm : ĠHandle ?, Ġvar arg Ġb sm Args : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTODO (" for Ġwhat Ġclass Ġis Ġit Ġinvoking Ġdynamic ?") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Local Variable Annotation ( type Ref : ĠInt , Ġtype Path : ĠType Path ?, Ġstart : ĠArray < out ĠLabel > ?, Ġend : ĠArray < out ĠLabel > ?, Ġindex : ĠInt Array ?, Ġdesc : ĠString ?, Ġvisible : ĠBoolean ): ĠAnnotation Visitor ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollect . requests From Desc Sig ( desc , Ġtype Path ?. toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAnnotation Allow ance Scanner ( collect ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Local Variable ( name : ĠString ?, Ġdesc : ĠString ?, Ġsignature : ĠString ?, Ġstart : ĠLabel ?, Ġend : ĠLabel ?, Ġindex : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollect . requests From Desc Sig ( desc , Ġsignature ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Parameter ( name : ĠString ?, Ġaccess : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnoop ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Method Insn ( opcode : ĠInt , Ġowner : ĠString , Ġname : ĠString , Ġdesc : ĠString , Ġit f : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġopcode Ġis Ġeither ĠIN VOKE VIRTUAL , ĠIN V OK ES PE CIAL , ĠIN VOKE STATIC Ġor ĠIN VOKE INTERFACE ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name Ġ== Ġ"< init >") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( opcode Ġ== ĠOp codes . INV OK ES PE CIAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollect . allow ances . add ( Policy Allow ance . Class Level . Class Constructor Access ( owner , Ġdesc , Ġset Of ( Access Types . call _ Class _ Constructor ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Invalid Ġop Ġcode Ġfor Ġvisit Method Insn Ġ< init >: Ġ$ opcode ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccess Ġ= Ġwhen Ġ( opcode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . INV OK ES PE CIAL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . IN VOKE VIRTUAL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . IN VOKE INTERFACE Ġ-> ĠAccess Types . call _ Class _ Instance _ Method ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . IN VOKE STATIC Ġ-> ĠAccess Types . call _ Class _ Static _ Method ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġop Ġcode Ġfor Ġvisit Method Insn : Ġ$ opcode , Ġname =$ name ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollect . allow ances . add ( Policy Allow ance . Class Level . Class Method Access ( owner , Ġname , Ġdesc , Ġset Of ( access ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollect . requests From Desc Sig ( desc , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Field Insn ( opcode : ĠInt , Ġowner : ĠString , Ġname : ĠString , Ġdesc : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġopcode Ġis Ġeither ĠGET STATIC , ĠPUT STATIC , ĠGET FIELD Ġor ĠPUT FIELD ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccess Ġ= Ġwhen Ġ( opcode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . GET FIELD Ġ-> ĠAccess Types . read _ Class _ Instance _ Field ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . PUT FIELD Ġ-> ĠAccess Types . write _ Class _ Instance _ Field ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . GET STATIC Ġ-> ĠAccess Types . read _ Class _ Static _ Field ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . PUT STATIC Ġ-> ĠAccess Types . write _ Class _ Static _ Field ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġop Ġcode Ġfor Ġvisit Field Insn : Ġ$ opcode ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollect . allow ances . add ( Policy Allow ance . Class Level . Class Field Access ( owner , Ġname , Ġdesc , Ġset Of ( access ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollect . requests From Desc Sig ( desc , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠAnnotation Allow ance Scanner ( val Ġcollect : ĠScan State ) Ġ: ĠAnnotation Visitor ( Op codes . ASM 5 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Annotation ( name : ĠString ?, Ġdesc : ĠString ?): ĠAnnotation Visitor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollect . requests From Desc Sig ( desc , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAnnotation Allow ance Scanner ( collect ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Enum ( name : ĠString ?, Ġdesc : ĠString ?, Ġvalue : ĠString ?) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠTODO (" what Ġabout Ġenum ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ( name : ĠString ?, Ġvalue : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġprimitive Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Array ( name : ĠString ?): ĠAnnotation Visitor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAnnotation Allow ance Scanner ( collect ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġclass ĠSignature Allow ance Scanner ( val Ġcollect : ĠScan State ) Ġ: ĠSignature Visitor ( Op codes . ASM 5 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ParameterType (): ĠSignature Visitor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Formal Type Parameter ( name : ĠString ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġcollect . allow ances . add ( Policy Allow ance . Class Level . Class Access ( name . replace ('/', Ġ'. '), Ġset Of ( Access Types . ref _ Class ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Type Variable ( name : ĠString ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġcollect . allow ances . add ( Policy Allow ance . Class Level . Class Access ( name . replace ('/', Ġ'. '), Ġset Of ( Access Types . ref _ Class ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Inner ClassType ( name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollect . allow ances . add ( Policy Allow ance . Class Level . Class Access ( name . replace ('/', Ġ'. '), Ġset Of ( Access Types . ref _ Class ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ClassType ( name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollect . allow ances . add ( Policy Allow ance . Class Level . Class Access ( name . replace ('/', Ġ'. '), Ġset Of ( Access Types . ref _ Class ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Class Bound (): ĠSignature Visitor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Interface (): ĠSignature Visitor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Exception Type (): ĠSignature Visitor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Interface Bound (): ĠSignature Visitor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ArrayType (): ĠSignature Visitor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Super class (): ĠSignature Visitor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ReturnType (): ĠSignature Visitor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } ĊĊ