Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions interpreter/valid/valid.ml
Original file line number Diff line number Diff line change
Expand Up @@ -377,7 +377,7 @@ let check_vec_binop binop at =
error at "invalid lane index"
| _ -> ()

let check_memop (c : context) (memop : ('t, 's) memop) ty_size get_sz at =
let check_memop (c : context) (memop : ('t, 's) memop) x ty_size get_sz at =
let size =
match get_sz memop.pack with
| None -> ty_size memop.ty
Expand All @@ -387,7 +387,7 @@ let check_memop (c : context) (memop : ('t, 's) memop) ty_size get_sz at =
in
require (1 lsl memop.align >= 1 && 1 lsl memop.align <= size) at
"alignment must not be larger than natural";
let MemoryT (at_, _lim) = memory c (0l @@ at) in
let MemoryT (at_, _lim) = memory c x in
if at_ = I32AT then
require (I64.lt_u memop.offset 0x1_0000_0000L) at
"offset out of range";
Expand Down Expand Up @@ -626,7 +626,7 @@ let rec check_instr (c : context) (e : instr) (s : infer_resulttype) : infer_ins

| TableFill x ->
let TableT (at, _lim, rt) = table c x in
[NumT (numtype_of_addrtype at); RefT rt;
[NumT (numtype_of_addrtype at); RefT rt;
NumT (numtype_of_addrtype at)] --> [], []

| TableCopy (x, y) ->
Expand All @@ -652,34 +652,34 @@ let rec check_instr (c : context) (e : instr) (s : infer_resulttype) : infer_ins

| Load (x, memop) ->
let MemoryT (at, _lim) = memory c x in
let t = check_memop c memop num_size (Lib.Option.map fst) e.at in
let t = check_memop c memop x num_size (Lib.Option.map fst) e.at in
[NumT (numtype_of_addrtype at)] --> [NumT t], []

| Store (x, memop) ->
let MemoryT (at, _lim) = memory c x in
let t = check_memop c memop num_size (fun sz -> sz) e.at in
let t = check_memop c memop x num_size (fun sz -> sz) e.at in
[NumT (numtype_of_addrtype at); NumT t] --> [], []

| VecLoad (x, memop) ->
let MemoryT (at, _lim) = memory c x in
let t = check_memop c memop vec_size (Lib.Option.map fst) e.at in
let t = check_memop c memop x vec_size (Lib.Option.map fst) e.at in
[NumT (numtype_of_addrtype at)] --> [VecT t], []

| VecStore (x, memop) ->
let MemoryT (at, _lim) = memory c x in
let t = check_memop c memop vec_size (fun _ -> None) e.at in
let t = check_memop c memop x vec_size (fun _ -> None) e.at in
[NumT (numtype_of_addrtype at); VecT t] --> [], []

| VecLoadLane (x, memop, i) ->
let MemoryT (at, _lim) = memory c x in
let t = check_memop c memop vec_size (fun sz -> Some sz) e.at in
let t = check_memop c memop x vec_size (fun sz -> Some sz) e.at in
require (I8.to_int_u i < vec_size t / Pack.packed_size memop.pack) e.at
"invalid lane index";
[NumT (numtype_of_addrtype at); VecT t] --> [VecT t], []

| VecStoreLane (x, memop, i) ->
let MemoryT (at, _lim) = memory c x in
let t = check_memop c memop vec_size (fun sz -> Some sz) e.at in
let t = check_memop c memop x vec_size (fun sz -> Some sz) e.at in
require (I8.to_int_u i < vec_size t / Pack.packed_size memop.pack) e.at
"invalid lane index";
[NumT (numtype_of_addrtype at); VecT t] --> [], []
Expand Down
14 changes: 14 additions & 0 deletions test/core/memory64/load64.wast
Original file line number Diff line number Diff line change
Expand Up @@ -565,3 +565,17 @@
)
"type mismatch"
)

;; Offset must fit the address type of the selected memory

(assert_invalid
(module
(memory i64 0)
(memory 0)
(func
i32.const 0
i32.load 1 offset=4294967296
drop)
)
"offset out of range"
)