AM
Size: a a a
AM
QH
AM
DP
DP
(
(
(
AN
(
DP
AN
D
AN
D
I
when {
value is PossibleSpilledValue -> {
when (insn.opcode) {
Opcodes.ALOAD -> value.also { it.usages += insn }
Opcodes.ASTORE -> {
// HACK around mergeFrame, which does not process stack properly, see testCallSuspend
val step: (AbstractInsnNode) -> AbstractInsnNode =
if (methodNode.instructions.indexOf(value.source) < methodNode.instructions.indexOf(insn)) {{ it.previous }}
else {{ it.next }}
var current = insn
while (current != value.source) {
if (current is LabelNode) break
current = step(current)
}
if (current == value.source) value.also { it.usages += insn }
else super.newValue(value.type)
}
else -> super.newValue(value.type)
}
}
insn.opcode == Opcodes.ALOAD ->
if (insn.next.isCheckcastContinuation()) super.newValue(insn, value)
else PossibleSpilledValue(insn, AsmTypes.OBJECT_TYPE)
else ->
super.newValue(value?.type)
}
QH
when {
value is PossibleSpilledValue -> {
when (insn.opcode) {
Opcodes.ALOAD -> value.also { it.usages += insn }
Opcodes.ASTORE -> {
// HACK around mergeFrame, which does not process stack properly, see testCallSuspend
val step: (AbstractInsnNode) -> AbstractInsnNode =
if (methodNode.instructions.indexOf(value.source) < methodNode.instructions.indexOf(insn)) {{ it.previous }}
else {{ it.next }}
var current = insn
while (current != value.source) {
if (current is LabelNode) break
current = step(current)
}
if (current == value.source) value.also { it.usages += insn }
else super.newValue(value.type)
}
else -> super.newValue(value.type)
}
}
insn.opcode == Opcodes.ALOAD ->
if (insn.next.isCheckcastContinuation()) super.newValue(insn, value)
else PossibleSpilledValue(insn, AsmTypes.OBJECT_TYPE)
else ->
super.newValue(value?.type)
}
AE
AN