99import it .unive .lisa .analysis .representation .DomainRepresentation ;
1010import it .unive .lisa .analysis .representation .StringRepresentation ;
1111import it .unive .lisa .program .cfg .ProgramPoint ;
12- import it .unive .lisa .symbolic .value .BinaryOperator ;
1312import it .unive .lisa .symbolic .value .Constant ;
1413import it .unive .lisa .symbolic .value .Identifier ;
15- import it .unive .lisa .symbolic .value .TernaryOperator ;
16- import it .unive .lisa .symbolic .value .UnaryOperator ;
1714import it .unive .lisa .symbolic .value .ValueExpression ;
15+ import it .unive .lisa .symbolic .value .operator .AdditionOperator ;
16+ import it .unive .lisa .symbolic .value .operator .DivisionOperator ;
17+ import it .unive .lisa .symbolic .value .operator .Module ;
18+ import it .unive .lisa .symbolic .value .operator .Multiplication ;
19+ import it .unive .lisa .symbolic .value .operator .SubtractionOperator ;
20+ import it .unive .lisa .symbolic .value .operator .binary .BinaryOperator ;
21+ import it .unive .lisa .symbolic .value .operator .binary .ComparisonEq ;
22+ import it .unive .lisa .symbolic .value .operator .binary .ComparisonGe ;
23+ import it .unive .lisa .symbolic .value .operator .binary .ComparisonGt ;
24+ import it .unive .lisa .symbolic .value .operator .binary .ComparisonLe ;
25+ import it .unive .lisa .symbolic .value .operator .binary .ComparisonLt ;
26+ import it .unive .lisa .symbolic .value .operator .binary .ComparisonNe ;
27+ import it .unive .lisa .symbolic .value .operator .ternary .TernaryOperator ;
28+ import it .unive .lisa .symbolic .value .operator .unary .NumericNegation ;
29+ import it .unive .lisa .symbolic .value .operator .unary .UnaryOperator ;
1830
1931/**
2032 * The overflow-insensitive basic integer constant propagation abstract domain,
@@ -102,33 +114,19 @@ protected IntegerConstantPropagation evalUnaryExpression(UnaryOperator operator,
102114 if (arg .isTop ())
103115 return top ();
104116
105- switch (operator ) {
106- case NUMERIC_NEG :
117+ if (operator == NumericNegation .INSTANCE )
107118 return new IntegerConstantPropagation (-value );
108- case STRING_LENGTH :
109- case LOGICAL_NOT :
110- case TYPEOF :
111- default :
112- return top ();
113- }
119+
120+ return top ();
114121 }
115122
116123 @ Override
117124 protected IntegerConstantPropagation evalBinaryExpression (BinaryOperator operator , IntegerConstantPropagation left ,
118125 IntegerConstantPropagation right , ProgramPoint pp ) {
119126
120- switch (operator ) {
121- case NUMERIC_NON_OVERFLOWING_ADD :
122- case NUMERIC_8BIT_ADD :
123- case NUMERIC_16BIT_ADD :
124- case NUMERIC_32BIT_ADD :
125- case NUMERIC_64BIT_ADD :
127+ if (operator instanceof AdditionOperator )
126128 return left .isTop () || right .isTop () ? top () : new IntegerConstantPropagation (left .value + right .value );
127- case NUMERIC_NON_OVERFLOWING_DIV :
128- case NUMERIC_8BIT_DIV :
129- case NUMERIC_16BIT_DIV :
130- case NUMERIC_32BIT_DIV :
131- case NUMERIC_64BIT_DIV :
129+ else if (operator instanceof DivisionOperator )
132130 if (!left .isTop () && left .value == 0 )
133131 return new IntegerConstantPropagation (0 );
134132 else if (!right .isTop () && right .value == 0 )
@@ -137,26 +135,14 @@ else if (left.isTop() || right.isTop() || left.value % right.value != 0)
137135 return top ();
138136 else
139137 return new IntegerConstantPropagation (left .value / right .value );
140- case NUMERIC_NON_OVERFLOWING_MOD :
141- case NUMERIC_8BIT_MOD :
142- case NUMERIC_16BIT_MOD :
143- case NUMERIC_32BIT_MOD :
144- case NUMERIC_64BIT_MOD :
138+ else if (operator instanceof Module )
145139 return left .isTop () || right .isTop () ? top () : new IntegerConstantPropagation (left .value % right .value );
146- case NUMERIC_NON_OVERFLOWING_MUL :
147- case NUMERIC_8BIT_MUL :
148- case NUMERIC_16BIT_MUL :
149- case NUMERIC_32BIT_MUL :
140+ else if (operator instanceof Multiplication )
150141 return left .isTop () || right .isTop () ? top () : new IntegerConstantPropagation (left .value * right .value );
151- case NUMERIC_NON_OVERFLOWING_SUB :
152- case NUMERIC_8BIT_SUB :
153- case NUMERIC_16BIT_SUB :
154- case NUMERIC_32BIT_SUB :
155- case NUMERIC_64BIT_SUB :
142+ else if (operator instanceof SubtractionOperator )
156143 return left .isTop () || right .isTop () ? top () : new IntegerConstantPropagation (left .value - right .value );
157- default :
144+ else
158145 return top ();
159- }
160146 }
161147
162148 @ Override
@@ -219,39 +205,35 @@ protected Satisfiability satisfiesBinaryExpression(BinaryOperator operator, Inte
219205 if (left .isTop () || right .isTop ())
220206 return Satisfiability .UNKNOWN ;
221207
222- switch (operator ) {
223- case COMPARISON_EQ :
208+ if (operator == ComparisonEq .INSTANCE )
224209 return left .value .intValue () == right .value .intValue () ? Satisfiability .SATISFIED
225210 : Satisfiability .NOT_SATISFIED ;
226- case COMPARISON_GE :
211+ else if ( operator == ComparisonGe . INSTANCE )
227212 return left .value >= right .value ? Satisfiability .SATISFIED : Satisfiability .NOT_SATISFIED ;
228- case COMPARISON_GT :
213+ else if ( operator == ComparisonGt . INSTANCE )
229214 return left .value > right .value ? Satisfiability .SATISFIED : Satisfiability .NOT_SATISFIED ;
230- case COMPARISON_LE :
215+ else if ( operator == ComparisonLe . INSTANCE )
231216 return left .value <= right .value ? Satisfiability .SATISFIED : Satisfiability .NOT_SATISFIED ;
232- case COMPARISON_LT :
217+ else if ( operator == ComparisonLt . INSTANCE )
233218 return left .value < right .value ? Satisfiability .SATISFIED : Satisfiability .NOT_SATISFIED ;
234- case COMPARISON_NE :
219+ else if ( operator == ComparisonNe . INSTANCE )
235220 return left .value .intValue () != right .value .intValue () ? Satisfiability .SATISFIED
236221 : Satisfiability .NOT_SATISFIED ;
237- default :
222+ else
238223 return Satisfiability .UNKNOWN ;
239- }
240224 }
241225
242226 @ Override
243227 protected ValueEnvironment <IntegerConstantPropagation > assumeBinaryExpression (
244228 ValueEnvironment <IntegerConstantPropagation > environment , BinaryOperator operator , ValueExpression left ,
245229 ValueExpression right , ProgramPoint pp ) throws SemanticException {
246- switch (operator ) {
247- case COMPARISON_EQ :
230+ if (operator == ComparisonEq .INSTANCE )
248231 if (left instanceof Identifier )
249232 environment = environment .assign ((Identifier ) left , right , pp );
250233 else if (right instanceof Identifier )
251234 environment = environment .assign ((Identifier ) right , left , pp );
252- return environment ;
253- default :
254- return environment ;
255- }
235+ else
236+ return environment ;
237+ return environment ;
256238 }
257239}
0 commit comments