| newref(r, st), _mode ∈ st ⊦ r = jvmref, is_return_mode(st[_mode]) ∧ validref(str, st[_mode] .refval, st[_mode] .type, addobj(r, class, fis, st)) ∨ is_throw_mode(st[_mode]) ∧ st[_mode] .refval ≠ jvmref ∧ validref(str, st[_mode] .refval, st[_mode] .type, addobj(r, class, fis, st)) ∧ st[_mode] .type ≤ mkclasstype(`java.lang.Throwable' .class) ↔ is_return_mode(st[_mode]) ∧ validref(str, st[_mode] .refval, st[_mode] .type, st) ∨ is_throw_mode(st[_mode]) ∧ st[_mode] .refval ≠ jvmref ∧ validref(str, st[_mode] .refval, st[_mode] .type, st) ∧ st[_mode] .type ≤ mkclasstype(`java.lang.Throwable' .class), st[_mode] = return(noval, void_type), st[_mode] = noval, is_break_mode(st[_mode]) |
⊦ validref(str, jvmref, ty, st)
[[CONCRETESIMPRULES : ([CSIMPSEQ : ⊦ ¬ is_referencevalue(val) → val .refval = jvmref], [CSIMPSEQ : ⊦ refval(r) ≠ noval], [CSIMPSEQ : ⊦ refval(r) ≠ return(val, ty)], [CSIMPSEQ : ⊦ ¬ is_return_mode(refval(r))], [CSIMPSEQ : ⊦ ¬ is_throw_mode(refval(r))], [CSIMPELIM : is_referencevalue(val) ⊦ r = val .refval ↔ val = refval(r)])], [EXTRATERMS : (st[_mode], r0)]]