From aefae1f94cc81125cfaecb6c1fcacda514050eea Mon Sep 17 00:00:00 2001 From: Mariano Guerra Date: Fri, 11 Sep 2015 21:38:43 +0200 Subject: [PATCH 1/6] initial tests for globals --- ml-proto/test/globals.wasm | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 ml-proto/test/globals.wasm diff --git a/ml-proto/test/globals.wasm b/ml-proto/test/globals.wasm new file mode 100644 index 0000000000..5c3c97c518 --- /dev/null +++ b/ml-proto/test/globals.wasm @@ -0,0 +1,30 @@ +(module + (global $rx0 i32) + (global $rx1 i32) + + (func $gx0 (load_global $rx0)) + (func $sx0 (param i32) (store_global $rx0 (get_local 0))) + + (func $gx1 (load_global $rx1)) + (func $sx1 (param i32) (store_global $rx1 (get_local 0))) + + (func $storeandload (param i32) + (call $sx0 (get_local 0)) + (call $gx0)) + + (export "gx0" $gx0) + (export "sx0" $sx0) + + (export "gx1" $gx1) + (export "sx1" $sx1) + + (export "storeandload" $storeandload) +) + +(assert_eq (invoke "storeandload" (i32.const 25)) (i32.const 25)) +(invoke "sx0" (i32.const 10)) +(assert_eq (invoke "gx0") (i32.const 10)) + +(invoke "sx1" (i32.const 12)) +(assert_eq (invoke "gx1") (i32.const 12)) +(assert_eq (invoke "gx0") (i32.const 10)) From 524db1cc53f3f93b9c6751dc785638c51396a460 Mon Sep 17 00:00:00 2001 From: Mariano Guerra Date: Fri, 11 Sep 2015 21:46:01 +0200 Subject: [PATCH 2/6] return stored value and check in tests for that --- ml-proto/src/spec/eval.ml | 2 +- ml-proto/test/globals.wasm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ml-proto/src/spec/eval.ml b/ml-proto/src/spec/eval.ml index 08931c8853..f995b92d26 100644 --- a/ml-proto/src/spec/eval.ml +++ b/ml-proto/src/spec/eval.ml @@ -160,7 +160,7 @@ let rec eval_expr c e = | StoreGlobal (x, e1) -> let v1 = unary (eval_expr c e1) e1.at in global c x := v1; - [] + [v1] | Load ({mem; ty; _}, e1) -> let v1 = unary (eval_expr c e1) e1.at in diff --git a/ml-proto/test/globals.wasm b/ml-proto/test/globals.wasm index 5c3c97c518..a4a6b10aa6 100644 --- a/ml-proto/test/globals.wasm +++ b/ml-proto/test/globals.wasm @@ -22,9 +22,9 @@ ) (assert_eq (invoke "storeandload" (i32.const 25)) (i32.const 25)) -(invoke "sx0" (i32.const 10)) +(assert_eq (invoke "sx0" (i32.const 10)) (i32.const 10)) (assert_eq (invoke "gx0") (i32.const 10)) -(invoke "sx1" (i32.const 12)) +(assert_eq (invoke "sx1" (i32.const 12)) (i32.const 12)) (assert_eq (invoke "gx1") (i32.const 12)) (assert_eq (invoke "gx0") (i32.const 10)) From 3ba302f2a8d4613efd501ec6a2aa852954ba1cfd Mon Sep 17 00:00:00 2001 From: Mariano Guerra Date: Sun, 13 Sep 2015 14:35:50 +0200 Subject: [PATCH 3/6] allow using result of store_global in check.ml --- ml-proto/src/spec/check.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ml-proto/src/spec/check.ml b/ml-proto/src/spec/check.ml index 92fe065651..8e8f0d423e 100644 --- a/ml-proto/src/spec/check.ml +++ b/ml-proto/src/spec/check.ml @@ -186,7 +186,7 @@ let rec check_expr c ts e = | StoreGlobal (x, e1) -> check_expr c [global c x] e1; - check_type [] ts e.at + check_type [global c x] ts e.at | Load (memop, e1) -> check_memop memop e.at; From a98828ce491afdb8daafeb04cd45d840fd857d35 Mon Sep 17 00:00:00 2001 From: Mariano Guerra Date: Sun, 13 Sep 2015 14:36:10 +0200 Subject: [PATCH 4/6] return set value on set_local, allow it on check.ml --- ml-proto/src/spec/check.ml | 2 +- ml-proto/src/spec/eval.ml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ml-proto/src/spec/check.ml b/ml-proto/src/spec/check.ml index 8e8f0d423e..b3ec7000e7 100644 --- a/ml-proto/src/spec/check.ml +++ b/ml-proto/src/spec/check.ml @@ -179,7 +179,7 @@ let rec check_expr c ts e = | SetLocal (x, e1) -> check_expr c [local c x] e1; - check_type [] ts e.at + check_type [local c x] ts e.at | LoadGlobal x -> check_type [global c x] ts e.at diff --git a/ml-proto/src/spec/eval.ml b/ml-proto/src/spec/eval.ml index f995b92d26..0dca98effa 100644 --- a/ml-proto/src/spec/eval.ml +++ b/ml-proto/src/spec/eval.ml @@ -152,7 +152,7 @@ let rec eval_expr c e = | SetLocal (x, e1) -> let v1 = unary (eval_expr c e1) e1.at in local c x := v1; - [] + [v1] | LoadGlobal x -> [!(global c x)] From b0d0243c201f05383412e165f5e4a0185f7a616b Mon Sep 17 00:00:00 2001 From: Mariano Guerra Date: Sun, 13 Sep 2015 14:43:56 +0200 Subject: [PATCH 5/6] add tests to use result of set_local and store_global --- ml-proto/test/globals.wasm | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/ml-proto/test/globals.wasm b/ml-proto/test/globals.wasm index a4a6b10aa6..ced0e645f7 100644 --- a/ml-proto/test/globals.wasm +++ b/ml-proto/test/globals.wasm @@ -12,12 +12,24 @@ (call $sx0 (get_local 0)) (call $gx0)) + (func $lssg (param i32) (result i32) + (local $l1 i32) + (local $l2 i32) + + (set_local $l1 (set_local $l2 (get_local 0)))) + + (func $gssg (param i32) (result i32) + (store_global $rx0 (store_global $rx1 (get_local 0)))) + (export "gx0" $gx0) (export "sx0" $sx0) (export "gx1" $gx1) (export "sx1" $sx1) + (export "localsetsetget" $lssg) + (export "globalsetsetget" $gssg) + (export "storeandload" $storeandload) ) @@ -28,3 +40,5 @@ (assert_eq (invoke "sx1" (i32.const 12)) (i32.const 12)) (assert_eq (invoke "gx1") (i32.const 12)) (assert_eq (invoke "gx0") (i32.const 10)) +(assert_eq (invoke "localsetsetget" (i32.const 13)) (i32.const 13)) +(assert_eq (invoke "globalsetsetget" (i32.const 14)) (i32.const 14)) From d958fa3d51638f801702812a294cb8ac1dd60311 Mon Sep 17 00:00:00 2001 From: Mariano Guerra Date: Sun, 13 Sep 2015 15:00:37 +0200 Subject: [PATCH 6/6] return stored value as result of store --- ml-proto/src/spec/check.ml | 2 +- ml-proto/src/spec/eval.ml | 2 +- ml-proto/test/memory_store_return.wasm | 11 +++++++++++ 3 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 ml-proto/test/memory_store_return.wasm diff --git a/ml-proto/src/spec/check.ml b/ml-proto/src/spec/check.ml index b3ec7000e7..ea184f1db3 100644 --- a/ml-proto/src/spec/check.ml +++ b/ml-proto/src/spec/check.ml @@ -197,7 +197,7 @@ let rec check_expr c ts e = check_memop memop e.at; check_expr c [Int32Type] e1; check_expr c [memop.ty] e2; - check_type [] ts e.at + check_type [memop.ty] ts e.at | Const v -> check_literal c ts v diff --git a/ml-proto/src/spec/eval.ml b/ml-proto/src/spec/eval.ml index 0dca98effa..f1ffe59da2 100644 --- a/ml-proto/src/spec/eval.ml +++ b/ml-proto/src/spec/eval.ml @@ -172,7 +172,7 @@ let rec eval_expr c e = let v2 = unary (eval_expr c e2) e2.at in (try Memory.store c.modul.memory (Memory.address_of_value v1) mem v2 with exn -> memory_error e.at exn); - [] + [v2] | Const v -> [v.it] diff --git a/ml-proto/test/memory_store_return.wasm b/ml-proto/test/memory_store_return.wasm new file mode 100644 index 0000000000..488081094a --- /dev/null +++ b/ml-proto/test/memory_store_return.wasm @@ -0,0 +1,11 @@ +(module + (memory 1024) + + (func $store-i32 (param $v i32) (result i32) + (i32.store/i32 (i32.const 4) (get_local $v))) + + (export "store-i32" $store-i32)) + +(assert_eq (invoke "store-i32" (i32.const 42)) (i32.const 42)) + +