| jvmref -- mkfs(class, ty, fieldvar) ' = r -- sk, is_fskey(sk), okval(val, sk .fs .type), mkfs(class, ty, fieldvar) ' ∈ statfields(class), tdname∃(str, class), initdone(class, st[r -- sk, val]), initdone(class, st) → validfield(str, jvmref, mkfs(class, ty, fieldvar) ', st) ⊦ sk = _length, sk .fs .type = void_type, ty = void_type, is_referencevalue(val), (is_reftype(ty) → validrefval(str, st[r -- sk, val][jvmref -- mkfs(class, ty, fieldvar) '], ty, st[r -- sk, val])) ∧ type∃(str, ty) ∧ goodfieldandtype(jvmref, mkfs(class, ty, fieldvar) ', st[r -- sk, val]) |
⊦ validrefval(str, val, ty, st[jvmref -- sk, val0]) ↔ validrefval(str, val, ty, st)
initdone(class, st), tdname∃(str, class), mkfs(class, ty, fieldvar) ' ∈ statfields(class), okval(val, ty), validfield(str, jvmref, mkfs(class, ty, fieldvar) ', st) ⊦ mkfs(class, ty, fieldvar) ' = _length, ty = void_type, is_referencevalue(val), (is_reftype(ty) → validrefval(str, val, ty, st)) ∧ type∃(str, ty) ∧ goodfieldandtype(jvmref, mkfs(class, ty, fieldvar) ', st[jvmref -- mkfs(class, ty, fieldvar) ', val])
[[CONCRETESIMPRULES : ([CSIMPSEQ : ⊦ (st[rk, val][rk]) = val], [CSIMPSEQ : ⊦ is_fskey(fs ')], [CSIMPSEQ : ⊦ ty ≠ void_type → ( initdone (class1, st[ jvmref -- mkfs (class, ty, fieldvar) ', val]) ↔ initdone(class1, st))], [CSIMPSEQ : ⊦ mkfs(class, ty, fieldvar) .type = ty], [CSIMPSEQ : ⊦ fs ' .fs = fs], [CSIMPSEQ : ⊦ r -- sk = r0 -- sk0 ↔ r = r0 ∧ sk = sk0])]]