Snippets

Michael Eichberg [OPAL - 0.8.10 - not 0.8.15] Demonstrates how to query call targets of methods (Basis for the CHA Call Graph Algorithm)

Created by Michael Eichberg last modified
// This code snippet demonstrates how to resolve method call targets based on the available type information only.
// This is the basis/the first part of the CHA call graph algorithms.

import org.opalj.collection.immutable._; import org.opalj.br._ ; import org.opalj.br.analyses._; import org.opalj.br.instructions._; import org.opalj.collection.immutable.ConstArray.find; import org.opalj.util.PerformanceEvaluation.time

// 1. Create a project which also includes the RT.jar as a library.
implicit val p = Project(new java.io.File("OPAL/bi/target/scala-2.11/resource_managed/test/cg.jar"),org.opalj.bytecode.RTJar)

// 1.1. Check that the project setup is as expected; depending on the configuration the number of call targets
//		may change. 
TypeExtensibilityKey.AllClosed = true // <= "HACK" only necessary as long as we don't have a decent "isExtensiblity" analysis
val typeExtensibility = p.get(TypeExtensibilityKey)
assert(typeExtensibility(ObjectType("cg/default_methods/ISuper")).isNo /* EXPECTED: org.opalj.Answer = No */ )

val typeBasedCallTargets = p.get(TypeBasedCallTargetsKey)
typeBasedCallTargets.specialCall(ObjectType("cg/default_methods/Super"),"<init>",MethodDescriptor("()V")).map(m => m.toJava(p.classFile(m))) // EXPECTED: Set(java8methodresolution.Super{ public void <init>() })

// ALWAYS OVERRIDDEN ABSTRACT METHOD
val candidates = p.virtualCall("foo",ObjectType("cg/always_overridden/Super"),"doIt",MethodDescriptor("()V"))
typeBasedCallTargets.filterAlwaysOverriddenMethods(candidates)

// GET CALL TARGETS OF INTERFACE METHOD INVOKES (INVOKEINTERFACE)
typeBasedCallTargets.interfaceCall(ObjectType("cg/default_methods/ISuperAlt"),"compute",MethodDescriptor("(II)I"))

p.interfaceCall(ObjectType("cg/default_methods/ISuper"),"compute",MethodDescriptor("(II)I")).map(m => m.toJava(p.classFile(m))).mkString("Targets:\n\t","\n\t","\n") 
// compared to the using the project, typeBasedCallTargets does caching and performs some additional steps to further reduce the number of call targets
typeBasedCallTargets.interfaceCall(ObjectType("cg/default_methods/ISuper"),"compute",MethodDescriptor("(II)I")).map(m => m.toJava(p.classFile(m))).mkString("Targets:\n\t","\n\t","\n") 

// GET CALL TARGETS OF VIRTUAL METHOD INVOKES (INVOKEVIRTUAL)
val aDemoMain = p.classFile(ObjectType("cg/visibility/a/Demo")).get.findMethod("main").head
val invokeVirtuals = aDemoMain.body.get.collect{case i:INVOKEVIRTUAL if i.name == "printIt" => i} 
/*
invokeVirtuals.mkString("\n") ... =>
(21,INVOKEVIRTUAL(cg.visibility.a.A{ void printIt() }))
(45,INVOKEVIRTUAL(cg.visibility.a.A{ void printIt() }))
(69,INVOKEVIRTUAL(cg.visibility.a.A{ void printIt() }))
(96,INVOKEVIRTUAL(cg.visibility.a.C{ void printIt() }))
*/

val pts = p.virtualCall("cg/visibility/a",invokeVirtuals(0)._2).map(m => m.toJava(p.classFile(m)))
val tts = typeBasedCallTargets.virtualCall("cg/visibility/a",invokeVirtuals(0)._2)
pts eq tts // => false
tts eq typeBasedCallTargets.virtualCall("cg/visibility/a",invokeVirtuals(0)._2)// => true (results are cached)

p.virtualCall("cg/visibility/a",invokeVirtuals(0)._2).map(m => m.toJava(p.classFile(m)))
//res: scala.collection.immutable.Set[String] = Set(cg.visibility.a.C{ protected void printIt() }, cg.visibility.a.A{ void printIt() })

p.virtualCall("cg/visibility/a",invokeVirtuals(3)._2).map(m => m.toJava(p.classFile(m)))
//res: scala.collection.immutable.Set[String] = Set(cg.visibility.a.C{ protected void printIt() })

p.virtualCall("cg/visibility/b",invokeVirtuals(3)._2).map(m => m.toJava(p.classFile(m)))
//res: scala.collection.immutable.Set[String] = Set(cg.visibility.a.C{ protected void printIt() })

p.virtualCall("cg/visibility/b",invokeVirtuals(0)._2).map(m => m.toJava(p.classFile(m)))
//res: scala.collection.immutable.Set[String] = Set(cg.visibility.b.B{ protected void printIt() }, cg.visibility.a.C{ protected void printIt() })

// LOOKUP OF ARRAY BASED METHOD CALLS
typeBasedCallTargets.virtualCall("N/A",ArrayType(ObjectType("java/lang/Object")),"hashCode",MethodDescriptor("()I"))

typeBasedCallTargets.virtualCall("foo",ObjectType("cg/always_overridden/Super"),"doIt",MethodDescriptor("()V"))

Comments (1)

  1. okeyoyna

    mt2 wslikserverler www.zafer2.com editsizserverler emekserverler.net emekserverler.com onlineokeyoynaa.com canliokeyoynaa.com duzokeyoynaa.com okey-net.com bursaokey.com izmirokey.com ankaraokey.org istanbulokey.net agarprivateserver agario agario agario OKEY izmirokey bursaokey okey-net ankaraokey istanbulokey onlineokeyoynaa duzokeyoynaa canliokeyoynaa mt2 emekserverler emekserverler www.zafer2.com agario.zafer2.com editsizserverler wslikserverler altyazilifilm agarprivateserver agario agario okey oyna okey oyna metin2 pvp serverler okey okey okey okey okey OKEY OKEY OKEY OKEY OKEY realokey realokey realokey realokey realokey realokey realokey realokey realokey.com realokey.com realokey.com realokey.com realokey.com realokey.com realokey.com realokey.com realokey.com realokey.com realokey.com OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY OKEY

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.