blob: d668059cb73c18af364459d958e3b2613889deba (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
import scala.tools.partest.BytecodeTest
import scala.tools.nsc.util.JavaClassPath
import java.io.InputStream
import scala.tools.asm
import asm.ClassReader
import asm.tree.{ClassNode, InsnList}
import scala.collection.JavaConverters._
object Test extends BytecodeTest {
def show: Unit = {
val classNode = loadClassNode("Foo_1")
val methodNode = getMethod(classNode, "foo")
println(countNullChecks(methodNode.instructions))
}
def countNullChecks(insnList: InsnList): Int = {
/** Is given instruction a null check?
* NOTE
* This will detect direct null compparsion as in
* if (x == null) ...
* and not indirect as in
* val foo = null
* if (x == foo) ...
*/
def isNullCheck(node: asm.tree.AbstractInsnNode): Boolean = {
val opcode = node.getOpcode
(opcode == asm.Opcodes.IFNULL) || (opcode == asm.Opcodes.IFNONNULL)
}
insnList.iterator.asScala.count(isNullCheck)
}
}
|