+ return (sRef_isReasonable (s) && (s->aliaskind == AK_STACK));
+}
+
+bool sRef_isNotNull (sRef s)
+{
+ return (sRef_isValid(s) && (sRef_getNullState (s) == NS_MNOTNULL
+ || sRef_getNullState (s) == NS_NOTNULL));
+}
+
+alkind sRef_getAliasKind (sRef s)
+{
+ if (sRef_isValid(s)) {
+ llassert (alkind_isValid (s->aliaskind));
+ return s->aliaskind;
+ }
+
+ return AK_ERROR;
+}
+
+nstate sRef_getNullState (sRef s)
+{
+ if (sRef_isReasonable (s)) {
+ llassert (nstate_isValid (s->nullstate));
+ return s->nullstate;
+ }
+
+ return NS_UNKNOWN;
+}
+
+void sRef_reflectAnnotation (sRef s, annotationInfo a, fileloc loc)
+{
+ if (sRef_isReasonable (s))
+ {
+ if (!valueTable_isDefined (s->state))
+ {
+ s->state = valueTable_create (1);
+ valueTable_insert
+ (s->state,
+ cstring_copy (metaStateInfo_getName (annotationInfo_getState (a))),
+ stateValue_create (annotationInfo_getValue (a),
+ stateInfo_makeLoc (loc, SA_DECLARED)));
+ }
+ else
+ {
+ DPRINTF (("reflect loc: %s", fileloc_unparse (loc)));
+ valueTable_update
+ (s->state,
+ metaStateInfo_getName (annotationInfo_getState (a)),
+ stateValue_create (annotationInfo_getValue (a),
+ stateInfo_makeLoc (loc, SA_DECLARED)));
+
+ DPRINTF (("sref: %s", sRef_unparse (s)));
+ DPRINTF (("sref: %s", sRef_unparseFull (s)));
+ }
+ }
+}
+
+void sRef_setMetaStateValueComplete (sRef s, cstring key, int value, fileloc loc)
+{
+ sRefSet aliases = usymtab_allAliases (s);
+
+ sRef_setMetaStateValue (s, key, value, loc);
+
+ sRefSet_realElements (aliases, current)
+ {
+ if (sRef_isReasonable (current))
+ {
+ current = sRef_updateSref (current);
+ sRef_setMetaStateValue (current, key, value, loc);
+ }
+ } end_sRefSet_realElements ;
+
+ sRefSet_free (aliases);
+}
+
+void sRef_setMetaStateValue (sRef s, cstring key, int value, fileloc loc)
+{
+ sRef_checkMutable (s);
+
+ if (sRef_isReasonable (s))
+ {
+ if (!valueTable_isDefined (s->state))
+ {
+ DPRINTF (("inserting state: %s: %s %d", sRef_unparse (s), key, value));
+ s->state = valueTable_create (1);
+ valueTable_insert (s->state, cstring_copy (key),
+ stateValue_create (value,
+ stateInfo_makeLoc (loc, SA_CHANGED)));
+ }
+ else
+ {
+ DPRINTF (("Updating state: %s: %s %d / %s", sRef_unparse (s), key, value,
+ fileloc_unparse (loc)));
+ if (valueTable_contains (s->state, key))
+ {
+ valueTable_update
+ (s->state, key, stateValue_create (value,
+ stateInfo_makeLoc (loc, SA_CHANGED)));
+ }
+ else
+ {
+ valueTable_insert
+ (s->state, cstring_copy (key),
+ stateValue_create (value, stateInfo_makeLoc (loc, SA_CHANGED)));
+ }
+
+ DPRINTF (("After: %s", sRef_unparseFull (s)));
+ }
+ }
+}
+
+bool sRef_checkMetaStateValue (sRef s, cstring key, int value)
+{
+ if (sRef_isReasonable (s))
+ {
+ if (valueTable_isDefined (s->state))
+ {
+ stateValue val;
+
+ DPRINTF (("check state: %s: %s %d", sRef_unparse (s), key, value));
+
+ val = valueTable_lookup (s->state, key);
+ llassert (stateValue_isDefined (val));
+ return (stateValue_isError (val)
+ || stateValue_getValue (val) == value);
+ }
+ else
+ {
+ return TRUE;
+ }
+ }
+ else
+ {
+ return TRUE;
+ }
+}
+
+/*@observer@*/ stateValue sRef_getMetaStateValue (sRef s, cstring key)
+{
+ if (sRef_isReasonable (s))
+ {
+ if (valueTable_isDefined (s->state))
+ {
+ stateValue val;
+
+ val = valueTable_lookup (s->state, key);
+ /* Okay if its not defined, just returns stateValue_undefined */
+ return val;
+ }
+ else
+ {
+ return stateValue_undefined;
+ }
+ }
+ else
+ {
+ return stateValue_undefined;
+ }
+}
+
+/*@observer@*/ valueTable sRef_getValueTable (sRef s)
+{
+ DPRINTF (("Get value table: %s", sRef_unparse (s)));
+
+ if (sRef_isReasonable (s))
+ {
+ llassert (sRef_isReasonable (s));
+ DPRINTF (("Value table: %s", valueTable_unparse (s->state)));
+ return s->state;
+ }
+ else
+ {
+ DPRINTF (("No value table!"));
+ return valueTable_undefined;
+ }
+}
+
+bool sRef_makeStateSpecial (sRef s)
+{
+ /*
+ ** Default defined state can be made special.
+ */
+
+ llassert (sRef_isReasonable (s));
+
+ if (s->defstate == SS_UNKNOWN || s->defstate == SS_DEFINED || s->defstate == SS_SPECIAL)
+ {
+ /* s->aliaskind = AK_IMPTEMP; */ /* evans 2001-07-23 shouldn't effect alias state */
+ s->defstate = SS_SPECIAL;
+ DPRINTF (("Made special: %s", sRef_unparseFull (s)));
+ return TRUE;
+ }
+ else
+ {
+ /* s->aliaskind = AK_IMPTEMP; */
+ s->defstate = SS_SPECIAL;
+ return FALSE;
+ }
+}
+
+void sRef_markImmutable (sRef s)
+{
+ if (sRef_isReasonable (s))
+ {
+ DPRINTF (("Mark immutable: %s", sRef_unparseFull (s)));
+ s->immut = TRUE;
+ }
+}
+
+bool sRef_definitelyNullContext (sRef s)
+{
+ return (sRef_definitelyNull (s)
+ || usymtab_isDefinitelyNullDeep (s));