| # sks = # refs0, st[refs0 .last -- fs '] = refval(r), st[refs0 .last -- _type] .type = mkclasstype(class), st[r -- sks] = refval(refs0 .last), fits(r, sks, st), validrefs(`docs2store', r ' + refs0, mkclasstype(`java.lang.Object' .class), st), fs ' ∈ instfields(class), ∀ n. n ≠ 0 ∧ ¬ # refs0 < n → st[r -- firstn(n, sks)] .refval = (r ' + refs0)[n] ⊦ refs0 = [], refs0 .last = jvmref, hasSharing(refs0 .last, st) |
⊦ hasSharing(r, st) ↔ (∃ sks1, sks2. fits(r, sks1, st) ∧ fits(r, sks2, st) ∧ sks1 ≠ sks2 ∧ sks1 ≠ [] ∧ sks2 ≠ [] ∧ st[r -- sks1] .refval ≠ jvmref ∧ st[r -- sks1] = st[r -- sks2])
# sks = # refs0, st[refs0 .last -- fs '] = refval(r), st[refs0 .last -- _type] .type = mkclasstype(class), st[r -- sks] = refval(refs0 .last), fits(r, sks, st), validrefs(`docs2store', r ' + refs0, mkclasstype(`java.lang.Object' .class), st), fs ' ∈ instfields(class), ∀ n. n ≠ 0 ∧ ¬ # refs0 < n → st[r -- firstn(n, sks)] .refval = (r ' + refs0)[n] ⊦ refs0 = [], refs0 .last = jvmref, ∃ sks1, sks2. fits(refs0 .last, sks1, st) ∧ fits(refs0 .last, sks2, st) ∧ sks1 ≠ sks2 ∧ sks1 ≠ [] ∧ sks2 ≠ [] ∧ st[refs0 .last -- sks1] .refval ≠ jvmref ∧ st[refs0 .last -- sks1] = st[refs0 .last -- sks2]
[[CONCRETESIMPRULES : ()], [EXTRATERMS : (st, refs0 .last)]]