@@ -20,6 +20,44 @@ private predicate isUnreachedBlock(IRBlock block) {
20
20
block .getFirstInstruction ( ) instanceof UnreachedInstruction
21
21
}
22
22
23
+ private newtype TAbstractValue =
24
+ TBooleanValue ( boolean b ) { b = true or b = false } or
25
+ TMatchValue ( CaseEdge c )
26
+
27
+ /**
28
+ * An abstract value. This is either a boolean value, or a `switch` case.
29
+ */
30
+ abstract class AbstractValue extends TAbstractValue {
31
+ /** Gets an abstract value that represents the dual of this value, if any. */
32
+ abstract AbstractValue getDualValue ( ) ;
33
+
34
+ /** Gets a textual representation of this abstract value. */
35
+ abstract string toString ( ) ;
36
+ }
37
+
38
+ /** A Boolean value. */
39
+ class BooleanValue extends AbstractValue , TBooleanValue {
40
+ /** Gets the underlying Boolean value. */
41
+ boolean getValue ( ) { this = TBooleanValue ( result ) }
42
+
43
+ override BooleanValue getDualValue ( ) { result .getValue ( ) = this .getValue ( ) .booleanNot ( ) }
44
+
45
+ override string toString ( ) { result = this .getValue ( ) .toString ( ) }
46
+ }
47
+
48
+ /** A value that represents a match against a specific `switch` case. */
49
+ class MatchValue extends AbstractValue , TMatchValue {
50
+ /** Gets the case. */
51
+ CaseEdge getCase ( ) { this = TMatchValue ( result ) }
52
+
53
+ override MatchValue getDualValue ( ) {
54
+ // A `MatchValue` has no dual.
55
+ none ( )
56
+ }
57
+
58
+ override string toString ( ) { result = this .getCase ( ) .toString ( ) }
59
+ }
60
+
23
61
/**
24
62
* A Boolean condition in the AST that guards one or more basic blocks. This includes
25
63
* operands of logical operators but not switch statements.
0 commit comments