From c7edbd05b5ceb20a8fbe6d1345cf157762ae3c74 Mon Sep 17 00:00:00 2001 From: Andreas Rossberg Date: Tue, 2 Dec 2025 12:45:26 +0100 Subject: [PATCH 1/5] [spectec] Make definition of state access nicer --- .../4.0-execution.configurations.spectec | 50 +++++++++-------- spectec/test-frontend/TEST.md | 54 +++++++++++-------- 2 files changed, 60 insertions(+), 44 deletions(-) diff --git a/specification/wasm-3.0/4.0-execution.configurations.spectec b/specification/wasm-3.0/4.0-execution.configurations.spectec index c8e06e0859..b488130cdc 100644 --- a/specification/wasm-3.0/4.0-execution.configurations.spectec +++ b/specification/wasm-3.0/4.0-execution.configurations.spectec @@ -263,15 +263,21 @@ def $data(state, dataidx) : datainst hint(show %.DATAS[%]) hint(macro " def $elem(state, tableidx) : eleminst hint(show %.ELEMS[%]) hint(macro "Z%") def $local(state, localidx) : val? hint(show %.LOCALS[%]) hint(macro "Z%") -def $type((s; f), x) = f.MODULE.TYPES[x] -def $tag((s; f), x) = s.TAGS[f.MODULE.TAGS[x]] -def $global((s; f), x) = s.GLOBALS[f.MODULE.GLOBALS[x]] -def $mem((s; f), x) = s.MEMS[f.MODULE.MEMS[x]] -def $table((s; f), x) = s.TABLES[f.MODULE.TABLES[x]] -def $func((s; f), x) = s.FUNCS[f.MODULE.FUNCS[x]] -def $data((s; f), x) = s.DATAS[f.MODULE.DATAS[x]] -def $elem((s; f), x) = s.ELEMS[f.MODULE.ELEMS[x]] -def $local((s; f), x) = f.LOCALS[x] +def $sof(state) : store hint(show s) +def $fof(state) : frame hint(show f) + +def $sof(z) = $store(z) +def $fof(z) = $frame(z) + +def $type(z, x) = $fof(z).MODULE.TYPES[x] +def $tag(z, x) = $sof(z).TAGS[$fof(z).MODULE.TAGS[x]] +def $global(z, x) = $sof(z).GLOBALS[$fof(z).MODULE.GLOBALS[x]] +def $mem(z, x) = $sof(z).MEMS[$fof(z).MODULE.MEMS[x]] +def $table(z, x) = $sof(z).TABLES[$fof(z).MODULE.TABLES[x]] +def $func(z, x) = $sof(z).FUNCS[$fof(z).MODULE.FUNCS[x]] +def $data(z, x) = $sof(z).DATAS[$fof(z).MODULE.DATAS[x]] +def $elem(z, x) = $sof(z).ELEMS[$fof(z).MODULE.ELEMS[x]] +def $local(z, x) = $fof(z).LOCALS[x] ;; State update @@ -287,25 +293,25 @@ def $with_data(state, dataidx, byte*) : state hint(show %[.DATAS[% def $with_struct(state, structaddr, nat, fieldval) : state hint(show %[.STRUCTS[%].FIELDS[%] = %]) hint(macro "ZS%") hint(prose "Replace" $structinst(%1)[%2].FIELDS[%3] "with" %4) def $with_array(state, arrayaddr, nat, fieldval) : state hint(show %[.ARRAYS[%].FIELDS[%] = %]) hint(macro "ZA%") hint(prose "Replace" $arrayinst(%1)[%2].FIELDS[%3] "with" %4) -def $with_local((s; f), x, v) = s; f[.LOCALS[x] = v] -def $with_global((s; f), x, v) = s[.GLOBALS[f.MODULE.GLOBALS[x]].VALUE = v]; f -def $with_table((s; f), x, i, r) = s[.TABLES[f.MODULE.TABLES[x]].REFS[i] = r]; f -def $with_tableinst((s; f), x, ti) = s[.TABLES[f.MODULE.TABLES[x]] = ti]; f -def $with_mem((s; f), x, i, j, b*) = s[.MEMS[f.MODULE.MEMS[x]].BYTES[i : j] = b*]; f -def $with_meminst((s; f), x, mi) = s[.MEMS[f.MODULE.MEMS[x]] = mi]; f -def $with_elem((s; f), x, r*) = s[.ELEMS[f.MODULE.ELEMS[x]].REFS = r*]; f -def $with_data((s; f), x, b*) = s[.DATAS[f.MODULE.DATAS[x]].BYTES = b*]; f -def $with_struct((s; f), a, i, fv) = s[.STRUCTS[a].FIELDS[i] = fv]; f -def $with_array((s; f), a, i, fv) = s[.ARRAYS[a].FIELDS[i] = fv]; f +def $with_local(z, x, v) = $sof(z); $fof(z)[.LOCALS[x] = v] +def $with_global(z, x, v) = $sof(z)[.GLOBALS[$fof(z).MODULE.GLOBALS[x]].VALUE = v]; $fof(z) +def $with_table(z, x, i, r) = $sof(z)[.TABLES[$fof(z).MODULE.TABLES[x]].REFS[i] = r]; $fof(z) +def $with_tableinst(z, x, ti) = $sof(z)[.TABLES[$fof(z).MODULE.TABLES[x]] = ti]; $fof(z) +def $with_mem(z, x, i, j, b*) = $sof(z)[.MEMS[$fof(z).MODULE.MEMS[x]].BYTES[i : j] = b*]; $fof(z) +def $with_meminst(z, x, mi) = $sof(z)[.MEMS[$fof(z).MODULE.MEMS[x]] = mi]; $fof(z) +def $with_elem(z, x, r*) = $sof(z)[.ELEMS[$fof(z).MODULE.ELEMS[x]].REFS = r*]; $fof(z) +def $with_data(z, x, b*) = $sof(z)[.DATAS[$fof(z).MODULE.DATAS[x]].BYTES = b*]; $fof(z) +def $with_struct(z, a, i, fv) = $sof(z)[.STRUCTS[a].FIELDS[i] = fv]; $fof(z) +def $with_array(z, a, i, fv) = $sof(z)[.ARRAYS[a].FIELDS[i] = fv]; $fof(z) def $add_structinst(state, structinst*) : state hint(show %[.STRUCTS =++ %]) hint(macro "Z%") hint(prose "Append" %2 "to" $structinst(%1)) def $add_arrayinst(state, arrayinst*) : state hint(show %[.ARRAYS =++ %]) hint(macro "Z%") hint(prose "Append" %2 "to" $arrayinst(%1)) def $add_exninst(state, exninst*) : state hint(show %[.EXNS =++ %]) hint(macro "Z%") hint(prose "Append" %2 "to" $exninst(%1)) -def $add_structinst((s; f), si*) = s[.STRUCTS =++ si*]; f -def $add_arrayinst((s; f), ai*) = s[.ARRAYS =++ ai*]; f -def $add_exninst((s; f), exn*) = s[.EXNS =++ exn*]; f +def $add_structinst(z, si*) = $sof(z)[.STRUCTS =++ si*]; $fof(z) +def $add_arrayinst(z, ai*) = $sof(z)[.ARRAYS =++ ai*]; $fof(z) +def $add_exninst(z, exn*) = $sof(z)[.EXNS =++ exn*]; $fof(z) ;; Growing diff --git a/spectec/test-frontend/TEST.md b/spectec/test-frontend/TEST.md index 1daf35ebd3..932b76e582 100644 --- a/spectec/test-frontend/TEST.md +++ b/spectec/test-frontend/TEST.md @@ -5670,115 +5670,125 @@ def $exninst(state : state) : exninst* ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec def $exninst{s : store, f : frame}(`%;%`_state(s, f)) = s.EXNS_store +;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec +def $fof(state : state) : frame + ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec + def $fof{z : state}(z) = $frame(z) + ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec def $type(state : state, typeidx : typeidx) : deftype ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec - def $type{s : store, f : frame, x : idx}(`%;%`_state(s, f), x) = f.MODULE_frame.TYPES_moduleinst[x!`%`_idx.0] + def $type{z : state, x : idx}(z, x) = $fof(z).MODULE_frame.TYPES_moduleinst[x!`%`_idx.0] + +;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec +def $sof(state : state) : store + ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec + def $sof{z : state}(z) = $store(z) ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec def $tag(state : state, tagidx : tagidx) : taginst ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec - def $tag{s : store, f : frame, x : idx}(`%;%`_state(s, f), x) = s.TAGS_store[f.MODULE_frame.TAGS_moduleinst[x!`%`_idx.0]] + def $tag{z : state, x : idx}(z, x) = $sof(z).TAGS_store[$fof(z).MODULE_frame.TAGS_moduleinst[x!`%`_idx.0]] ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec def $global(state : state, globalidx : globalidx) : globalinst ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec - def $global{s : store, f : frame, x : idx}(`%;%`_state(s, f), x) = s.GLOBALS_store[f.MODULE_frame.GLOBALS_moduleinst[x!`%`_idx.0]] + def $global{z : state, x : idx}(z, x) = $sof(z).GLOBALS_store[$fof(z).MODULE_frame.GLOBALS_moduleinst[x!`%`_idx.0]] ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec def $mem(state : state, memidx : memidx) : meminst ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec - def $mem{s : store, f : frame, x : idx}(`%;%`_state(s, f), x) = s.MEMS_store[f.MODULE_frame.MEMS_moduleinst[x!`%`_idx.0]] + def $mem{z : state, x : idx}(z, x) = $sof(z).MEMS_store[$fof(z).MODULE_frame.MEMS_moduleinst[x!`%`_idx.0]] ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec def $table(state : state, tableidx : tableidx) : tableinst ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec - def $table{s : store, f : frame, x : idx}(`%;%`_state(s, f), x) = s.TABLES_store[f.MODULE_frame.TABLES_moduleinst[x!`%`_idx.0]] + def $table{z : state, x : idx}(z, x) = $sof(z).TABLES_store[$fof(z).MODULE_frame.TABLES_moduleinst[x!`%`_idx.0]] ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec def $func(state : state, funcidx : funcidx) : funcinst ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec - def $func{s : store, f : frame, x : idx}(`%;%`_state(s, f), x) = s.FUNCS_store[f.MODULE_frame.FUNCS_moduleinst[x!`%`_idx.0]] + def $func{z : state, x : idx}(z, x) = $sof(z).FUNCS_store[$fof(z).MODULE_frame.FUNCS_moduleinst[x!`%`_idx.0]] ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec def $data(state : state, dataidx : dataidx) : datainst ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec - def $data{s : store, f : frame, x : idx}(`%;%`_state(s, f), x) = s.DATAS_store[f.MODULE_frame.DATAS_moduleinst[x!`%`_idx.0]] + def $data{z : state, x : idx}(z, x) = $sof(z).DATAS_store[$fof(z).MODULE_frame.DATAS_moduleinst[x!`%`_idx.0]] ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec def $elem(state : state, tableidx : tableidx) : eleminst ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec - def $elem{s : store, f : frame, x : idx}(`%;%`_state(s, f), x) = s.ELEMS_store[f.MODULE_frame.ELEMS_moduleinst[x!`%`_idx.0]] + def $elem{z : state, x : idx}(z, x) = $sof(z).ELEMS_store[$fof(z).MODULE_frame.ELEMS_moduleinst[x!`%`_idx.0]] ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec def $local(state : state, localidx : localidx) : val? ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec - def $local{s : store, f : frame, x : idx}(`%;%`_state(s, f), x) = f.LOCALS_frame[x!`%`_idx.0] + def $local{z : state, x : idx}(z, x) = $fof(z).LOCALS_frame[x!`%`_idx.0] ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec def $with_local(state : state, localidx : localidx, val : val) : state ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec - def $with_local{s : store, f : frame, x : idx, v : val}(`%;%`_state(s, f), x, v) = `%;%`_state(s, f[LOCALS_frame[x!`%`_idx.0] = ?(v)]) + def $with_local{z : state, x : idx, v : val}(z, x, v) = `%;%`_state($sof(z), $fof(z)[LOCALS_frame[x!`%`_idx.0] = ?(v)]) ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec def $with_global(state : state, globalidx : globalidx, val : val) : state ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec - def $with_global{s : store, f : frame, x : idx, v : val}(`%;%`_state(s, f), x, v) = `%;%`_state(s[GLOBALS_store[f.MODULE_frame.GLOBALS_moduleinst[x!`%`_idx.0]].VALUE_globalinst = v], f) + def $with_global{z : state, x : idx, v : val}(z, x, v) = `%;%`_state($sof(z)[GLOBALS_store[$fof(z).MODULE_frame.GLOBALS_moduleinst[x!`%`_idx.0]].VALUE_globalinst = v], $fof(z)) ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec def $with_table(state : state, tableidx : tableidx, nat : nat, ref : ref) : state ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec - def $with_table{s : store, f : frame, x : idx, i : nat, r : ref}(`%;%`_state(s, f), x, i, r) = `%;%`_state(s[TABLES_store[f.MODULE_frame.TABLES_moduleinst[x!`%`_idx.0]].REFS_tableinst[i] = r], f) + def $with_table{z : state, x : idx, i : nat, r : ref}(z, x, i, r) = `%;%`_state($sof(z)[TABLES_store[$fof(z).MODULE_frame.TABLES_moduleinst[x!`%`_idx.0]].REFS_tableinst[i] = r], $fof(z)) ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec def $with_tableinst(state : state, tableidx : tableidx, tableinst : tableinst) : state ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec - def $with_tableinst{s : store, f : frame, x : idx, ti : tableinst}(`%;%`_state(s, f), x, ti) = `%;%`_state(s[TABLES_store[f.MODULE_frame.TABLES_moduleinst[x!`%`_idx.0]] = ti], f) + def $with_tableinst{z : state, x : idx, ti : tableinst}(z, x, ti) = `%;%`_state($sof(z)[TABLES_store[$fof(z).MODULE_frame.TABLES_moduleinst[x!`%`_idx.0]] = ti], $fof(z)) ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec def $with_mem(state : state, memidx : memidx, nat : nat, nat : nat, byte*) : state ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec - def $with_mem{s : store, f : frame, x : idx, i : nat, j : nat, `b*` : byte*}(`%;%`_state(s, f), x, i, j, b*{b <- `b*`}) = `%;%`_state(s[MEMS_store[f.MODULE_frame.MEMS_moduleinst[x!`%`_idx.0]].BYTES_meminst[i : j] = b*{b <- `b*`}], f) + def $with_mem{z : state, x : idx, i : nat, j : nat, `b*` : byte*}(z, x, i, j, b*{b <- `b*`}) = `%;%`_state($sof(z)[MEMS_store[$fof(z).MODULE_frame.MEMS_moduleinst[x!`%`_idx.0]].BYTES_meminst[i : j] = b*{b <- `b*`}], $fof(z)) ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec def $with_meminst(state : state, memidx : memidx, meminst : meminst) : state ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec - def $with_meminst{s : store, f : frame, x : idx, mi : meminst}(`%;%`_state(s, f), x, mi) = `%;%`_state(s[MEMS_store[f.MODULE_frame.MEMS_moduleinst[x!`%`_idx.0]] = mi], f) + def $with_meminst{z : state, x : idx, mi : meminst}(z, x, mi) = `%;%`_state($sof(z)[MEMS_store[$fof(z).MODULE_frame.MEMS_moduleinst[x!`%`_idx.0]] = mi], $fof(z)) ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec def $with_elem(state : state, elemidx : elemidx, ref*) : state ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec - def $with_elem{s : store, f : frame, x : idx, `r*` : ref*}(`%;%`_state(s, f), x, r*{r <- `r*`}) = `%;%`_state(s[ELEMS_store[f.MODULE_frame.ELEMS_moduleinst[x!`%`_idx.0]].REFS_eleminst = r*{r <- `r*`}], f) + def $with_elem{z : state, x : idx, `r*` : ref*}(z, x, r*{r <- `r*`}) = `%;%`_state($sof(z)[ELEMS_store[$fof(z).MODULE_frame.ELEMS_moduleinst[x!`%`_idx.0]].REFS_eleminst = r*{r <- `r*`}], $fof(z)) ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec def $with_data(state : state, dataidx : dataidx, byte*) : state ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec - def $with_data{s : store, f : frame, x : idx, `b*` : byte*}(`%;%`_state(s, f), x, b*{b <- `b*`}) = `%;%`_state(s[DATAS_store[f.MODULE_frame.DATAS_moduleinst[x!`%`_idx.0]].BYTES_datainst = b*{b <- `b*`}], f) + def $with_data{z : state, x : idx, `b*` : byte*}(z, x, b*{b <- `b*`}) = `%;%`_state($sof(z)[DATAS_store[$fof(z).MODULE_frame.DATAS_moduleinst[x!`%`_idx.0]].BYTES_datainst = b*{b <- `b*`}], $fof(z)) ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec def $with_struct(state : state, structaddr : structaddr, nat : nat, fieldval : fieldval) : state ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec - def $with_struct{s : store, f : frame, a : addr, i : nat, fv : fieldval}(`%;%`_state(s, f), a, i, fv) = `%;%`_state(s[STRUCTS_store[a].FIELDS_structinst[i] = fv], f) + def $with_struct{z : state, a : addr, i : nat, fv : fieldval}(z, a, i, fv) = `%;%`_state($sof(z)[STRUCTS_store[a].FIELDS_structinst[i] = fv], $fof(z)) ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec def $with_array(state : state, arrayaddr : arrayaddr, nat : nat, fieldval : fieldval) : state ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec - def $with_array{s : store, f : frame, a : addr, i : nat, fv : fieldval}(`%;%`_state(s, f), a, i, fv) = `%;%`_state(s[ARRAYS_store[a].FIELDS_arrayinst[i] = fv], f) + def $with_array{z : state, a : addr, i : nat, fv : fieldval}(z, a, i, fv) = `%;%`_state($sof(z)[ARRAYS_store[a].FIELDS_arrayinst[i] = fv], $fof(z)) ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec def $add_structinst(state : state, structinst*) : state ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec - def $add_structinst{s : store, f : frame, `si*` : structinst*}(`%;%`_state(s, f), si*{si <- `si*`}) = `%;%`_state(s[STRUCTS_store =++ si*{si <- `si*`}], f) + def $add_structinst{z : state, `si*` : structinst*}(z, si*{si <- `si*`}) = `%;%`_state($sof(z)[STRUCTS_store =++ si*{si <- `si*`}], $fof(z)) ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec def $add_arrayinst(state : state, arrayinst*) : state ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec - def $add_arrayinst{s : store, f : frame, `ai*` : arrayinst*}(`%;%`_state(s, f), ai*{ai <- `ai*`}) = `%;%`_state(s[ARRAYS_store =++ ai*{ai <- `ai*`}], f) + def $add_arrayinst{z : state, `ai*` : arrayinst*}(z, ai*{ai <- `ai*`}) = `%;%`_state($sof(z)[ARRAYS_store =++ ai*{ai <- `ai*`}], $fof(z)) ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec def $add_exninst(state : state, exninst*) : state ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec - def $add_exninst{s : store, f : frame, `exn*` : exninst*}(`%;%`_state(s, f), exn*{exn <- `exn*`}) = `%;%`_state(s[EXNS_store =++ exn*{exn <- `exn*`}], f) + def $add_exninst{z : state, `exn*` : exninst*}(z, exn*{exn <- `exn*`}) = `%;%`_state($sof(z)[EXNS_store =++ exn*{exn <- `exn*`}], $fof(z)) ;; ../../../../specification/wasm-3.0/4.0-execution.configurations.spectec def $growtable(tableinst : tableinst, nat : nat, ref : ref) : tableinst From 87835a20e0c91325fc8bab0c7bd39ff8a158e09a Mon Sep 17 00:00:00 2001 From: DJ Date: Tue, 24 Mar 2026 15:54:54 +0900 Subject: [PATCH 2/5] HARDCODE: Handle the function '$store' --- spectec/src/backend-interpreter/interpreter.ml | 4 ++++ spectec/src/il2al/transpile.ml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/spectec/src/backend-interpreter/interpreter.ml b/spectec/src/backend-interpreter/interpreter.ml index 4cedf25b7e..9f8530c7c7 100644 --- a/spectec/src/backend-interpreter/interpreter.ml +++ b/spectec/src/backend-interpreter/interpreter.ml @@ -357,6 +357,7 @@ and eval_expr env expr = fail_expr expr (sprintf "cannot choose an element from %s because it's empty" (string_of_expr e)) else Array.get a 0 + (* HARDCODE: The variable s is always assumed to be the implicit store *) | VarE "s" -> Store.get () | VarE name -> lookup_env name env (* Optimized getter for simple IterE(VarE, ...) *) @@ -793,6 +794,9 @@ and create_context (name: string) (args: value list) : AlContext.mode = AlContext.al (name, params, body, env, 0) and call_func (name: string) (args: value list) : value option = + (* HARDCODE: Calling the function named `store` is always implicitly assumed to be the getting the global store, as if the variable named `s`. *) + if name = "store" then Some (Store.get ()) else + let builtin_name, is_builtin = match find_hint name "builtin" with | None -> name, false diff --git a/spectec/src/il2al/transpile.ml b/spectec/src/il2al/transpile.ml index 94a2ec01cf..939c42a970 100644 --- a/spectec/src/il2al/transpile.ml +++ b/spectec/src/il2al/transpile.ml @@ -1007,7 +1007,7 @@ let hide_state instr = let access = { (mk_access ps s) with note } in [ appendI (access, e) ~at:at ] (* Return *) - | ReturnI (Some e) when is_state e || is_store e -> [ returnI None ~at:at ] + | ReturnI (Some ({it = VarE _; _} as e)) when is_state e || is_store e -> [ returnI None ~at:at ] | _ -> [ instr ] let remove_state algo = From d2d389513bef1c2e101b2a2caae87a84351c7ce9 Mon Sep 17 00:00:00 2001 From: Andreas Rossberg Date: Tue, 24 Mar 2026 09:04:32 +0100 Subject: [PATCH 3/5] Test expects --- spectec/doc/example/output/NanoWasm.pdf | Bin 245508 -> 245508 bytes spectec/test-prose/TEST.md | 196 +++++++++++++----------- 2 files changed, 108 insertions(+), 88 deletions(-) diff --git a/spectec/doc/example/output/NanoWasm.pdf b/spectec/doc/example/output/NanoWasm.pdf index 772ae3066b88f42380fa55b8f7d7e336f5b6faa4..161ba4ab00ef5df300ebddc78b3518f236f9946f 100644 GIT binary patch delta 1101 zcmZqq$Jg?YZ-c22laayX1I(KBspoyO4;%2XJ=k4;w0cWoq3X@PNv{*6Ma(2j-(2{b za4APy=k30P`g+e`jWz0fg)T8G?P)4Ve-Z!J#3qc%nKf#1|D+4NX?qoOj{g*Ta(mmc z_l4OGK5txK8}3g|mDAtzI!A1~qQj!=ZjwJ)m0k&JPdRFQ^+fcVx6P|9Zf>%-*%|Gy zt%iS{Q0|*oi{F=>7fA}QD{J3-`^nRZ$zKm?`pLLU7P}msRg>WtSNHn7Q<>Mc_strsP0)Gqj3cU?Ytdqdc+I;+1bxeH`VcBrnu6dq_WY0;0s zu1)K!G-LCoM%FL&dzNP$p1+X2WOwM<7kTm)Our5W8Zh)VK7PPr!RgoNSRlpIX#7CO zg8f``VgX|e)83bt@4d(rckJ6MabWrm)^)|nJUu%?>n}YBG~m?RebpwwoKJ0r_Sv)p zQ=;GM-<`|Wop9}Kz`|XY)9$mFACQV*mwuq;EEeJK7su+I$Gf|JRyAuz_UQ!H4PJ+~ zT$phC!K~H4!Uc+=epk8kJY>PyOWs-KUZIzhYZ4x3x)N$)=01}(+S zf_fW_RSa&mZE?LeVa?tJ*WQ-+txiZk;WvlJva_?XO7W|Jo`Ft^gqJJ(1e3c9j^|oj ztlA-1nV=p95S!f zx~m@S)?Uz^lcG@Q1q!hsZ zs&SuSuLAe1hJAv%3q)UhzQAYYpnl=`!rPO}9_YWD{`1~sj9mA HyKw;k6z%CF delta 1100 zcmZqq$Jg?YZ-c22lcDA01I(KBspoyYnH_o99{m2(C6j)j*Ylb3?r_J}rlyhu&TkWM ztjj%^`rwltsPGw$YFJ3P& zOSOsaiS03pUYqbiP|E)IrO;OkYp!|wg`0AC&N{EZZ|~V>;+b_me$7_G?N-8!K+Lq= zN|^cDLM=lxLn9+YLj!FCLv;fKbxkgP-~1Gp#FA764HqjT10yp7W2lntR$G~i*aF;4 z4a^N39gR%fOw654OpRPjEDX$?3``u2E!>PP49)EnYzQie<_%}X!IP%yKcyq{UC zUUrJ5zi6OD+y3`_vlW^aG@K}!SSuXpa_8ohr%hZPiw?0a+5CxLLO44*SLNc3k4Ghh zom1DC&icXZ^MySlF*z}D(dRv9Czs!wS^R8H^*rmewEuV395PDl+*$fRaMvtDeOsTR z35=^tzAj-AX)xX8yu>Mhy;s%2(?LmAAe$KcKsT?Nfs6oo5rX�@fZ+6{Yzf4|gH_MhSvlCbi zybo=-pj>`%Q*_yUy{$7t3nqI`wBO=AO}eP&^xD6w{O*rVehyQ8(j~P0AZKjRiH)2A zswrlNSj*a2+-^_Uc0y{>R{kqHdwa6P-tgS)oUEvBXc(ZsMD7r4TPu(A$`>q?ma%`? zwe+~>q23qe(swVYUShf3FS@P%)O||>br77!_=^P{vI|&AY5S5xEWMHSWW zzqI7`W5K1~dDi|@gW~u3YWwc|D;qYeEdSpMlgD;u>rGzI+rNBDas3a^%yYH712XUZ z-R#q&{m%ZgSGeuuzpF~l8uM386|?zV>ydeJvh|&9mnNy7ubZj9TRvz{rQ+>wN6rj} zUWfY~X%kp=fmGN9wl9@080IeEe)0LjZ%k+xwUmIn20JRbBnv FxB!Ue=92&b diff --git a/spectec/test-prose/TEST.md b/spectec/test-prose/TEST.md index 484fb7d67f..78d4e988bf 100644 --- a/spectec/test-prose/TEST.md +++ b/spectec/test-prose/TEST.md @@ -25673,155 +25673,169 @@ The instruction sequence :math:`(\mathsf{block}~{\mathit{blocktype}}~{{\mathit{i 1. Return :math:`s{.}\mathsf{exns}`. -:math:`(s, f){.}\mathsf{types}{}[x]` -.................................... +:math:`f` +......... + + +1. Return :math:`z{.}\mathsf{frame}`. + + +:math:`z{.}\mathsf{types}{}[x]` +............................... 1. Return :math:`f{.}\mathsf{module}{.}\mathsf{types}{}[x]`. -:math:`(s, f){.}\mathsf{tags}{}[x]` -................................... +:math:`s` +......... + + +1. Return :math:`z{.}\mathsf{store}`. + + +:math:`z{.}\mathsf{tags}{}[x]` +.............................. 1. Return :math:`s{.}\mathsf{tags}{}[f{.}\mathsf{module}{.}\mathsf{tags}{}[x]]`. -:math:`(s, f){.}\mathsf{globals}{}[x]` -...................................... +:math:`z{.}\mathsf{globals}{}[x]` +................................. 1. Return :math:`s{.}\mathsf{globals}{}[f{.}\mathsf{module}{.}\mathsf{globals}{}[x]]`. -:math:`(s, f){.}\mathsf{mems}{}[x]` -................................... +:math:`z{.}\mathsf{mems}{}[x]` +.............................. 1. Return :math:`s{.}\mathsf{mems}{}[f{.}\mathsf{module}{.}\mathsf{mems}{}[x]]`. -:math:`(s, f){.}\mathsf{tables}{}[x]` -..................................... +:math:`z{.}\mathsf{tables}{}[x]` +................................ 1. Return :math:`s{.}\mathsf{tables}{}[f{.}\mathsf{module}{.}\mathsf{tables}{}[x]]`. -:math:`(s, f){.}\mathsf{funcs}{}[x]` -.................................... +:math:`z{.}\mathsf{funcs}{}[x]` +............................... 1. Return :math:`s{.}\mathsf{funcs}{}[f{.}\mathsf{module}{.}\mathsf{funcs}{}[x]]`. -:math:`(s, f){.}\mathsf{datas}{}[x]` -.................................... +:math:`z{.}\mathsf{datas}{}[x]` +............................... 1. Return :math:`s{.}\mathsf{datas}{}[f{.}\mathsf{module}{.}\mathsf{datas}{}[x]]`. -:math:`(s, f){.}\mathsf{elems}{}[x]` -.................................... +:math:`z{.}\mathsf{elems}{}[x]` +............................... 1. Return :math:`s{.}\mathsf{elems}{}[f{.}\mathsf{module}{.}\mathsf{elems}{}[x]]`. -:math:`(s, f){.}\mathsf{locals}{}[x]` -..................................... +:math:`z{.}\mathsf{locals}{}[x]` +................................ 1. Return :math:`f{.}\mathsf{locals}{}[x]`. -:math:`(s, f){}[{.}\mathsf{locals}{}[x] = v]` -............................................. +:math:`z{}[{.}\mathsf{locals}{}[x] = v]` +........................................ 1. Replace :math:`f{.}\mathsf{locals}{}[x]` with :math:`v`. -:math:`(s, f){}[{.}\mathsf{globals}{}[x]{.}\mathsf{value} = v]` -............................................................... +:math:`z{}[{.}\mathsf{globals}{}[x]{.}\mathsf{value} = v]` +.......................................................... 1. Replace :math:`s{.}\mathsf{globals}{}[f{.}\mathsf{module}{.}\mathsf{globals}{}[x]]{.}\mathsf{value}` with :math:`v`. -:math:`(s, f){}[{.}\mathsf{tables}{}[x]{.}\mathsf{refs}{}[i] = r]` -.................................................................. +:math:`z{}[{.}\mathsf{tables}{}[x]{.}\mathsf{refs}{}[i] = r]` +............................................................. 1. Replace :math:`s{.}\mathsf{tables}{}[f{.}\mathsf{module}{.}\mathsf{tables}{}[x]]{.}\mathsf{refs}{}[i]` with :math:`r`. -:math:`(s, f){}[{.}\mathsf{tables}{}[x] = {\mathit{ti}}]` -......................................................... +:math:`z{}[{.}\mathsf{tables}{}[x] = {\mathit{ti}}]` +.................................................... 1. Replace :math:`s{.}\mathsf{tables}{}[f{.}\mathsf{module}{.}\mathsf{tables}{}[x]]` with :math:`{\mathit{ti}}`. -:math:`(s, f){}[{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i : j] = {b^\ast}]` -............................................................................ +:math:`z{}[{.}\mathsf{mems}{}[x]{.}\mathsf{bytes}{}[i : j] = {b^\ast}]` +....................................................................... 1. Replace :math:`s{.}\mathsf{mems}{}[f{.}\mathsf{module}{.}\mathsf{mems}{}[x]]{.}\mathsf{bytes}{}[i : j]` with :math:`{b^\ast}`. -:math:`(s, f){}[{.}\mathsf{mems}{}[x] = {\mathit{mi}}]` -....................................................... +:math:`z{}[{.}\mathsf{mems}{}[x] = {\mathit{mi}}]` +.................................................. 1. Replace :math:`s{.}\mathsf{mems}{}[f{.}\mathsf{module}{.}\mathsf{mems}{}[x]]` with :math:`{\mathit{mi}}`. -:math:`(s, f){}[{.}\mathsf{elems}{}[x]{.}\mathsf{refs} = {r^\ast}]` -................................................................... +:math:`z{}[{.}\mathsf{elems}{}[x]{.}\mathsf{refs} = {r^\ast}]` +.............................................................. 1. Replace :math:`s{.}\mathsf{elems}{}[f{.}\mathsf{module}{.}\mathsf{elems}{}[x]]{.}\mathsf{refs}` with :math:`{r^\ast}`. -:math:`(s, f){}[{.}\mathsf{datas}{}[x]{.}\mathsf{bytes} = {b^\ast}]` -.................................................................... +:math:`z{}[{.}\mathsf{datas}{}[x]{.}\mathsf{bytes} = {b^\ast}]` +............................................................... 1. Replace :math:`s{.}\mathsf{datas}{}[f{.}\mathsf{module}{.}\mathsf{datas}{}[x]]{.}\mathsf{bytes}` with :math:`{b^\ast}`. -:math:`(s, f){}[{.}\mathsf{structs}{}[a]{.}\mathsf{fields}{}[i] = {\mathit{fv}}]` -................................................................................. +:math:`z{}[{.}\mathsf{structs}{}[a]{.}\mathsf{fields}{}[i] = {\mathit{fv}}]` +............................................................................ 1. Replace :math:`s{.}\mathsf{structs}{}[a]{.}\mathsf{fields}{}[i]` with :math:`{\mathit{fv}}`. -:math:`(s, f){}[{.}\mathsf{arrays}{}[a]{.}\mathsf{fields}{}[i] = {\mathit{fv}}]` -................................................................................ +:math:`z{}[{.}\mathsf{arrays}{}[a]{.}\mathsf{fields}{}[i] = {\mathit{fv}}]` +........................................................................... 1. Replace :math:`s{.}\mathsf{arrays}{}[a]{.}\mathsf{fields}{}[i]` with :math:`{\mathit{fv}}`. -:math:`(s, f){}[{.}\mathsf{structs} \mathrel{{=}{\oplus}} {{\mathit{si}}^\ast}]` -................................................................................ +:math:`z{}[{.}\mathsf{structs} \mathrel{{=}{\oplus}} {{\mathit{si}}^\ast}]` +........................................................................... 1. Append :math:`{{\mathit{si}}^\ast}` to :math:`s{.}\mathsf{structs}`. -:math:`(s, f){}[{.}\mathsf{arrays} \mathrel{{=}{\oplus}} {{\mathit{ai}}^\ast}]` -............................................................................... +:math:`z{}[{.}\mathsf{arrays} \mathrel{{=}{\oplus}} {{\mathit{ai}}^\ast}]` +.......................................................................... 1. Append :math:`{{\mathit{ai}}^\ast}` to :math:`s{.}\mathsf{arrays}`. -:math:`(s, f){}[{.}\mathsf{exns} \mathrel{{=}{\oplus}} {{\mathit{exn}}^\ast}]` -.............................................................................. +:math:`z{}[{.}\mathsf{exns} \mathrel{{=}{\oplus}} {{\mathit{exn}}^\ast}]` +......................................................................... 1. Append :math:`{{\mathit{exn}}^\ast}` to :math:`s{.}\mathsf{exns}`. @@ -32651,71 +32665,77 @@ arrayinst (s, f) exninst (s, f) 1. Return s.EXNS. -type (s, f) x -1. Return f.MODULE.TYPES[x]. +fof z +1. Return $frame(z). -tag (s, f) x -1. Return s.TAGS[f.MODULE.TAGS[x]]. +type z x +1. Return $fof(z).MODULE.TYPES[x]. -global (s, f) x -1. Return s.GLOBALS[f.MODULE.GLOBALS[x]]. +sof z +1. Return $store(z). -mem (s, f) x -1. Return s.MEMS[f.MODULE.MEMS[x]]. +tag z x +1. Return $sof(z).TAGS[$fof(z).MODULE.TAGS[x]]. -table (s, f) x -1. Return s.TABLES[f.MODULE.TABLES[x]]. +global z x +1. Return $sof(z).GLOBALS[$fof(z).MODULE.GLOBALS[x]]. -func (s, f) x -1. Return s.FUNCS[f.MODULE.FUNCS[x]]. +mem z x +1. Return $sof(z).MEMS[$fof(z).MODULE.MEMS[x]]. -data (s, f) x -1. Return s.DATAS[f.MODULE.DATAS[x]]. +table z x +1. Return $sof(z).TABLES[$fof(z).MODULE.TABLES[x]]. -elem (s, f) x -1. Return s.ELEMS[f.MODULE.ELEMS[x]]. +func z x +1. Return $sof(z).FUNCS[$fof(z).MODULE.FUNCS[x]]. -local (s, f) x -1. Return f.LOCALS[x]. +data z x +1. Return $sof(z).DATAS[$fof(z).MODULE.DATAS[x]]. -with_local (s, f) x v -1. Replace f.LOCALS[x] with ?(v). +elem z x +1. Return $sof(z).ELEMS[$fof(z).MODULE.ELEMS[x]]. -with_global (s, f) x v -1. Replace s.GLOBALS[f.MODULE.GLOBALS[x]].VALUE with v. +local z x +1. Return $fof(z).LOCALS[x]. -with_table (s, f) x i r -1. Replace s.TABLES[f.MODULE.TABLES[x]].REFS[i] with r. +with_local z x v +1. Replace $fof(z).LOCALS[x] with ?(v). -with_tableinst (s, f) x ti -1. Replace s.TABLES[f.MODULE.TABLES[x]] with ti. +with_global z x v +1. Replace $sof(z).GLOBALS[$fof(z).MODULE.GLOBALS[x]].VALUE with v. -with_mem (s, f) x i j b* -1. Replace s.MEMS[f.MODULE.MEMS[x]].BYTES[i : j] with b*. +with_table z x i r +1. Replace $sof(z).TABLES[$fof(z).MODULE.TABLES[x]].REFS[i] with r. -with_meminst (s, f) x mi -1. Replace s.MEMS[f.MODULE.MEMS[x]] with mi. +with_tableinst z x ti +1. Replace $sof(z).TABLES[$fof(z).MODULE.TABLES[x]] with ti. -with_elem (s, f) x r* -1. Replace s.ELEMS[f.MODULE.ELEMS[x]].REFS with r*. +with_mem z x i j b* +1. Replace $sof(z).MEMS[$fof(z).MODULE.MEMS[x]].BYTES[i : j] with b*. -with_data (s, f) x b* -1. Replace s.DATAS[f.MODULE.DATAS[x]].BYTES with b*. +with_meminst z x mi +1. Replace $sof(z).MEMS[$fof(z).MODULE.MEMS[x]] with mi. + +with_elem z x r* +1. Replace $sof(z).ELEMS[$fof(z).MODULE.ELEMS[x]].REFS with r*. + +with_data z x b* +1. Replace $sof(z).DATAS[$fof(z).MODULE.DATAS[x]].BYTES with b*. -with_struct (s, f) a i fv -1. Replace s.STRUCTS[a].FIELDS[i] with fv. +with_struct z a i fv +1. Replace $sof(z).STRUCTS[a].FIELDS[i] with fv. -with_array (s, f) a i fv -1. Replace s.ARRAYS[a].FIELDS[i] with fv. +with_array z a i fv +1. Replace $sof(z).ARRAYS[a].FIELDS[i] with fv. -add_structinst (s, f) si* -1. Append si* to the s.STRUCTS. +add_structinst z si* +1. Append si* to the $sof(z).STRUCTS. -add_arrayinst (s, f) ai* -1. Append ai* to the s.ARRAYS. +add_arrayinst z ai* +1. Append ai* to the $sof(z).ARRAYS. -add_exninst (s, f) exn* -1. Append exn* to the s.EXNS. +add_exninst z exn* +1. Append exn* to the $sof(z).EXNS. growtable tableinst n r 1. Let { TYPE: (at ([ i .. j? ]) rt); REFS: r'* } be tableinst. From e59bb690e8d2806c58d3254fd46cd0343eabd762 Mon Sep 17 00:00:00 2001 From: Andreas Rossberg Date: Tue, 24 Mar 2026 10:32:32 +0100 Subject: [PATCH 4/5] Sync latest --- specification/sync-wasm-latest.sh | 19 ++++--- .../4.0-execution.configurations.spectec | 50 +++++++++++-------- 2 files changed, 41 insertions(+), 28 deletions(-) diff --git a/specification/sync-wasm-latest.sh b/specification/sync-wasm-latest.sh index c7b5d4e4d7..1e37903430 100644 --- a/specification/sync-wasm-latest.sh +++ b/specification/sync-wasm-latest.sh @@ -30,9 +30,14 @@ for FILE in $HIGHEST_FILES; do if [ ! -f "$LATEST/$FILE" ]; then echo "Added file $HIGHEST/$FILE" ((++HIGHEST_CHANGED)) - elif [ "$HIGHEST/$FILE" -nt "$LATEST/$FILE" ] && ! diff -q "$HIGHEST/$FILE" "$LATEST/$FILE" >/dev/null; then - echo "Modified file $HIGHEST/$FILE" - ((++HIGHEST_CHANGED)) + elif ! diff -q "$HIGHEST/$FILE" "$LATEST/$FILE" >/dev/null; then + if [ "$HIGHEST/$FILE" -nt "$LATEST/$FILE" ]; then + echo "Modified file $HIGHEST/$FILE" + ((++HIGHEST_CHANGED)) + elif ! [ "$HIGHEST/$FILE" -ot "$LATEST/$FILE" ]; then + echo "❌ Error: Changes in both $HIGHEST/$FILE and $LATEST/$FILE with same date." + exit 1 + fi fi done @@ -40,9 +45,11 @@ for FILE in $LATEST_FILES; do if [ ! -f "$HIGHEST/$FILE" ]; then echo "Added file $LATEST/$FILE" ((++LATEST_CHANGED)) - elif [ "$LATEST/$FILE" -nt "$HIGHEST/$FILE" ] && ! diff -q "$HIGHEST/$FILE" "$LATEST/$FILE" >/dev/null; then - echo "Modified file $LATEST/$FILE" - ((++LATEST_CHANGED)) + elif ! diff -q "$HIGHEST/$FILE" "$LATEST/$FILE" >/dev/null; then + if [ "$LATEST/$FILE" -nt "$HIGHEST/$FILE" ]; then + echo "Modified file $LATEST/$FILE" + ((++LATEST_CHANGED)) + fi fi done diff --git a/specification/wasm-latest/4.0-execution.configurations.spectec b/specification/wasm-latest/4.0-execution.configurations.spectec index 1a1a6b2246..fe794ce214 100644 --- a/specification/wasm-latest/4.0-execution.configurations.spectec +++ b/specification/wasm-latest/4.0-execution.configurations.spectec @@ -260,15 +260,21 @@ def $data(state, dataidx) : datainst hint(show %.DATAS[%]) hint(macro " def $elem(state, tableidx) : eleminst hint(show %.ELEMS[%]) hint(macro "Z%") def $local(state, localidx) : val? hint(show %.LOCALS[%]) hint(macro "Z%") -def $type((s; f), x) = f.MODULE.TYPES[x] -def $tag((s; f), x) = s.TAGS[f.MODULE.TAGS[x]] -def $global((s; f), x) = s.GLOBALS[f.MODULE.GLOBALS[x]] -def $mem((s; f), x) = s.MEMS[f.MODULE.MEMS[x]] -def $table((s; f), x) = s.TABLES[f.MODULE.TABLES[x]] -def $func((s; f), x) = s.FUNCS[f.MODULE.FUNCS[x]] -def $data((s; f), x) = s.DATAS[f.MODULE.DATAS[x]] -def $elem((s; f), x) = s.ELEMS[f.MODULE.ELEMS[x]] -def $local((s; f), x) = f.LOCALS[x] +def $sof(state) : store hint(show s) +def $fof(state) : frame hint(show f) + +def $sof(z) = $store(z) +def $fof(z) = $frame(z) + +def $type(z, x) = $fof(z).MODULE.TYPES[x] +def $tag(z, x) = $sof(z).TAGS[$fof(z).MODULE.TAGS[x]] +def $global(z, x) = $sof(z).GLOBALS[$fof(z).MODULE.GLOBALS[x]] +def $mem(z, x) = $sof(z).MEMS[$fof(z).MODULE.MEMS[x]] +def $table(z, x) = $sof(z).TABLES[$fof(z).MODULE.TABLES[x]] +def $func(z, x) = $sof(z).FUNCS[$fof(z).MODULE.FUNCS[x]] +def $data(z, x) = $sof(z).DATAS[$fof(z).MODULE.DATAS[x]] +def $elem(z, x) = $sof(z).ELEMS[$fof(z).MODULE.ELEMS[x]] +def $local(z, x) = $fof(z).LOCALS[x] ;; State update @@ -284,25 +290,25 @@ def $with_data(state, dataidx, byte*) : state hint(show %[.DATAS[% def $with_struct(state, structaddr, nat, fieldval) : state hint(show %[.STRUCTS[%].FIELDS[%] = %]) hint(macro "ZS%") hint(prose "Replace" $structinst(%1)[%2].FIELDS[%3] "with" %4) def $with_array(state, arrayaddr, nat, fieldval) : state hint(show %[.ARRAYS[%].FIELDS[%] = %]) hint(macro "ZA%") hint(prose "Replace" $arrayinst(%1)[%2].FIELDS[%3] "with" %4) -def $with_local((s; f), x, v) = s; f[.LOCALS[x] = v] -def $with_global((s; f), x, v) = s[.GLOBALS[f.MODULE.GLOBALS[x]].VALUE = v]; f -def $with_table((s; f), x, i, r) = s[.TABLES[f.MODULE.TABLES[x]].REFS[i] = r]; f -def $with_tableinst((s; f), x, ti) = s[.TABLES[f.MODULE.TABLES[x]] = ti]; f -def $with_mem((s; f), x, i, j, b*) = s[.MEMS[f.MODULE.MEMS[x]].BYTES[i : j] = b*]; f -def $with_meminst((s; f), x, mi) = s[.MEMS[f.MODULE.MEMS[x]] = mi]; f -def $with_elem((s; f), x, r*) = s[.ELEMS[f.MODULE.ELEMS[x]].REFS = r*]; f -def $with_data((s; f), x, b*) = s[.DATAS[f.MODULE.DATAS[x]].BYTES = b*]; f -def $with_struct((s; f), a, i, fv) = s[.STRUCTS[a].FIELDS[i] = fv]; f -def $with_array((s; f), a, i, fv) = s[.ARRAYS[a].FIELDS[i] = fv]; f +def $with_local(z, x, v) = $sof(z); $fof(z)[.LOCALS[x] = v] +def $with_global(z, x, v) = $sof(z)[.GLOBALS[$fof(z).MODULE.GLOBALS[x]].VALUE = v]; $fof(z) +def $with_table(z, x, i, r) = $sof(z)[.TABLES[$fof(z).MODULE.TABLES[x]].REFS[i] = r]; $fof(z) +def $with_tableinst(z, x, ti) = $sof(z)[.TABLES[$fof(z).MODULE.TABLES[x]] = ti]; $fof(z) +def $with_mem(z, x, i, j, b*) = $sof(z)[.MEMS[$fof(z).MODULE.MEMS[x]].BYTES[i : j] = b*]; $fof(z) +def $with_meminst(z, x, mi) = $sof(z)[.MEMS[$fof(z).MODULE.MEMS[x]] = mi]; $fof(z) +def $with_elem(z, x, r*) = $sof(z)[.ELEMS[$fof(z).MODULE.ELEMS[x]].REFS = r*]; $fof(z) +def $with_data(z, x, b*) = $sof(z)[.DATAS[$fof(z).MODULE.DATAS[x]].BYTES = b*]; $fof(z) +def $with_struct(z, a, i, fv) = $sof(z)[.STRUCTS[a].FIELDS[i] = fv]; $fof(z) +def $with_array(z, a, i, fv) = $sof(z)[.ARRAYS[a].FIELDS[i] = fv]; $fof(z) def $add_structinst(state, structinst*) : state hint(show %[.STRUCTS =++ %]) hint(macro "Z%") hint(prose "Append" %2 "to" $structinst(%1)) def $add_arrayinst(state, arrayinst*) : state hint(show %[.ARRAYS =++ %]) hint(macro "Z%") hint(prose "Append" %2 "to" $arrayinst(%1)) def $add_exninst(state, exninst*) : state hint(show %[.EXNS =++ %]) hint(macro "Z%") hint(prose "Append" %2 "to" $exninst(%1)) -def $add_structinst((s; f), si*) = s[.STRUCTS =++ si*]; f -def $add_arrayinst((s; f), ai*) = s[.ARRAYS =++ ai*]; f -def $add_exninst((s; f), exn*) = s[.EXNS =++ exn*]; f +def $add_structinst(z, si*) = $sof(z)[.STRUCTS =++ si*]; $fof(z) +def $add_arrayinst(z, ai*) = $sof(z)[.ARRAYS =++ ai*]; $fof(z) +def $add_exninst(z, exn*) = $sof(z)[.EXNS =++ exn*]; $fof(z) ;; Growing From 4aa6930f738676e8b0f1878f41ac66895fe61104 Mon Sep 17 00:00:00 2001 From: Andreas Rossberg Date: Tue, 24 Mar 2026 11:07:03 +0100 Subject: [PATCH 5/5] Test expects --- spectec/doc/example/output/NanoWasm.pdf | Bin 245508 -> 245508 bytes spectec/test-frontend/TEST.md | 54 ++++---- spectec/test-latex/TEST.md | 56 ++++---- spectec/test-middlend/TEST.md | 162 ++++++++++++++---------- spectec/test-splice/TEST.md | 8 +- 5 files changed, 168 insertions(+), 112 deletions(-) diff --git a/spectec/doc/example/output/NanoWasm.pdf b/spectec/doc/example/output/NanoWasm.pdf index 161ba4ab00ef5df300ebddc78b3518f236f9946f..1341c39ec48ab868e1b9b70d1b46c7e647dcd88f 100644 GIT binary patch delta 114 zcmZqq$Jg?Yuc3vpg=q`3&{j4>LjyBo