in chill-scala/src/main/scala/com/twitter/chill/ClosureCleaner.scala [245:296]
override def visitMethod(
access: Int,
name: String,
desc: String,
sig: String,
exceptions: Array[String]
): MethodVisitor =
if (
specificMethod.isDefined &&
(specificMethod.get.name != name || specificMethod.get.desc != desc)
) {
null
} else {
new MethodVisitor(ASM7) {
override def visitFieldInsn(op: Int, owner: String, name: String, desc: String): Unit =
if (op == GETFIELD) {
val ownerName = owner.replace('/', '.')
output.keys.iterator
.filter(_.getName == ownerName)
.foreach(cl => output(cl) += name)
}
override def visitMethodInsn(
op: Int,
owner: String,
name: String,
desc: String,
itf: Boolean
): Unit = {
val ownerName = owner.replace('/', '.')
output.keys.iterator.filter(_.getName == ownerName).foreach { cl =>
// Check for calls a getter method for a variable in an interpreter wrapper object.
// This means that the corresponding field will be accessed, so we should save it.
if (
op == INVOKEVIRTUAL && owner.endsWith("$iwC") && !name.endsWith(
"$outer"
)
) {
output(cl) += name
}
val m = MethodIdentifier(cl, name, desc)
if (!visitedMethods.contains(m)) {
// Keep track of visited methods to avoid potential infinite cycles
visitedMethods += m
AsmUtil.classReader(cl).foreach { cr =>
cr.accept(new FieldAccessFinder(output, Some(m), visitedMethods), 0)
}
}
}
}
}
}