| acc = r3 + refs0, acc + r ' = r1 ' + refs, st[r0 -- mkfs(class, ty0, fieldvar) '] = refval(r1), r3 = st[r0 -- mkfs(class0, ty1, fieldvar0) '] .refval, is_obj(str, r0, st), st[r0 -- _type] .type ≤ ty, mkfs(class, ty0, fieldvar) ' ∈ instfields(st[r0 -- _type] .type .class), validrefs(str, r1 ' + refs, ty0, st), mkfs(class0, ty1, fieldvar0) ' ∈ instfields(st[r0 -- _type] .type .class), is_referencevalue(st[r0 -- mkfs(class0, ty1, fieldvar0) ']), validrefs(str, acc, ty1, st), r ∈ refs, r1 ∈ acc, ∀ str0, ty2, st0, r2. validrefs(str0, acc, ty2, st0) ∧ validrefs(str0, acc + r2 ', ty2, st0) → has_reffield(acc .last, st0) ⊦ acc = [], r0 = jvmref, has_reffield(acc .last, st) |
st[r0 -- mkfs(class, ty0, fieldvar) '] = st[r0 -- mkfs(class0, ty1, fieldvar0) '], validrefs(str, st[r0 -- mkfs(class0, ty1, fieldvar0) '] .refval ' + refs0, ty1, st), is_referencevalue(st[r0 -- mkfs(class0, ty1, fieldvar0) ']), mkfs(class0, ty1, fieldvar0) ' ∈ instfields(st[r0 -- _type] .type .class), validrefs(str, st[r0 -- mkfs(class0, ty1, fieldvar0) '] .refval ' + refs0 + r ', ty0, st), mkfs(class, ty0, fieldvar) ' ∈ instfields(st[r0 -- _type] .type .class), st[r0 -- _type] .type ≤ ty, is_obj(str, r0, st), ∀ str0, ty2, st0, r2. validrefs(str0, st[r0 -- mkfs(class0, ty1, fieldvar0) '] .refval ' + refs0, ty2, st0) ∧ validrefs(str0, (st[r0 -- mkfs(class0, ty1, fieldvar0) '] .refval ' + refs0) + r2 ', ty2, st0) → has_reffield((st[r0 -- mkfs(class0, ty1, fieldvar0) '] .refval ' + refs0) .last, st0) ⊦ r0 = jvmref, has_reffield((st[r0 -- mkfs(class0, ty1, fieldvar0) '] .refval ' + refs0) .last, st)
[[CONCRETESIMPRULES : ([CSIMPSEQ : ⊦ is_referencevalue(val) → refval(val .refval) = val], [CSIMPFORWARD : ⊦ refs + r ' = refs0 → r ∈ refs0], [CSIMPSEQ : ⊦ r ∈ r0 ' ↔ r = r0], [CSIMPSEQ : ⊦ r ∈ refs + refs0 ↔ ¬ ¬ (r ∈ refs ∨ r ∈ refs0)], [CSIMPSEQ : ⊦ r ' + refs ≠ []], [CSIMPSEQ : ⊦ (refs + refs0) + refs1 = refs + refs0 + refs1], [CSIMPSEQ : ⊦ r ' + refs = r0 ' + refs0 ↔ r = r0 ∧ refs = refs0], [CSIMPSEQ : ⊦ r + refs = r ' + refs])]]