Improve precision of interference analysis. Allow sizeof(v.r1.r2) expressions.
[repair.git] / Repair / RepairInterpreter / cmodel.cc
1 #include <stdio.h>
2 #include "cmodel.h"
3 #include "amodel.h"
4 #include "omodel.h"
5
6
7
8 // class CAElementexpr
9
10 CAElementexpr::CAElementexpr(CAElementexpr *index, Setexpr *se) {
11   left=index;right=NULL;type=CAELEMENTEXPR_ELEMENT;
12   setexpr=se;
13 }
14
15
16 CAElementexpr::CAElementexpr(CAElementexpr *l, CAElementexpr *r, int op) {
17   left=l;right=r;type=op;
18 }
19
20 CAElementexpr::CAElementexpr(Literal *lit) {
21   literal=lit;
22   type=CAELEMENTEXPR_LIT;
23 }
24
25 CAElementexpr::CAElementexpr(Label *lab) {
26   label=lab;
27   type=CAELEMENTEXPR_LABEL;
28 }
29 CAElementexpr::CAElementexpr() {
30   type=CAELEMENTEXPR_NULL;
31 }
32
33 CAElementexpr * CAElementexpr::getleft() {
34   return (CAElementexpr *) left;
35 }
36
37 CAElementexpr * CAElementexpr::getright() {
38   return (CAElementexpr *) right;
39 }
40
41 Relation * CAElementexpr::getrelation() {
42   return rrelation;
43 }
44
45 CAElementexpr::CAElementexpr(CAElementexpr *index, Relation *r) {
46   left=index;right=NULL;type=CAELEMENTEXPR_RELATION;
47   rrelation=r;
48 }
49
50 CAElementexpr::CAElementexpr(Setexpr *se) {
51   setexpr=se;
52   type=CAELEMENTEXPR_SIZEOF;
53 }
54
55
56 void CAElementexpr::print() {
57   switch(type) {
58   case CAELEMENTEXPR_LABEL:
59     label->print();
60     break;
61   case CAELEMENTEXPR_NULL:
62     printf("NULL");
63     break;
64   case CAELEMENTEXPR_RELATION:
65     left->print();
66     printf(".");
67     rrelation->print();
68     break;
69   case CAELEMENTEXPR_SUB:
70     left->print();
71     printf("-");
72     right->print();
73     break;
74   case CAELEMENTEXPR_ADD:
75     left->print();
76     printf("+");
77     right->print();
78     break;
79   case CAELEMENTEXPR_MULT:
80     left->print();
81     printf("*");
82     right->print();
83     break;
84   case CAELEMENTEXPR_DIV:
85     left->print();
86     printf("/");
87     right->print();
88     break;
89   case CAELEMENTEXPR_LIT:
90     literal->print();
91     break;
92   case CAELEMENTEXPR_SIZEOF:
93     printf("sizeof(");
94     setexpr->print();
95     printf(")");
96     break;
97   case CAELEMENTEXPR_ELEMENT:
98     printf("element ");
99     left->print();
100     printf(" of ");
101     setexpr->print();
102     break;
103   }
104 }
105
106 Setexpr * CAElementexpr::getsetexpr() {
107   return setexpr;
108 }
109
110
111
112
113
114 // class Expr
115
116
117 Expr::Expr(Label *l) {
118   label=l;
119   type=EXPR_LABEL;
120 }
121
122 Expr::Expr(Expr *e, Field *f) {
123   field=f;expr=e; type=EXPR_FIELD;
124 }
125
126 Expr::Expr(char *ctype, Expr *e) {
127   expr=e;
128   casttype=ctype;
129   type=EXPR_CAST;
130 }
131
132 char * Expr::getcasttype() {
133   return casttype;
134 }
135
136 Expr::Expr(Expr *e, Field *f, CAElementexpr *cae) {
137   field=f;expr=e;index=cae;
138   type=EXPR_ARRAY;
139 }
140
141 Expr * Expr::getexpr() {
142   return expr;
143 }
144
145 int Expr::gettype() {
146   return type;
147 }
148
149 Field * Expr::getfield() {
150   return field;
151 }
152
153 Label * Expr::getlabel() {
154   return label;
155 }
156
157 CAElementexpr * Expr::getindex() {
158   return index;
159 }
160
161 void Expr::print() {
162   switch(type) {
163   case EXPR_LABEL:
164     label->print();
165     break;
166   case EXPR_FIELD:
167     expr->print();
168     printf(".");
169     field->print();
170     break;
171   case EXPR_CAST:
172     printf("cast(%s,",casttype);
173     expr->print();
174     printf(")");
175     break;
176   case EXPR_ARRAY:
177     expr->print();
178     printf(".");
179     field->print();
180     printf("[");
181     index->print();
182     printf("]");
183     break;
184   }
185 }
186
187
188
189
190
191
192 // class CStatementb
193
194 void CStatementb::print() {
195   switch(type) {
196   case CSTATEMENTB_ARRAYASSIGN:
197     expr->print();
198     printf(".");
199     field->print();
200     printf("[");
201     left->print();
202     printf("]=");
203     right->print();
204     break;
205   case CSTATEMENTB_FIELDASSIGN:
206     expr->print();
207     printf(".");
208     field->print();
209     printf("=");
210     right->print();
211     break;
212   }
213 }
214
215 CStatementb::CStatementb(Expr *l, Field *f, CAElementexpr *rvalue) {
216   expr=l;
217   field=f;
218   right=rvalue;
219   type=CSTATEMENTB_FIELDASSIGN;
220 }
221
222 CStatementb::CStatementb(Expr *l, Field *f, CAElementexpr *index, CAElementexpr *rvalue) {
223   expr=l;
224   field=f;
225   left=index;
226   right=rvalue;
227   type=CSTATEMENTB_ARRAYASSIGN;
228 }
229
230 Expr * CStatementb::getexpr() {
231   return expr;
232 }
233
234 Field * CStatementb::getfield() {
235   return field;
236 }