(* full reduction rule *) inductive reduce :: "[s, v list, e list, nat, s, v list, e list] ==> bool" (‹(_;_;_)↝'_ _ (_;_;_)›60) where
― ‹‹lifting basic reduction››
basic:"(e)↝(e')==>(s;vs;e)↝_i (s;vs;e')"
― ‹‹call››
| call:"(s;vs;[$(Call j)])↝_i (s;vs;[Callcl (sfunc s i j)])"
― ‹‹call_indirect››
| call_indirect_Some:"[stab s i (nat_of_int c) = Some cl; stypes s i j = tf; cl_type cl = tf]==>(s;vs;[$C (ConstInt32 c), $(Call_indirect j)])↝_i (s;vs;[Callcl cl])"
| call_indirect_None:"[(stab s i (nat_of_int c) = Some cl ∧ stypes s i j ≠ cl_type cl) ∨ stab s i (nat_of_int c) = None]==>(s;vs;[$C (ConstInt32 c), $(Call_indirect j)])↝_i (s;vs;[Trap])"
― ‹‹call››
| callcl_native:"[cl = Func_native j (t1s _> t2s) ts es; ves = ($$* vcs); length vcs = n; length ts = k; length t1s = n; length t2s = m; (n_zeros ts = zs) ]==>(s;vs;ves @ [Callcl cl])↝_i (s;vs;[Local m j (vcs@zs) [$(Block ([] _> t2s) es)]])"
| callcl_host_Some:"[cl = Func_host (t1s _> t2s) f; ves = ($$* vcs); length vcs = n; length t1s = n; length t2s = m; host_apply s (t1s _> t2s) f vcs hs = Some (s', vcs')]==>(s;vs;ves @ [Callcl cl])↝_i (s';vs;($$* vcs'))"
| callcl_host_None:"[cl = Func_host (t1s _> t2s) f; ves = ($$* vcs); length vcs = n; length t1s = n; length t2s = m]==>(s;vs;ves @ [Callcl cl])↝_i (s;vs;[Trap])"
― ‹‹get_local››
| get_local:"[length vi = j]==>(s;(vi @ [v] @ vs);[$(Get_local j)])↝_i (s;(vi @ [v] @ vs);[$(C v)])"
― ‹‹set_local››
| set_local:"[length vi = j]==>(s;(vi @ [v] @ vs);[$(C v'), $(Set_local j)])↝_i (s;(vi @ [v'] @ vs);[])"
― ‹‹get_global››
| get_global:"(s;vs;[$(Get_global j)])↝_i (s;vs;[$ C(sglob_val s i j)])"
― ‹‹set_global››
| set_global:"supdate_glob s i j v = s' ==>(s;vs;[$(C v), $(Set_global j)])↝_i (s';vs;[])"
― ‹‹load››
| load_Some:"[smem_ind s i = Some j; ((mem s)!j) = m; load m (nat_of_int k) off (t_length t) = Some bs]==>(s;vs;[$C (ConstInt32 k), $(Load t None a off)])↝_i (s;vs;[$C (wasm_deserialise bs t)])"
| load_None:"[smem_ind s i = Some j; ((mem s)!j) = m; load m (nat_of_int k) off (t_length t) = None]==>(s;vs;[$C (ConstInt32 k), $(Load t None a off)])↝_i (s;vs;[Trap])"
― ‹‹load packed››
| load_packed_Some:"[smem_ind s i = Some j; ((mem s)!j) = m; load_packed sx m (nat_of_int k) off (tp_length tp) (t_length t) = Some bs]==>(s;vs;[$C (ConstInt32 k), $(Load t (Some (tp, sx)) a off)])↝_i (s;vs;[$C (wasm_deserialise bs t)])"
| load_packed_None:"[smem_ind s i = Some j; ((mem s)!j) = m; load_packed sx m (nat_of_int k) off (tp_length tp) (t_length t) = None]==>(s;vs;[$C (ConstInt32 k), $(Load t (Some (tp, sx)) a off)])↝_i (s;vs;[Trap])"
― ‹‹store››
| store_Some:"[types_agree t v; smem_ind s i = Some j; ((mem s)!j) = m; store m (nat_of_int k) off (bits v) (t_length t) = Some mem']==>(s;vs;[$C (ConstInt32 k), $C v, $(Store t None a off)])↝_i (s(mem:= ((mem s)[j := mem']));vs;[])"
| store_None:"[types_agree t v; smem_ind s i = Some j; ((mem s)!j) = m; store m (nat_of_int k) off (bits v) (t_length t) = None]==>(s;vs;[$C (ConstInt32 k), $C v, $(Store t None a off)])↝_i (s;vs;[Trap])"
― ‹‹store packed›› (* take only (tp_length tp) lower order bytes *)
| store_packed_Some:"[types_agree t v; smem_ind s i = Some j; ((mem s)!j) = m; store_packed m (nat_of_int k) off (bits v) (tp_length tp) = Some mem']==>(s;vs;[$C (ConstInt32 k), $C v, $(Store t (Some tp) a off)])↝_i (s(mem:= ((mem s)[j := mem']));vs;[])"
| store_packed_None:"[types_agree t v; smem_ind s i = Some j; ((mem s)!j) = m; store_packed m (nat_of_int k) off (bits v) (tp_length tp) = None]==>(s;vs;[$C (ConstInt32 k), $C v, $(Store t (Some tp) a off)])↝_i (s;vs;[Trap])"
― ‹‹current_memory››
| current_memory:"[smem_ind s i = Some j; ((mem s)!j) = m; mem_size m = n]==>(s;vs;[ $(Current_memory)])↝_i (s;vs;[$C (ConstInt32 (int_of_nat n))])"
― ‹‹grow_memory››
| grow_memory:"[smem_ind s i = Some j; ((mem s)!j) = m; mem_size m = n; mem_grow m (nat_of_int c) = mem']==>(s;vs;[$C (ConstInt32 c), $(Grow_memory)])↝_i (s(mem:= ((mem s)[j := mem']));vs;[$C (ConstInt32 (int_of_nat n))])"
― ‹‹grow_memory fail››
| grow_memory_fail:"[smem_ind s i = Some j; ((mem s)!j) = m; mem_size m = n]==>(s;vs;[$C (ConstInt32 c),$(Grow_memory)])↝_i (s;vs;[$C (ConstInt32 int32_minus_one)])" (* The bad ones. *)
― ‹‹inductive label reduction››
| label:"[(s;vs;es)↝_i (s';vs';es'); Lfilled k lholed es les; Lfilled k lholed es' les']==>(s;vs;les)↝_i (s';vs';les')"
― ‹‹inductive local reduction››
| local:"[(s;vs;es)↝_i (s';vs';es')]==>(s;v0s;[Local n i vs es])↝_j (s';v0s;[Local n i vs' es'])"
end
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.28 Sekunden
(vorverarbeitet am 2026-06-10)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.