diff --git a/ml-proto/spec/eval.ml b/ml-proto/spec/eval.ml index acc40f8660..3a0492a4a1 100644 --- a/ml-proto/spec/eval.ml +++ b/ml-proto/spec/eval.ml @@ -279,17 +279,15 @@ and eval_hostop c hostop vs at = | GrowMemory, [v] -> let mem = memory c at in let delta = address32 v at in - if I64.rem_u delta Memory.page_size <> 0L then - Trap.error at "growing memory by non-multiple of page size"; - let old_size = (Memory.size mem) in - let new_size = Int64.add old_size delta in + let old_size = Memory.size mem in + let new_size = Int64.(add old_size (mul delta Memory.page_size)) in if I64.lt_u new_size old_size then Trap.error at "memory size overflow"; (* Test whether the new size overflows the memory type. * Since we currently only support i32, just test that. *) if I64.gt_u new_size (Int64.of_int32 Int32.max_int) then Trap.error at "memory size exceeds implementation limit"; - Memory.grow mem (Int64.div delta Memory.page_size); + Memory.grow mem delta; Some (Int32 (Int64.to_int32 old_size)) | _, _ -> diff --git a/ml-proto/test/memory_trap.wast b/ml-proto/test/memory_trap.wast index 94535d4c28..18d8a53397 100644 --- a/ml-proto/test/memory_trap.wast +++ b/ml-proto/test/memory_trap.wast @@ -2,13 +2,14 @@ (memory 1) (export "store" $store) - (func $store (param $i i32) (param $v i32) (result i32) (i32.store (i32.add (memory_size) (get_local $i)) (get_local $v))) + (func $store (param $i i32) (param $v i32) (result i32) + (i32.store (i32.add (memory_size) (get_local $i)) (get_local $v)) + ) (export "load" $load) - (func $load (param $i i32) (result i32) (i32.load (i32.add (memory_size) (get_local $i)))) - - (export "grow_memory" $grow_memory) - (func $grow_memory (param $i i32) (grow_memory (get_local $i))) + (func $load (param $i i32) (result i32) + (i32.load (i32.add (memory_size) (get_local $i))) + ) (export "overflow_memory_size" $overflow_memory_size) (func $overflow_memory_size @@ -28,5 +29,4 @@ (assert_trap (invoke "load" (i32.const 0)) "out of bounds memory access") (assert_trap (invoke "store" (i32.const 0x80000000) (i32.const 13)) "out of bounds memory access") (assert_trap (invoke "load" (i32.const 0x80000000)) "out of bounds memory access") -(assert_trap (invoke "grow_memory" (i32.const 3)) "growing memory by non-multiple of page size") (assert_trap (invoke "overflow_memory_size") "memory size exceeds implementation limit") diff --git a/ml-proto/test/resizing.wast b/ml-proto/test/resizing.wast index 132e0813e1..727f23847c 100644 --- a/ml-proto/test/resizing.wast +++ b/ml-proto/test/resizing.wast @@ -1,12 +1,6 @@ (module (memory 0) - (export "round_up_to_page" $round_up_to_page) - (func $round_up_to_page (param i32) (result i32) - (i32.and (i32.add (get_local 0) (i32.const 0xFFFF)) - (i32.const 0xFFFF0000)) - ) - (export "load_at_zero" $load_at_zero) (func $load_at_zero (result i32) (i32.load (i32.const 0))) @@ -20,32 +14,26 @@ (func $store_at_page_size (result i32) (i32.store (i32.const 0x10000) (i32.const 3))) (export "grow" $grow) - (func $grow (param $sz i32) (result i32) - (grow_memory (call $round_up_to_page (get_local $sz))) - ) - - (export "size_at_least" $size_at_least) - (func $size_at_least (param i32) (result i32) (i32.ge_u (memory_size) (get_local 0))) + (func $grow (param $sz i32) (result i32) (grow_memory (get_local $sz))) (export "size" $size) (func $size (result i32) (memory_size)) ) (assert_return (invoke "size") (i32.const 0)) -(assert_return (invoke "size_at_least" (i32.const 0)) (i32.const 1)) (assert_trap (invoke "store_at_zero") "out of bounds memory access") (assert_trap (invoke "load_at_zero") "out of bounds memory access") (assert_trap (invoke "store_at_page_size") "out of bounds memory access") (assert_trap (invoke "load_at_page_size") "out of bounds memory access") -(assert_return (invoke "grow" (i32.const 4)) (i32.const 0)) -(assert_return (invoke "size_at_least" (i32.const 4)) (i32.const 1)) +(assert_return (invoke "grow" (i32.const 1)) (i32.const 0)) +(assert_return (invoke "size") (i32.const 0x10000)) (assert_return (invoke "load_at_zero") (i32.const 0)) (assert_return (invoke "store_at_zero") (i32.const 2)) (assert_return (invoke "load_at_zero") (i32.const 2)) (assert_trap (invoke "store_at_page_size") "out of bounds memory access") (assert_trap (invoke "load_at_page_size") "out of bounds memory access") -(assert_return (invoke "grow" (i32.const 4)) (i32.const 65536)) -(assert_return (invoke "size_at_least" (i32.const 8)) (i32.const 1)) +(assert_return (invoke "grow" (i32.const 4)) (i32.const 0x10000)) +(assert_return (invoke "size") (i32.const 0x50000)) (assert_return (invoke "load_at_zero") (i32.const 2)) (assert_return (invoke "store_at_zero") (i32.const 2)) (assert_return (invoke "load_at_page_size") (i32.const 0))