| is_predefined_class(class), class ≤ `java.lang.Throwable' .class, newref(r, st) ⊦ r = jvmref, throw(r, mkclasstype(class)) = noval ∨ is_break_mode(throw(r, mkclasstype(class))) ∨ throw(r, mkclasstype(class)) = return(noval, void_type) ∨ is_return_mode(throw(r, mkclasstype(class))) ∧ validref (str, throw(r, mkclasstype(class)) .refval, throw(r, mkclasstype(class)) .type, addobj(r, class, [], st)[_mode, throw(r, mkclasstype(class))]) ∨ is_throw_mode(throw(r, mkclasstype(class))) ∧ throw(r, mkclasstype(class)) .refval ≠ jvmref ∧ validref (str, throw(r, mkclasstype(class)) .refval, throw(r, mkclasstype(class)) .type, addobj(r, class, [], st)[_mode, throw(r, mkclasstype(class))]) ∧ throw(r, mkclasstype(class)) .type ≤ mkclasstype(`java.lang.Throwable' .class) |
⊦ validref(str, r, ty, st[_mode, val]) ↔ validref(str, r, ty, st)
is_predefined_class(class), class ≤ `java.lang.Throwable' .class, newref(r, st) ⊦ r = jvmref, validref(str, r, mkclasstype(class), addobj(r, class, [], st))
[[CONCRETESIMPRULES : ([CSIMPSEQ : ⊦ mkclasstype(class1) ≤ mkclasstype(class2) ↔ class1 ≤ class2], [CSIMPSEQ : ⊦ throw(r, ty) .type = ty], [CSIMPSEQ : ⊦ throw(r, ty) .refval = r], [CSIMPSEQ : ⊦ is_throw_mode(throw(r, ty))], [CSIMPSEQ : ⊦ ¬ is_return_mode(throw(r, ty))], [CSIMPSEQ : ⊦ ¬ is_break_mode(throw(r, ty))], [CSIMPSEQ : ⊦ return(val, ty) ≠ throw(r, ty0)], [CSIMPSEQ : ⊦ noval ≠ throw(r, ty)])]]