Source:
private void executeMethodInvocation(MethodInvocationTree mit) { setSymbolicValueOnFields(mit); ProgramState.Pop unstack = programState.unstackValue(mit.arguments().size() + 1); logState(mit); programState = unstack.state; MethodBehavior methodInvokedBehavior = null; Symbol methodSymbol = mit.symbol(); Tree declaration = methodSymbol.declaration(); if(declaration != null) { methodInvokedBehavior = symbolicExecutionVisitor.execute((MethodTree) declaration); } final SymbolicValue resultValue = constraintManager.createMethodSymbolicValue(mit, unstack.values); if (methodInvokedBehavior != null && methodInvokedBehavior.isComplete() && methodCanNotBeOverriden(methodSymbol)) { List<SymbolicValue> invocationArguments = invocationArguments(unstack.values); List<Type> invocationTypes = mit.arguments().stream().map(ExpressionTree::symbolType).collect(Collectors.toList()); Map<Type, SymbolicValue.ExceptionalSymbolicValue> thrownExceptionsByExceptionType = new HashMap<>(); methodInvokedBehavior.exceptionalPathYields().flatMap(yield -> yield.statesAfterInvocation( invocationArguments, invocationTypes, programState, () -> thrownExceptionsByExceptionType.computeIfAbsent(yield.exceptionType, constraintManager::createExceptionalSymbolicValue)) ).forEach(ps -> enqueueExceptionalPaths(ps.clearStack(), (SymbolicValue.ExceptionalSymbolicValue) ps.peekValue())); enqueueUncheckedExceptionalPaths(); methodInvokedBehavior.happyPathYields() .flatMap(yield -> yield.statesAfterInvocation(invocationArguments, invocationTypes, programState, () -> resultValue)) .map(psYield -> handleSpecialMethods(psYield, mit, methodSymbol)) .forEach(psYield -> { checkerDispatcher.syntaxNode = mit; checkerDispatcher.addTransition(psYield); clearStack(mit); }); } else { enqueueThrownExceptionalPaths(methodSymbol); enqueueUncheckedExceptionalPaths(); programState = handleSpecialMethods(programState.stackValue(resultValue), mit, methodSymbol); checkerDispatcher.executeCheckPostStatement(mit); clearStack(mit); } }

Target:
private void executeMethodInvocation(MethodInvocationTree mit) { setSymbolicValueOnFields(mit); ProgramState.Pop unstack = programState.unstackValue(mit.arguments().size() + 1); logState(mit); programState = unstack.state; MethodBehavior methodInvokedBehavior = null; Symbol methodSymbol = mit.symbol(); Tree declaration = methodSymbol.declaration(); if(declaration != null) { methodInvokedBehavior = symbolicExecutionVisitor.execute((MethodTree) declaration); } enqueueUncheckedExceptionalPaths(); final SymbolicValue resultValue = constraintManager.createMethodSymbolicValue(mit, unstack.values); if (methodInvokedBehavior != null && methodInvokedBehavior.isComplete() && methodCanNotBeOverriden(methodSymbol)) { List<SymbolicValue> invocationArguments = invocationArguments(unstack.values); List<Type> invocationTypes = mit.arguments().stream().map(ExpressionTree::symbolType).collect(Collectors.toList()); Map<Type, SymbolicValue.ExceptionalSymbolicValue> thrownExceptionsByExceptionType = new HashMap<>(); methodInvokedBehavior.exceptionalPathYields() .flatMap(yield -> yield.statesAfterInvocation( invocationArguments, invocationTypes, programState, () -> thrownExceptionsByExceptionType.computeIfAbsent(yield.exceptionType, constraintManager::createExceptionalSymbolicValue))) .forEach(ps -> enqueueExceptionalPaths(ps.clearStack(), (SymbolicValue.ExceptionalSymbolicValue) ps.peekValue())); methodInvokedBehavior.happyPathYields() .flatMap(yield -> yield.statesAfterInvocation(invocationArguments, invocationTypes, programState, () -> resultValue)) .map(psYield -> handleSpecialMethods(psYield, mit)) .forEach(psYield -> { checkerDispatcher.syntaxNode = mit; checkerDispatcher.addTransition(psYield); clearStack(mit); }); } else { enqueueThrownExceptionalPaths(methodSymbol); programState = handleSpecialMethods(programState.stackValue(resultValue), mit); checkerDispatcher.executeCheckPostStatement(mit); clearStack(mit); } }