00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 # include "lclintMacros.nf"
00036 # include "basic.h"
00037
00038 guardSet guardSet_new ()
00039 {
00040 return guardSet_undefined;
00041 }
00042
00043 static guardSet guardSet_newEmpty (void)
00044
00045
00046 {
00047 guardSet g = (guardSet) dmalloc (sizeof (*g));
00048
00049 g->tguard = sRefSet_undefined;
00050 g->fguard = sRefSet_undefined;
00051
00052 return g;
00053 }
00054
00055 sRefSet guardSet_getTrueGuards (guardSet g)
00056 {
00057
00058 if (guardSet_isDefined (g))
00059 {
00060 return (g->tguard);
00061 }
00062 else
00063 {
00064 return (sRefSet_undefined);
00065 }
00066 }
00067
00068 void guardSet_delete (guardSet g, sRef s)
00069 {
00070 bool res;
00071 llassert (guardSet_isDefined (g));
00072 res = sRefSet_delete (g->tguard, s);
00073
00074
00075
00076
00077
00078 }
00079
00080 sRefSet guardSet_getFalseGuards (guardSet g)
00081 {
00082 if (guardSet_isDefined (g))
00083 {
00084 return (g->fguard);
00085 }
00086 else
00087 {
00088 return (sRefSet_undefined);
00089 }
00090 }
00091
00092 guardSet guardSet_or ( guardSet s, guardSet t)
00093 {
00094
00095 llassert (NOALIAS (s, t));
00096
00097 if (s == guardSet_undefined)
00098 {
00099 if (t == guardSet_undefined)
00100 {
00101 return s;
00102 }
00103
00104 s = guardSet_newEmpty ();
00105 }
00106
00107 if (t == guardSet_undefined)
00108 {
00109 sRefSet_free (s->tguard);
00110 s->tguard = sRefSet_new ();
00111 }
00112 else
00113 {
00114 sRefSet last;
00115
00116 s->tguard = sRefSet_intersect (last = s->tguard, t->tguard);
00117 sRefSet_free (last);
00118 s->fguard = sRefSet_union (s->fguard, t->fguard);
00119 }
00120
00121
00122 return s;
00123 }
00124
00125 guardSet guardSet_and ( guardSet s, guardSet t)
00126 {
00127 llassert (NOALIAS (s, t));
00128
00129 if (s == guardSet_undefined)
00130 {
00131 if (t == guardSet_undefined)
00132 {
00133 return s;
00134 }
00135
00136 s = guardSet_newEmpty ();
00137 }
00138
00139 if (t == guardSet_undefined)
00140 {
00141 sRefSet_free (s->fguard);
00142 s->fguard = sRefSet_new ();
00143 }
00144 else
00145 {
00146 sRefSet last;
00147
00148 s->tguard = sRefSet_union (s->tguard, t->tguard);
00149
00150 s->fguard = sRefSet_intersect (last = s->fguard, t->fguard);
00151 sRefSet_free (last);
00152 }
00153
00154 return s;
00155 }
00156
00157 guardSet guardSet_union ( guardSet s, guardSet t)
00158 {
00159 if (t == guardSet_undefined) return s;
00160
00161 llassert (NOALIAS (s, t));
00162
00163 if (guardSet_isDefined (s))
00164 {
00165 s->tguard = sRefSet_union (s->tguard, t->tguard);
00166 s->fguard = sRefSet_union (s->fguard, t->fguard);
00167 }
00168 else
00169 {
00170 s = guardSet_newEmpty ();
00171
00172 s->tguard = sRefSet_newCopy (t->tguard);
00173 s->fguard = sRefSet_newCopy (t->fguard);
00174 }
00175
00176 return s;
00177 }
00178
00179 guardSet guardSet_levelUnion ( guardSet s, guardSet t, int lexlevel)
00180 {
00181 if (t == guardSet_undefined) return s;
00182
00183 llassert (NOALIAS (s, t));
00184
00185 if (guardSet_isDefined (s))
00186 {
00187 s->tguard = sRefSet_levelUnion (s->tguard, t->tguard, lexlevel);
00188 s->fguard = sRefSet_levelUnion (s->fguard, t->fguard, lexlevel);
00189 }
00190 else
00191 {
00192 s = guardSet_newEmpty ();
00193
00194
00195
00196 sRefSet_free (s->tguard);
00197 sRefSet_free (s->fguard);
00198
00199 s->tguard = sRefSet_levelCopy (t->tguard, lexlevel);
00200 s->fguard = sRefSet_levelCopy (t->fguard, lexlevel);
00201 }
00202
00203 return s;
00204 }
00205
00206 guardSet
00207 guardSet_levelUnionFree ( guardSet s,
00208 guardSet t, int lexlevel)
00209 {
00210 if (t == guardSet_undefined) return s;
00211
00212 if (guardSet_isDefined (s))
00213 {
00214 s->tguard = sRefSet_levelUnion (s->tguard, t->tguard, lexlevel);
00215 s->fguard = sRefSet_levelUnion (s->fguard, t->fguard, lexlevel);
00216 }
00217 else
00218 {
00219 s = guardSet_newEmpty ();
00220
00221
00222
00223 sRefSet_free (s->tguard);
00224 sRefSet_free (s->fguard);
00225
00226 s->tguard = sRefSet_levelCopy (t->tguard, lexlevel);
00227 s->fguard = sRefSet_levelCopy (t->fguard, lexlevel);
00228 }
00229
00230 guardSet_free (t);
00231 return s;
00232 }
00233
00234 void guardSet_flip (guardSet g)
00235 {
00236 if (g != guardSet_undefined)
00237 {
00238 sRefSet tmp = g->tguard;
00239
00240 g->tguard = g->fguard;
00241 g->fguard = tmp;
00242 }
00243 }
00244
00245 guardSet guardSet_invert ( guardSet g)
00246 {
00247 if (g != guardSet_undefined)
00248 {
00249 guardSet ret = guardSet_newEmpty ();
00250
00251 ret->tguard = sRefSet_newCopy (g->fguard);
00252 ret->fguard = sRefSet_newCopy (g->tguard);
00253
00254 return ret;
00255 }
00256 return guardSet_undefined;
00257 }
00258
00259 guardSet guardSet_copy ( guardSet g)
00260 {
00261 if (g != guardSet_undefined)
00262 {
00263 guardSet ret = guardSet_newEmpty ();
00264
00265 ret->tguard = sRefSet_newCopy (g->tguard);
00266 ret->fguard = sRefSet_newCopy (g->fguard);
00267
00268 return ret;
00269 }
00270 return guardSet_undefined;
00271 }
00272
00273 guardSet guardSet_addTrueGuard ( guardSet g, sRef s)
00274 {
00275 if (sRef_isMeaningful (s))
00276 {
00277 if (g == guardSet_undefined)
00278 {
00279 g = guardSet_newEmpty ();
00280 }
00281
00282 g->tguard = sRefSet_insert (g->tguard, s);
00283 }
00284
00285 return g;
00286 }
00287
00288 guardSet guardSet_addFalseGuard ( guardSet g, sRef s)
00289 {
00290 if (sRef_isMeaningful (s))
00291 {
00292 if (g == guardSet_undefined)
00293 {
00294 g = guardSet_newEmpty ();
00295 }
00296
00297 g->fguard = sRefSet_insert (g->fguard, s);
00298 }
00299
00300 return g;
00301 }
00302
00303 cstring guardSet_unparse (guardSet g)
00304 {
00305 if (g == guardSet_undefined)
00306 {
00307 return (cstring_makeLiteral ("<no guards>"));
00308 }
00309 else
00310 {
00311 return (message ("not null: %q / prob null: %q",
00312 sRefSet_unparseDebug (g->tguard),
00313 sRefSet_unparseDebug (g->fguard)));
00314 }
00315 }
00316
00317 void guardSet_free ( guardSet g)
00318 {
00319 if (g == guardSet_undefined) return;
00320
00321 sRefSet_free (g->tguard);
00322 sRefSet_free (g->fguard);
00323
00324 sfree (g);
00325 }
00326
00327 bool
00328 guardSet_isGuarded (guardSet g, sRef s)
00329 {
00330 if (g == guardSet_undefined) return FALSE;
00331
00332 return (sRefSet_member (g->tguard, s));
00333 }
00334
00335 bool
00336 guardSet_isProbableNull (guardSet g, sRef s)
00337 {
00338 bool ret;
00339
00340 if (g == guardSet_undefined) return FALSE;
00341
00342 ret = sRefSet_member (g->fguard, s);
00343 return ret;
00344 }
00345
00346 bool guardSet_isEmpty (guardSet g)
00347 {
00348 if (guardSet_isDefined (g))
00349 {
00350 return (sRefSet_isEmpty (g->tguard) && sRefSet_isEmpty (g->fguard));
00351 }
00352 else
00353 {
00354 return TRUE;
00355 }
00356 }