DFA Optional.orElse handling improved (splitting states)

This commit is contained in:
Tagir Valeev
2017-03-27 13:18:00 +07:00
parent 58dc190a9d
commit a03fffe024
2 changed files with 13 additions and 4 deletions
@@ -287,10 +287,12 @@ public class StandardInstructionVisitor extends InstructionVisitor {
result = argValues[0];
break;
case UNSURE:
Nullness nullness =
memState.isNotNull(argValues[0]) ? Nullness.NOT_NULL : memState.isNull(argValues[0]) ? Nullness.NULLABLE : Nullness.UNKNOWN;
result = runner.getFactory().createTypeValue(instruction.getResultType(), nullness);
break;
DfaMemoryState falseState = memState.createCopy();
memState.push(runner.getFactory().createTypeValue(instruction.getResultType(), Nullness.NOT_NULL));
memState.applyIsPresentCheck(true, qualifier);
falseState.push(argValues[0]);
falseState.applyIsPresentCheck(false, qualifier);
return Arrays.asList(memState, falseState);
}
}
break;
@@ -42,4 +42,11 @@ class OptionalOrElse {
return "";
}
}
void isPresentCheck(Optional<String> opt) {
String result = opt.orElse(null);
if(<warning descr="Condition 'result == null && opt.isPresent()' is always 'false'">result == null && <warning descr="Condition 'opt.isPresent()' is always 'false' when reached">opt.isPresent()</warning></warning>) {
System.out.println("Impossible");
}
}
}