UAST value analysis: perform variable merge more accurately

In particular, Phis are now lifted inside variables & dependent,
whenever it's possible
This commit is contained in:
Mikhail Glukhikh
2017-06-23 14:53:37 +03:00
parent 3339f72c9c
commit 8e5b755ba1
19 changed files with 102 additions and 100 deletions
@@ -91,9 +91,11 @@ open class UDependentValue protected constructor(
override fun merge(other: UValue) = when (other) {
this -> this
value -> this
is UVariableValue -> other.merge(this)
is UDependentValue -> {
if (value != other.value) UPhiValue.create(this, other)
else UDependentValue(value, dependencies + other.dependencies)
val allDependencies = dependencies + other.dependencies
if (value != other.value) UDependentValue(value.merge(other.value), allDependencies)
else UDependentValue(value, allDependencies)
}
else -> UPhiValue.create(this, other)
}
@@ -83,7 +83,7 @@ abstract class UValueBase : UValue {
override fun merge(other: UValue): UValue = when (other) {
this -> this
is UVariableValue -> other.merge(this)
is UDependentValue -> other.merge(this)
is UCallResultValue -> other.merge(this)
else -> UPhiValue.create(this, other)
}
@@ -36,13 +36,13 @@ class UVariableValue private constructor(
override fun merge(other: UValue) = when (other) {
this -> this
value -> this
is UVariableValue -> {
if (variable != other.variable || value != other.value) UPhiValue.create(this, other)
else create(variable, value, dependencies + other.dependencies)
}
is UDependentValue -> {
if (value != other.value) UPhiValue.create(this, other)
else create(variable, value, dependencies + other.dependencies)
val allDependencies = dependencies + other.dependencies
when {
other !is UVariableValue || variable != other.variable -> UPhiValue.create(this, other)
value != other.value -> create(variable, value.merge(other.value), allDependencies)
else -> create(variable, value, allDependencies)
}
}
else -> UPhiValue.create(this, other)
}
@@ -7,11 +7,11 @@ UFile (package = ) [public class LoopWithReassignment {...]
ULiteralExpression (value = "") [""] = ""
UWhileExpression [while (bar(name) !== null) {...}] = Undetermined
UBinaryExpression (operator = !==) [bar(name) !== null] = Undetermined
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1)) [bar(name)] = external bar(name)(Undetermined)
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1)) [bar(name)] = external bar(name)((var name = Undetermined))
UIdentifier (Identifier (bar)) [UIdentifier (Identifier (bar))]
USimpleNameReferenceExpression (identifier = name) [name] = Undetermined
USimpleNameReferenceExpression (identifier = name) [name] = (var name = Undetermined)
ULiteralExpression (value = null) [null] = null
UBlockExpression [{...}] = external bar(name)(Undetermined)
UBlockExpression [{...}] = external bar(name)((var name = Undetermined))
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1)) [baz(Color(128, 64, 0))] = external baz(Color(128, 64, 0))(external Color(128, 64, 0)(128, 64, 0))
UIdentifier (Identifier (baz)) [UIdentifier (Identifier (baz))]
UCallExpression (kind = UastCallKind(name='constructor_call'), argCount = 3)) [Color(128, 64, 0)] = external Color(128, 64, 0)(128, 64, 0)
@@ -19,13 +19,13 @@ UFile (package = ) [public class LoopWithReassignment {...]
ULiteralExpression (value = 128) [128] = 128
ULiteralExpression (value = 64) [64] = 64
ULiteralExpression (value = 0) [0] = 0
UBinaryExpression (operator = =) [name = bar(name)] = external bar(name)(Undetermined)
USimpleNameReferenceExpression (identifier = name) [name] = Undetermined
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1)) [bar(name)] = external bar(name)(Undetermined)
UBinaryExpression (operator = =) [name = bar(name)] = external bar(name)((var name = Undetermined))
USimpleNameReferenceExpression (identifier = name) [name] = (var name = Undetermined)
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1)) [bar(name)] = external bar(name)((var name = Undetermined))
UIdentifier (Identifier (bar)) [UIdentifier (Identifier (bar))]
USimpleNameReferenceExpression (identifier = name) [name] = Undetermined
USimpleNameReferenceExpression (identifier = name) [name] = (var name = Undetermined)
UReturnExpression [return name] = Nothing
USimpleNameReferenceExpression (identifier = name) [name] = Undetermined
USimpleNameReferenceExpression (identifier = name) [name] = (var name = Undetermined)
UMethod (name = bar) [private static fun bar(name: java.lang.String) : java.lang.String {...}]
UParameter (name = name) [var name: java.lang.String]
UBlockExpression [{...}] = Nothing
@@ -22,4 +22,4 @@ UFile (package = ) [public class AliveThenElse {...]
USimpleNameReferenceExpression (identifier = z) [z] = (var z = Undetermined)
USimpleNameReferenceExpression (identifier = x) [x] = (var x = 0)
UReturnExpression [return z] = Nothing
USimpleNameReferenceExpression (identifier = z) [z] = Phi((var z = (var y = 1)), (var z = (var x = 0)))
USimpleNameReferenceExpression (identifier = z) [z] = (var z = Phi((var y = 1), (var x = 0)))
@@ -42,4 +42,4 @@ UFile (package = ) [public class CascadeIf {...]
USimpleNameReferenceExpression (identifier = z) [z] = (var z = Undetermined)
USimpleNameReferenceExpression (identifier = w) [w] = (var w = 3)
UReturnExpression [return z] = Nothing
USimpleNameReferenceExpression (identifier = z) [z] = Phi((var z = (var y = 1)), (var z = (var x = 0)), (var z = (var v = 2)), (var z = (var w = 3)))
USimpleNameReferenceExpression (identifier = z) [z] = (var z = Phi((var y = 1), (var x = 0), (var v = 2), (var w = 3)))
@@ -33,13 +33,13 @@ UFile (package = ) [public final enum DeadSwitchEntriesWithoutBreaks {...]
USimpleNameReferenceExpression (identifier = THIRD) [THIRD] = THIRD (enum entry)
UExpressionList (switch_entry) [{...] = Undetermined
UBinaryExpression (operator = =) [result = 13] = 13
USimpleNameReferenceExpression (identifier = result) [result] = Phi((var result = 7), (var result = Undetermined))
USimpleNameReferenceExpression (identifier = result) [result] = (var result = Undetermined)
ULiteralExpression (value = 13) [13] = 13
USwitchClauseExpressionWithBody [else -> {...] = Undetermined
UDefaultCaseExpression [else] = NON-EVALUATED
UExpressionList (switch_entry) [{...] = Undetermined
UBinaryExpression (operator = =) [result = 66] = 66
USimpleNameReferenceExpression (identifier = result) [result] = Phi((var result = 13), (var result = Undetermined))
USimpleNameReferenceExpression (identifier = result) [result] = (var result = Undetermined)
ULiteralExpression (value = 66) [66] = 66
UBreakExpression (label = null) [break] = Nothing(break)
UReturnExpression [return result] = Nothing
+15 -15
View File
@@ -9,24 +9,24 @@ UFile (package = ) [public class DoWhile {...]
ULocalVariable (name = number) [var number: int = 42]
ULiteralExpression (value = 42) [42] = 42
UDoWhileExpression [do {...] = Undetermined
UBinaryExpression (operator = >) [number > 0] = Undetermined
USimpleNameReferenceExpression (identifier = number) [number] = Phi((var number = Undetermined), (var number = 0), (var number = 4))
UBinaryExpression (operator = >) [number > 0] = Undetermined (depending on: (var number = Undetermined))
USimpleNameReferenceExpression (identifier = number) [number] = (var number = Undetermined)
ULiteralExpression (value = 0) [0] = 0
UBlockExpression [{...}] = Undetermined
UIfExpression [if (number % 10 === 7) {...}] = Undetermined
UBinaryExpression (operator = ===) [number % 10 === 7] = Undetermined
UBinaryExpression (operator = %) [number % 10] = Undetermined
USimpleNameReferenceExpression (identifier = number) [number] = Phi((var number = Undetermined), (var number = 0), (var number = 4))
UBlockExpression [{...}] = Undetermined (depending on: (var number = Undetermined))
UIfExpression [if (number % 10 === 7) {...}] = (var count = Undetermined)
UBinaryExpression (operator = ===) [number % 10 === 7] = Undetermined (depending on: (var number = Undetermined))
UBinaryExpression (operator = %) [number % 10] = Undetermined (depending on: (var number = Undetermined))
USimpleNameReferenceExpression (identifier = number) [number] = (var number = Undetermined)
ULiteralExpression (value = 10) [10] = 10
ULiteralExpression (value = 7) [7] = 7
UBlockExpression [{...}] = Phi((var count = Undetermined), (var count = 0), (var count = 1))
UPostfixExpression (operator = ++) [count++] = Phi((var count = Undetermined), (var count = 0), (var count = 1))
USimpleNameReferenceExpression (identifier = count) [count] = Phi((var count = Undetermined), (var count = 0), (var count = 1))
UBlockExpression [{...}] = (var count = Undetermined)
UPostfixExpression (operator = ++) [count++] = (var count = Undetermined)
USimpleNameReferenceExpression (identifier = count) [count] = (var count = Undetermined)
UastEmptyExpression [UastEmptyExpression] = NON-EVALUATED
UBinaryExpression (operator = =) [number = number / 10] = Undetermined
USimpleNameReferenceExpression (identifier = number) [number] = Phi((var number = Undetermined), (var number = 0), (var number = 4))
UBinaryExpression (operator = /) [number / 10] = Undetermined
USimpleNameReferenceExpression (identifier = number) [number] = Phi((var number = Undetermined), (var number = 0), (var number = 4))
UBinaryExpression (operator = =) [number = number / 10] = Undetermined (depending on: (var number = Undetermined))
USimpleNameReferenceExpression (identifier = number) [number] = (var number = Undetermined)
UBinaryExpression (operator = /) [number / 10] = Undetermined (depending on: (var number = Undetermined))
USimpleNameReferenceExpression (identifier = number) [number] = (var number = Undetermined)
ULiteralExpression (value = 10) [10] = 10
UReturnExpression [return count] = Nothing
USimpleNameReferenceExpression (identifier = count) [count] = Phi((var count = Undetermined), (var count = 0), (var count = 1))
USimpleNameReferenceExpression (identifier = count) [count] = (var count = Undetermined)
@@ -20,4 +20,4 @@ UFile (package = ) [public final enum EnumChoice {...]
USimpleNameReferenceExpression (identifier = result) [result] = (var result = Undetermined)
USimpleNameReferenceExpression (identifier = SECOND) [SECOND] = SECOND (enum entry)
UReturnExpression [return result] = Nothing
USimpleNameReferenceExpression (identifier = result) [result] = Phi((var result = FIRST (enum entry)), (var result = SECOND (enum entry)))
USimpleNameReferenceExpression (identifier = result) [result] = (var result = Phi(FIRST (enum entry), SECOND (enum entry)))
@@ -43,4 +43,4 @@ UFile (package = ) [public final enum EnumSwitch {...]
ULiteralExpression (value = 66) [66] = 66
UBreakExpression (label = null) [break] = Nothing(break)
UReturnExpression [return result] = Nothing
USimpleNameReferenceExpression (identifier = result) [result] = Phi((var result = 66), (var result = 13), (var result = 3), (var result = 7))
USimpleNameReferenceExpression (identifier = result) [result] = (var result = Phi(3, 7, 13, 66))
@@ -41,8 +41,8 @@ UFile (package = ) [public final enum EnumSwitchConditionalBreak {...]
UBinaryExpression (operator = =) [newResult = 42] = 42
USimpleNameReferenceExpression (identifier = newResult) [newResult] = (var newResult = Undetermined)
ULiteralExpression (value = 42) [42] = 42
UPostfixExpression (operator = ++) [counter++] = Phi((var counter = 1), (var counter = 0))
USimpleNameReferenceExpression (identifier = counter) [counter] = Phi((var counter = 1), (var counter = 0))
UPostfixExpression (operator = ++) [counter++] = (var counter = Phi(1, 0))
USimpleNameReferenceExpression (identifier = counter) [counter] = (var counter = Phi(1, 0))
UBreakExpression (label = null) [break] = Nothing(break)
UReturnExpression [return newResult + counter] = Nothing
UBinaryExpression (operator = +) [newResult + counter] = Undetermined (depending on: (var newResult = 42), (var counter = Undetermined))
@@ -31,14 +31,14 @@ UFile (package = ) [public final enum EnumSwitchWithoutBreaks {...]
USimpleNameReferenceExpression (identifier = THIRD) [THIRD] = THIRD (enum entry)
UExpressionList (switch_entry) [{...] = Undetermined
UBinaryExpression (operator = =) [result = 13] = 13
USimpleNameReferenceExpression (identifier = result) [result] = Phi((var result = 7), (var result = Undetermined))
USimpleNameReferenceExpression (identifier = result) [result] = (var result = Undetermined)
ULiteralExpression (value = 13) [13] = 13
USwitchClauseExpressionWithBody [else -> {...] = Undetermined
UDefaultCaseExpression [else] = NON-EVALUATED
UExpressionList (switch_entry) [{...] = Undetermined
UBinaryExpression (operator = =) [result = 66] = 66
USimpleNameReferenceExpression (identifier = result) [result] = Phi((var result = 13), (var result = Undetermined))
USimpleNameReferenceExpression (identifier = result) [result] = (var result = Undetermined)
ULiteralExpression (value = 66) [66] = 66
UBreakExpression (label = null) [break] = Nothing(break)
UReturnExpression [return result] = Nothing
USimpleNameReferenceExpression (identifier = result) [result] = Phi((var result = 3), (var result = 66))
USimpleNameReferenceExpression (identifier = result) [result] = (var result = Phi(3, 66))
+11 -11
View File
@@ -9,16 +9,16 @@ UFile (package = ) [public class For {...]
UDeclarationsExpression [var i: int = 0] = Undetermined
ULocalVariable (name = i) [var i: int = 0]
ULiteralExpression (value = 0) [0] = 0
UBinaryExpression (operator = <) [i < 10] = Undetermined
USimpleNameReferenceExpression (identifier = i) [i] = Phi((var i = Undetermined), (var i = 1), (var i = 0))
UBinaryExpression (operator = <) [i < 10] = Undetermined (depending on: (var i = Undetermined))
USimpleNameReferenceExpression (identifier = i) [i] = (var i = Undetermined)
ULiteralExpression (value = 10) [10] = 10
UPostfixExpression (operator = ++) [i++] = Phi((var i = Undetermined), (var i = 1), (var i = 0))
USimpleNameReferenceExpression (identifier = i) [i] = Phi((var i = Undetermined), (var i = 1), (var i = 0))
UBlockExpression [{...}] = Undetermined
UBinaryExpression (operator = =) [result = result + i] = Undetermined
USimpleNameReferenceExpression (identifier = result) [result] = Phi((var result = Undetermined), (var result = 0 (depending on: (var i = 0))), (var result = 0))
UBinaryExpression (operator = +) [result + i] = Undetermined
USimpleNameReferenceExpression (identifier = result) [result] = Phi((var result = Undetermined), (var result = 0 (depending on: (var i = 0))), (var result = 0))
USimpleNameReferenceExpression (identifier = i) [i] = Phi((var i = Undetermined), (var i = 1), (var i = 0))
UPostfixExpression (operator = ++) [i++] = (var i = Undetermined)
USimpleNameReferenceExpression (identifier = i) [i] = (var i = Undetermined)
UBlockExpression [{...}] = Undetermined (depending on: (var result = Undetermined (depending on: (var i = Undetermined), (var i = Phi(1, 0)), (var i = 0))), (var i = Undetermined))
UBinaryExpression (operator = =) [result = result + i] = Undetermined (depending on: (var result = Undetermined (depending on: (var i = Undetermined), (var i = Phi(1, 0)), (var i = 0))), (var i = Undetermined))
USimpleNameReferenceExpression (identifier = result) [result] = (var result = Undetermined (depending on: (var i = Undetermined), (var i = Phi(1, 0)), (var i = 0)))
UBinaryExpression (operator = +) [result + i] = Undetermined (depending on: (var result = Undetermined (depending on: (var i = Undetermined), (var i = Phi(1, 0)), (var i = 0))), (var i = Undetermined))
USimpleNameReferenceExpression (identifier = result) [result] = (var result = Undetermined (depending on: (var i = Undetermined), (var i = Phi(1, 0)), (var i = 0)))
USimpleNameReferenceExpression (identifier = i) [i] = (var i = Undetermined)
UReturnExpression [return result] = Nothing
USimpleNameReferenceExpression (identifier = result) [result] = Phi((var result = Undetermined), (var result = 0 (depending on: (var i = 0))), (var result = 0))
USimpleNameReferenceExpression (identifier = result) [result] = (var result = Undetermined (depending on: (var i = Undetermined), (var i = Phi(1, 0)), (var i = 0)))
@@ -8,11 +8,11 @@ UFile (package = ) [public class For {...]
ULiteralExpression (value = 0) [0] = 0
UForEachExpression [for (number : numbers) {...}] = Undetermined
USimpleNameReferenceExpression (identifier = numbers) [numbers] = Undetermined
UBlockExpression [{...}] = Undetermined
UBinaryExpression (operator = =) [result = result + number] = Undetermined
USimpleNameReferenceExpression (identifier = result) [result] = Phi((var result = Undetermined), (var result = 0))
UBinaryExpression (operator = +) [result + number] = Undetermined
USimpleNameReferenceExpression (identifier = result) [result] = Phi((var result = Undetermined), (var result = 0))
UBlockExpression [{...}] = Undetermined (depending on: (var result = Undetermined))
UBinaryExpression (operator = =) [result = result + number] = Undetermined (depending on: (var result = Undetermined))
USimpleNameReferenceExpression (identifier = result) [result] = (var result = Undetermined)
UBinaryExpression (operator = +) [result + number] = Undetermined (depending on: (var result = Undetermined))
USimpleNameReferenceExpression (identifier = result) [result] = (var result = Undetermined)
USimpleNameReferenceExpression (identifier = number) [number] = Undetermined
UReturnExpression [return result] = Nothing
USimpleNameReferenceExpression (identifier = result) [result] = Phi((var result = Undetermined), (var result = 0))
USimpleNameReferenceExpression (identifier = result) [result] = (var result = Undetermined)
@@ -16,17 +16,17 @@ UFile (package = ) [import java.util...]
ULocalVariable (name = i) [var i: int = a++]
UPostfixExpression (operator = ++) [a++] = (var a = 0)
USimpleNameReferenceExpression (identifier = a) [a] = (var a = 0)
UBinaryExpression (operator = <) [i < size] = Undetermined
USimpleNameReferenceExpression (identifier = i) [i] = Phi((var i = Undetermined), (var i = 1), (var i = (var a = 0)))
UBinaryExpression (operator = <) [i < size] = Undetermined (depending on: (var i = Undetermined))
USimpleNameReferenceExpression (identifier = i) [i] = (var i = Undetermined)
USimpleNameReferenceExpression (identifier = size) [size] = Undetermined
UPostfixExpression (operator = ++) [i++] = Phi((var i = Undetermined), (var i = 1), (var i = (var a = 0)))
USimpleNameReferenceExpression (identifier = i) [i] = Phi((var i = Undetermined), (var i = 1), (var i = (var a = 0)))
UBlockExpression [{...}] = external add(i)(Phi((var i = Undetermined), (var i = 1), (var i = (var a = 0))))
UQualifiedReferenceExpression [result.add(i)] = external add(i)(Phi((var i = Undetermined), (var i = 1), (var i = (var a = 0))))
UPostfixExpression (operator = ++) [i++] = (var i = Undetermined)
USimpleNameReferenceExpression (identifier = i) [i] = (var i = Undetermined)
UBlockExpression [{...}] = external add(i)((var i = Undetermined))
UQualifiedReferenceExpression [result.add(i)] = external add(i)((var i = Undetermined))
USimpleNameReferenceExpression (identifier = result) [result] = (var result = external LinkedList()())
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1)) [add(i)] = external add(i)(Phi((var i = Undetermined), (var i = 1), (var i = (var a = 0))))
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1)) [add(i)] = external add(i)((var i = Undetermined))
UIdentifier (Identifier (add)) [UIdentifier (Identifier (add))]
USimpleNameReferenceExpression (identifier = i) [i] = Phi((var i = Undetermined), (var i = 1), (var i = (var a = 0)))
USimpleNameReferenceExpression (identifier = i) [i] = (var i = Undetermined)
UQualifiedReferenceExpression [result.add(a)] = external add(a)((var a = 1))
USimpleNameReferenceExpression (identifier = result) [result] = (var result = external LinkedList()())
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1)) [add(a)] = external add(a)((var a = 1))
@@ -48,13 +48,13 @@ UFile (package = ) [import java.util...]
UIdentifier (Identifier (getList)) [UIdentifier (Identifier (getList))]
UPrefixExpression (operator = ++) [++size] = 4 (depending on: (var size = 3))
USimpleNameReferenceExpression (identifier = size) [size] = (var size = 3)
UBlockExpression [{...}] = Undetermined
UBinaryExpression (operator = =) [result = result + number] = Undetermined
USimpleNameReferenceExpression (identifier = result) [result] = Phi((var result = Undetermined), (var result = 0))
UBinaryExpression (operator = +) [result + number] = Undetermined
USimpleNameReferenceExpression (identifier = result) [result] = Phi((var result = Undetermined), (var result = 0))
UBlockExpression [{...}] = Undetermined (depending on: (var result = Undetermined))
UBinaryExpression (operator = =) [result = result + number] = Undetermined (depending on: (var result = Undetermined))
USimpleNameReferenceExpression (identifier = result) [result] = (var result = Undetermined)
UBinaryExpression (operator = +) [result + number] = Undetermined (depending on: (var result = Undetermined))
USimpleNameReferenceExpression (identifier = result) [result] = (var result = Undetermined)
USimpleNameReferenceExpression (identifier = number) [number] = Undetermined
UReturnExpression [return result + size] = Nothing
UBinaryExpression (operator = +) [result + size] = Undetermined (depending on: (var size = 4))
USimpleNameReferenceExpression (identifier = result) [result] = Phi((var result = Undetermined), (var result = 0))
UBinaryExpression (operator = +) [result + size] = Undetermined (depending on: (var result = Undetermined), (var size = 4))
USimpleNameReferenceExpression (identifier = result) [result] = (var result = Undetermined)
USimpleNameReferenceExpression (identifier = size) [size] = (var size = 4)
@@ -18,10 +18,10 @@ UFile (package = ) [public class TryCatch {...]
ULiteralExpression (value = 0) [0] = 0
UTryExpression [try {...] = Undetermined
UBlockExpression [{...}] = 1
UBinaryExpression (operator = =) [sum = sum + Integer.parseInt(part)] = Undetermined
USimpleNameReferenceExpression (identifier = sum) [sum] = Phi((var sum = 0), (var sum = Undetermined))
UBinaryExpression (operator = +) [sum + Integer.parseInt(part)] = Undetermined
USimpleNameReferenceExpression (identifier = sum) [sum] = Phi((var sum = 0), (var sum = Undetermined))
UBinaryExpression (operator = =) [sum = sum + Integer.parseInt(part)] = Undetermined (depending on: (var sum = Undetermined))
USimpleNameReferenceExpression (identifier = sum) [sum] = (var sum = Undetermined)
UBinaryExpression (operator = +) [sum + Integer.parseInt(part)] = Undetermined (depending on: (var sum = Undetermined))
USimpleNameReferenceExpression (identifier = sum) [sum] = (var sum = Undetermined)
UQualifiedReferenceExpression [Integer.parseInt(part)] = external parseInt(part)(Undetermined)
USimpleNameReferenceExpression (identifier = Integer) [Integer] = external Integer()
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1)) [parseInt(part)] = external parseInt(part)(Undetermined)
@@ -37,6 +37,6 @@ UFile (package = ) [public class TryCatch {...]
ULiteralExpression (value = 1) [1] = 1
UDeclarationsExpression [var c: int = b] = Undetermined
ULocalVariable (name = c) [var c: int = b]
USimpleNameReferenceExpression (identifier = b) [b] = Phi((var b = 1), (var b = 0))
USimpleNameReferenceExpression (identifier = b) [b] = (var b = Phi(1, 0))
UReturnExpression [return sum] = Nothing
USimpleNameReferenceExpression (identifier = sum) [sum] = Phi((var sum = Undetermined), (var sum = 0))
USimpleNameReferenceExpression (identifier = sum) [sum] = (var sum = Undetermined)
+10 -10
View File
@@ -8,15 +8,15 @@ UFile (package = ) [public class While {...]
ULocalVariable (name = i) [var i: int = 0]
ULiteralExpression (value = 0) [0] = 0
UWhileExpression [while (i < 10) {...}] = Undetermined
UBinaryExpression (operator = <) [i < 10] = Undetermined
USimpleNameReferenceExpression (identifier = i) [i] = Phi((var i = Undetermined), (var i = 1), (var i = 0))
UBinaryExpression (operator = <) [i < 10] = Undetermined (depending on: (var i = Undetermined))
USimpleNameReferenceExpression (identifier = i) [i] = (var i = Undetermined)
ULiteralExpression (value = 10) [10] = 10
UBlockExpression [{...}] = Undetermined
UBinaryExpression (operator = =) [result = result + i++] = Undetermined
USimpleNameReferenceExpression (identifier = result) [result] = Phi((var result = Undetermined), (var result = 0 (depending on: (var i = 0))), (var result = 0))
UBinaryExpression (operator = +) [result + i++] = Undetermined
USimpleNameReferenceExpression (identifier = result) [result] = Phi((var result = Undetermined), (var result = 0 (depending on: (var i = 0))), (var result = 0))
UPostfixExpression (operator = ++) [i++] = Phi((var i = Undetermined), (var i = 1), (var i = 0))
USimpleNameReferenceExpression (identifier = i) [i] = Phi((var i = Undetermined), (var i = 1), (var i = 0))
UBlockExpression [{...}] = Undetermined (depending on: (var result = Undetermined (depending on: (var i = Undetermined), (var i = Phi(1, 0)), (var i = 0))), (var i = Undetermined))
UBinaryExpression (operator = =) [result = result + i++] = Undetermined (depending on: (var result = Undetermined (depending on: (var i = Undetermined), (var i = Phi(1, 0)), (var i = 0))), (var i = Undetermined))
USimpleNameReferenceExpression (identifier = result) [result] = (var result = Undetermined (depending on: (var i = Undetermined), (var i = Phi(1, 0)), (var i = 0)))
UBinaryExpression (operator = +) [result + i++] = Undetermined (depending on: (var result = Undetermined (depending on: (var i = Undetermined), (var i = Phi(1, 0)), (var i = 0))), (var i = Undetermined))
USimpleNameReferenceExpression (identifier = result) [result] = (var result = Undetermined (depending on: (var i = Undetermined), (var i = Phi(1, 0)), (var i = 0)))
UPostfixExpression (operator = ++) [i++] = (var i = Undetermined)
USimpleNameReferenceExpression (identifier = i) [i] = (var i = Undetermined)
UReturnExpression [return result] = Nothing
USimpleNameReferenceExpression (identifier = result) [result] = Phi((var result = Undetermined), (var result = 0 (depending on: (var i = 0))), (var result = 0))
USimpleNameReferenceExpression (identifier = result) [result] = (var result = Undetermined (depending on: (var i = Undetermined), (var i = Phi(1, 0)), (var i = 0)))
@@ -17,7 +17,7 @@ UFile (package = ) [public class WhileWithContinue {...]
UIdentifier (Identifier (bar)) [UIdentifier (Identifier (bar))]
UBlockExpression [{...}] = Nothing(continue)
UBinaryExpression (operator = =) [second = 3] = 3
USimpleNameReferenceExpression (identifier = second) [second] = Phi((var second = 3), (var second = 2))
USimpleNameReferenceExpression (identifier = second) [second] = (var second = Phi(3, 2))
ULiteralExpression (value = 3) [3] = 3
UIfExpression [if (first > 0) continue] = Nothing(continue)
UBinaryExpression (operator = >) [first > 0] = true (depending on: (var first = 1))
@@ -29,7 +29,7 @@ UFile (package = ) [public class WhileWithContinue {...]
USimpleNameReferenceExpression (identifier = second) [second] = Undetermined
ULiteralExpression (value = 4) [4] = 4
UReturnExpression [return second] = Nothing
USimpleNameReferenceExpression (identifier = second) [second] = Phi((var second = 3), (var second = 2))
USimpleNameReferenceExpression (identifier = second) [second] = (var second = Phi(3, 2))
UMethod (name = baz) [public static fun baz() : int {...}]
UBlockExpression [{...}] = Nothing
UDeclarationsExpression [var first: int = 2] = Undetermined
@@ -43,10 +43,10 @@ UFile (package = ) [public class WhileWithContinue {...]
UIdentifier (Identifier (bar)) [UIdentifier (Identifier (bar))]
UBlockExpression [{...}] = 4
UBinaryExpression (operator = =) [second = 3] = 3
USimpleNameReferenceExpression (identifier = second) [second] = Phi((var second = 4), (var second = 3), (var second = 2))
USimpleNameReferenceExpression (identifier = second) [second] = (var second = Phi(4, 3, 2))
ULiteralExpression (value = 3) [3] = 3
UPostfixExpression (operator = --) [first--] = Phi((var first = Undetermined), (var first = 1), (var first = 2))
USimpleNameReferenceExpression (identifier = first) [first] = Phi((var first = Undetermined), (var first = 1), (var first = 2))
UPostfixExpression (operator = --) [first--] = (var first = Undetermined)
USimpleNameReferenceExpression (identifier = first) [first] = (var first = Undetermined)
UIfExpression [if (first > 0) continue] = Undetermined
UBinaryExpression (operator = >) [first > 0] = Undetermined (depending on: (var first = Undetermined))
USimpleNameReferenceExpression (identifier = first) [first] = (var first = Undetermined)
@@ -57,4 +57,4 @@ UFile (package = ) [public class WhileWithContinue {...]
USimpleNameReferenceExpression (identifier = second) [second] = (var second = 3)
ULiteralExpression (value = 4) [4] = 4
UReturnExpression [return second] = Nothing
USimpleNameReferenceExpression (identifier = second) [second] = Phi((var second = 4), (var second = 3), (var second = 2))
USimpleNameReferenceExpression (identifier = second) [second] = (var second = Phi(4, 3, 2))
@@ -8,8 +8,8 @@ UFile (package = ) [public class WhileWithIncrement {...]
UWhileExpression [while (true) {...}] = Undetermined
ULiteralExpression (value = true) [true] = true
UBlockExpression [{...}] = Undetermined
UPostfixExpression (operator = ++) [i++] = Phi((var i = Undetermined), (var i = 1), (var i = 0))
USimpleNameReferenceExpression (identifier = i) [i] = Phi((var i = Undetermined), (var i = 1), (var i = 0))
UPostfixExpression (operator = ++) [i++] = (var i = Undetermined)
USimpleNameReferenceExpression (identifier = i) [i] = (var i = Undetermined)
UIfExpression [if (i % 42 === 0) break] = Undetermined
UBinaryExpression (operator = ===) [i % 42 === 0] = Undetermined (depending on: (var i = Undetermined))
UBinaryExpression (operator = %) [i % 42] = Undetermined (depending on: (var i = Undetermined))
@@ -19,4 +19,4 @@ UFile (package = ) [public class WhileWithIncrement {...]
UBreakExpression (label = null) [break] = Nothing(break)
UastEmptyExpression [UastEmptyExpression] = NON-EVALUATED
UReturnExpression [return i] = Nothing
USimpleNameReferenceExpression (identifier = i) [i] = Phi((var i = Undetermined), (var i = 1), (var i = 0))
USimpleNameReferenceExpression (identifier = i) [i] = (var i = Undetermined)