| followRefs (r, st) { if ¬ r ∈ st ∨ r = jvmref then skip else if ∃ ty. typeval(ty) = st[r -- _type] ∧ is_classtype(ty) ∧ instfields(ty .class) ≠ [] ∧ (∃ fs. fs ' ∈ instfields(ty .class) ∧ (∃ r0. st[r -- fs '] = refval(r0))) then choose fs, r0 with (fs ' ∈ instfields(st[r -- _type] .type .class) ∧ refval(r0) = st[r -- fs ']) in followRefs(r0, st) else if ∃ ty. typeval(ty) = st[r -- _type] ∧ is_arraytype(ty) ∧ (∃ i. 0 ≤ i ∧ i < st[r -- _length] .intval ∧ (∃ r0. st[r -- i '] = refval(r0))) then choose i, r0 with (0 ≤ i ∧ i < st[r -- _length] .intval ∧ refval(r0) = st[r -- i ']) in followRefs(r0, st) } |