@@ -94,9 +94,9 @@ trait ProdConsAnalyzerImpl {
94
94
}
95
95
96
96
def consumersOfOutputsFrom (insn : AbstractInsnNode ): Set [AbstractInsnNode ] = insn match {
97
- case _ : UninitializedLocalProducer => Set .empty
98
- case ParameterProducer (local) => consumersOfValueAt(methodNode.instructions.getFirst, local)
99
- case ExceptionProducer (handlerLabel, handlerFrame) => consumersOfValueAt(handlerLabel, handlerFrame.stackTop )
97
+ case _ : UninitializedLocalProducer => Set .empty
98
+ case ParameterProducer (local) => consumersOfValueAt(methodNode.instructions.getFirst, local)
99
+ case ExceptionProducer (handlerLabel, handlerStackTop) => consumersOfValueAt(handlerLabel, handlerStackTop )
100
100
case _ =>
101
101
_consumersOfOutputsFrom.get(insn).map(v => Set .from[AbstractInsnNode ](v.indices.iterator.flatMap(v.apply))).getOrElse(Set .empty)
102
102
}
@@ -388,7 +388,7 @@ trait ProdConsAnalyzerImpl {
388
388
private def outputValueSlots (insn : AbstractInsnNode ): Seq [Int ] = insn match {
389
389
case ParameterProducer (local) => Seq (local)
390
390
case UninitializedLocalProducer (local) => Seq (local)
391
- case ExceptionProducer (_, frame ) => Seq (frame. stackTop)
391
+ case ExceptionProducer (_, stackTop ) => Seq (stackTop)
392
392
case _ =>
393
393
if (insn.getOpcode == - 1 ) return Seq .empty
394
394
if (isStore(insn)) {
@@ -453,9 +453,9 @@ abstract class InitialProducer extends AbstractInsnNode(-1) {
453
453
override def accept (cv : MethodVisitor ): Unit = throw new UnsupportedOperationException
454
454
}
455
455
456
- case class ParameterProducer (local : Int ) extends InitialProducer
457
- case class UninitializedLocalProducer (local : Int ) extends InitialProducer
458
- case class ExceptionProducer [V <: Value ](handlerLabel : LabelNode , handlerFrame : Frame [ V ] ) extends InitialProducer
456
+ case class ParameterProducer (local : Int ) extends InitialProducer
457
+ case class UninitializedLocalProducer (local : Int ) extends InitialProducer
458
+ case class ExceptionProducer [V <: Value ](handlerLabel : LabelNode , handlerStackTop : Int ) extends InitialProducer
459
459
460
460
class InitialProducerSourceInterpreter extends SourceInterpreter {
461
461
override def newParameterValue (isInstanceMethod : Boolean , local : Int , tp : Type ): SourceValue = {
@@ -467,6 +467,7 @@ class InitialProducerSourceInterpreter extends SourceInterpreter {
467
467
}
468
468
469
469
override def newExceptionValue (tryCatchBlockNode : TryCatchBlockNode , handlerFrame : Frame [_ <: Value ], exceptionType : Type ): SourceValue = {
470
- new SourceValue (1 , ExceptionProducer (tryCatchBlockNode.handler, handlerFrame))
470
+ val handlerStackTop = handlerFrame.stackTop + 1 // +1 because this value is about to be pushed onto `handlerFrame`.
471
+ new SourceValue (1 , ExceptionProducer (tryCatchBlockNode.handler, handlerStackTop))
471
472
}
472
473
}
0 commit comments