| is_predefined_class(class), class ≤ `java.lang.Throwable' .class, newref(r, st) ⊦ r = jvmref, validmode(str, throw(r, mkclasstype(class)), addobj(r, class, [], st)[_mode, throw(r, mkclasstype(class))]) |
⊦ validmode(str, val, st) ↔ val = noval ∨ is_break_mode(val) ∨ val = return(noval, void_type) ∨ is_return_mode(val) ∧ validref(str, val .refval, val .type, st) ∨ is_throw_mode(val) ∧ val .refval ≠ jvmref ∧ validref(str, val .refval, val .type, st) ∧ val .type ≤ mkclasstype(`java.lang.Throwable' .class)
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)
[[CONCRETESIMPRULES : ()], [EXTRATERMS : (addobj(r, class, [], st) [_mode, throw(r, mkclasstype(class)) ], throw(r, mkclasstype(class)), str)]]