diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/binaryen.js/exception-handling.js.txt | 8 | ||||
-rw-r--r-- | test/binaryen.js/kitchen-sink.js | 1 | ||||
-rw-r--r-- | test/binaryen.js/kitchen-sink.js.txt | 43 | ||||
-rw-r--r-- | test/example/c-api-kitchen-sink.c | 7 | ||||
-rw-r--r-- | test/example/c-api-kitchen-sink.txt | 4 | ||||
-rw-r--r-- | test/lit/table-operations.wast | 29 | ||||
-rw-r--r-- | test/spec/table_grow.wast | 174 | ||||
-rw-r--r-- | test/spec/table_size.wast | 90 |
8 files changed, 285 insertions, 71 deletions
diff --git a/test/binaryen.js/exception-handling.js.txt b/test/binaryen.js/exception-handling.js.txt index 09d8659a0..73e33799e 100644 --- a/test/binaryen.js/exception-handling.js.txt +++ b/test/binaryen.js/exception-handling.js.txt @@ -34,7 +34,7 @@ ) ) -getExpressionInfo(throw) = {"id":49,"type":1,"tag":"e"} -getExpressionInfo(rethrow) = {"id":50,"type":1,"target":"l0"} -getExpressionInfo(try_catch) = {"id":48,"type":1,"name":"l0","hasCatchAll":0,"delegateTarget":"","isDelegate":0} -getExpressionInfo(try_delegate) = {"id":48,"type":0,"name":"try_outer","hasCatchAll":1,"delegateTarget":"","isDelegate":0} +getExpressionInfo(throw) = {"id":50,"type":1,"tag":"e"} +getExpressionInfo(rethrow) = {"id":51,"type":1,"target":"l0"} +getExpressionInfo(try_catch) = {"id":49,"type":1,"name":"l0","hasCatchAll":0,"delegateTarget":"","isDelegate":0} +getExpressionInfo(try_delegate) = {"id":49,"type":0,"name":"try_outer","hasCatchAll":1,"delegateTarget":"","isDelegate":0} diff --git a/test/binaryen.js/kitchen-sink.js b/test/binaryen.js/kitchen-sink.js index 10d97cc0a..7288bb484 100644 --- a/test/binaryen.js/kitchen-sink.js +++ b/test/binaryen.js/kitchen-sink.js @@ -167,6 +167,7 @@ function test_ids() { console.log("TableGetId: " + binaryen.TableGetId); console.log("TableSetId: " + binaryen.TableSetId); console.log("TableSizeId: " + binaryen.TableSizeId); + console.log("TableGrowId: " + binaryen.TableGrowId); console.log("TryId: " + binaryen.TryId); console.log("ThrowId: " + binaryen.ThrowId); console.log("RethrowId: " + binaryen.RethrowId); diff --git a/test/binaryen.js/kitchen-sink.js.txt b/test/binaryen.js/kitchen-sink.js.txt index f54991f0b..ed45591ea 100644 --- a/test/binaryen.js/kitchen-sink.js.txt +++ b/test/binaryen.js/kitchen-sink.js.txt @@ -91,27 +91,28 @@ RefEqId: 44 TableGetId: 45 TableSetId: 46 TableSizeId: 47 -TryId: 48 -ThrowId: 49 -RethrowId: 50 -TupleMakeId: 51 -TupleExtractId: 52 -I31NewId: 53 -I31GetId: 54 -CallRefId: 55 -RefTestId: 56 -RefCastId: 57 -BrOnId: 58 -RttCanonId: 59 -RttSubId: 60 -StructNewId: 61 -StructGetId: 62 -StructSetId: 63 -ArrayNewId: 64 -ArrayInitId: 65 -ArrayGetId: 66 -ArraySetId: 67 -ArrayLenId: 68 +TableGrowId: 48 +TryId: 49 +ThrowId: 50 +RethrowId: 51 +TupleMakeId: 52 +TupleExtractId: 53 +I31NewId: 54 +I31GetId: 55 +CallRefId: 56 +RefTestId: 57 +RefCastId: 58 +BrOnId: 59 +RttCanonId: 60 +RttSubId: 61 +StructNewId: 62 +StructGetId: 63 +StructSetId: 64 +ArrayNewId: 65 +ArrayInitId: 66 +ArrayGetId: 67 +ArraySetId: 68 +ArrayLenId: 69 getExpressionInfo={"id":15,"type":4,"op":6} (f32.neg (f32.const -33.61199951171875) diff --git a/test/example/c-api-kitchen-sink.c b/test/example/c-api-kitchen-sink.c index 327e20e1e..fb3fc87b0 100644 --- a/test/example/c-api-kitchen-sink.c +++ b/test/example/c-api-kitchen-sink.c @@ -1032,6 +1032,13 @@ void test_core() { const char* table = BinaryenTableSizeGetTable(tablesize); BinaryenTableSizeSetTable(tablesize, table); + BinaryenExpressionRef valueExpr = + BinaryenRefNull(module, BinaryenTypeFuncref()); + BinaryenExpressionRef sizeExpr = makeInt32(module, 0); + BinaryenExpressionRef growExpr = + BinaryenTableGrow(module, "0", valueExpr, sizeExpr); + BinaryenExpressionPrint(growExpr); + // Memory. One per module const char* segments[] = {"hello, world", "I am passive"}; diff --git a/test/example/c-api-kitchen-sink.txt b/test/example/c-api-kitchen-sink.txt index b1afb9954..f5e5d6d67 100644 --- a/test/example/c-api-kitchen-sink.txt +++ b/test/example/c-api-kitchen-sink.txt @@ -39,6 +39,10 @@ BinaryenFeatureAll: 32767 (i32.const 0) ) (table.size $0) +(table.grow $0 + (ref.null func) + (i32.const 0) +) (module (type $i32_i64_f32_f64_=>_i32 (func (param i32 i64 f32 f64) (result i32))) (type $i32_=>_none (func (param i32))) diff --git a/test/lit/table-operations.wast b/test/lit/table-operations.wast index dece2143a..ace31a9c7 100644 --- a/test/lit/table-operations.wast +++ b/test/lit/table-operations.wast @@ -14,11 +14,15 @@ ;; CHECK-BINARY: (type $none_=>_i32 (func (result i32))) + ;; CHECK-BINARY: (type $i32_=>_i32 (func (param i32) (result i32))) + ;; CHECK-BINARY: (table $table-1 1 1 funcref) ;; CHECK-TEXT: (type $none_=>_none (func)) ;; CHECK-TEXT: (type $none_=>_i32 (func (result i32))) + ;; CHECK-TEXT: (type $i32_=>_i32 (func (param i32) (result i32))) + ;; CHECK-TEXT: (table $table-1 1 1 funcref) (table $table-1 funcref (elem $foo) @@ -127,11 +131,29 @@ (func $get-table-size (result i32) (table.size $table-1) ) + + ;; CHECK-BINARY: (func $table-grow (param $sz i32) (result i32) + ;; CHECK-BINARY-NEXT: (table.grow $table-1 + ;; CHECK-BINARY-NEXT: (ref.null func) + ;; CHECK-BINARY-NEXT: (local.get $sz) + ;; CHECK-BINARY-NEXT: ) + ;; CHECK-BINARY-NEXT: ) + ;; CHECK-TEXT: (func $table-grow (param $sz i32) (result i32) + ;; CHECK-TEXT-NEXT: (table.grow $table-1 + ;; CHECK-TEXT-NEXT: (ref.null func) + ;; CHECK-TEXT-NEXT: (local.get $sz) + ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: ) + (func $table-grow (param $sz i32) (result i32) + (table.grow $table-1 (ref.null func) (local.get $sz)) + ) ) ;; CHECK-NODEBUG: (type $none_=>_none (func)) ;; CHECK-NODEBUG: (type $none_=>_i32 (func (result i32))) +;; CHECK-NODEBUG: (type $i32_=>_i32 (func (param i32) (result i32))) + ;; CHECK-NODEBUG: (table $0 1 1 funcref) ;; CHECK-NODEBUG: (table $1 3 3 funcref) @@ -172,3 +194,10 @@ ;; CHECK-NODEBUG: (func $3 (result i32) ;; CHECK-NODEBUG-NEXT: (table.size $0) ;; CHECK-NODEBUG-NEXT: ) + +;; CHECK-NODEBUG: (func $4 (param $0 i32) (result i32) +;; CHECK-NODEBUG-NEXT: (table.grow $0 +;; CHECK-NODEBUG-NEXT: (ref.null func) +;; CHECK-NODEBUG-NEXT: (local.get $0) +;; CHECK-NODEBUG-NEXT: ) +;; CHECK-NODEBUG-NEXT: ) diff --git a/test/spec/table_grow.wast b/test/spec/table_grow.wast new file mode 100644 index 000000000..a3a25b071 --- /dev/null +++ b/test/spec/table_grow.wast @@ -0,0 +1,174 @@ +(module + (table $t 0 externref) + + (func (export "get") (param $i i32) (result externref) (table.get $t (local.get $i))) + (func (export "set") (param $i i32) (param $r externref) (table.set $t (local.get $i) (local.get $r))) + + (func (export "grow") (param $sz i32) (param $init externref) (result i32) + (table.grow $t (local.get $init) (local.get $sz)) + ) + (func (export "size") (result i32) (table.size $t)) +) + +(assert_return (invoke "size") (i32.const 0)) +;; (assert_trap (invoke "set" (i32.const 0) (ref.extern 2)) "out of bounds table access") +(assert_trap (invoke "get" (i32.const 0)) "out of bounds table access") + +(assert_return (invoke "grow" (i32.const 1) (ref.null extern)) (i32.const 0)) +(assert_return (invoke "size") (i32.const 1)) +(assert_return (invoke "get" (i32.const 0)) (ref.null extern)) +;; (assert_return (invoke "set" (i32.const 0) (ref.extern 2))) +;; (assert_return (invoke "get" (i32.const 0)) (ref.extern 2)) +;; (assert_trap (invoke "set" (i32.const 1) (ref.extern 2)) "out of bounds table access") +;; (assert_trap (invoke "get" (i32.const 1)) "out of bounds table access") + +;; (assert_return (invoke "grow" (i32.const 4) (ref.extern 3)) (i32.const 1)) +;; (assert_return (invoke "size") (i32.const 5)) +;; (assert_return (invoke "get" (i32.const 0)) (ref.extern 2)) +;; (assert_return (invoke "set" (i32.const 0) (ref.extern 2))) +;; (assert_return (invoke "get" (i32.const 0)) (ref.extern 2)) +;; (assert_return (invoke "get" (i32.const 1)) (ref.extern 3)) +;; (assert_return (invoke "get" (i32.const 4)) (ref.extern 3)) +;; (assert_return (invoke "set" (i32.const 4) (ref.extern 4))) +;; (assert_return (invoke "get" (i32.const 4)) (ref.extern 4)) +;; (assert_trap (invoke "set" (i32.const 5) (ref.extern 2)) "out of bounds table access") +;; (assert_trap (invoke "get" (i32.const 5)) "out of bounds table access") + + +;; Reject growing to size outside i32 value range +;; TODO: parse error +;; (module +;; (table $t 0x10 funcref) +;; (elem declare func $f) +;; (func $f (export "grow") (result i32) +;; (table.grow $t (ref.func $f) (i32.const 0xffff_fff0)) +;; ) +;; ) + +;; (assert_return (invoke "grow") (i32.const -1)) + + +(module + (table $t 0 externref) + (func (export "grow") (param i32) (result i32) + (table.grow $t (ref.null extern) (local.get 0)) + ) +) + +(assert_return (invoke "grow" (i32.const 0)) (i32.const 0)) +(assert_return (invoke "grow" (i32.const 1)) (i32.const 0)) +(assert_return (invoke "grow" (i32.const 0)) (i32.const 1)) +(assert_return (invoke "grow" (i32.const 2)) (i32.const 1)) +(assert_return (invoke "grow" (i32.const 800)) (i32.const 3)) + + +(module + (table $t 0 10 externref) + (func (export "grow") (param i32) (result i32) + (table.grow $t (ref.null extern) (local.get 0)) + ) +) + +(assert_return (invoke "grow" (i32.const 0)) (i32.const 0)) +(assert_return (invoke "grow" (i32.const 1)) (i32.const 0)) +(assert_return (invoke "grow" (i32.const 1)) (i32.const 1)) +(assert_return (invoke "grow" (i32.const 2)) (i32.const 2)) +(assert_return (invoke "grow" (i32.const 6)) (i32.const 4)) +(assert_return (invoke "grow" (i32.const 0)) (i32.const 10)) +(assert_return (invoke "grow" (i32.const 1)) (i32.const -1)) +(assert_return (invoke "grow" (i32.const 0x10000)) (i32.const -1)) + + +(module + (table $t 10 funcref) + (func (export "grow") (param i32) (result i32) + (table.grow $t (ref.null func) (local.get 0)) + ) + (elem declare func 1) + (func (export "check-table-null") (param i32 i32) (result funcref) + (local funcref) + (local.set 2 (ref.func 1)) + (block + (loop + (local.set 2 (table.get $t (local.get 0))) + (br_if 1 (i32.eqz (ref.is_null (local.get 2)))) + (br_if 1 (i32.ge_u (local.get 0) (local.get 1))) + (local.set 0 (i32.add (local.get 0) (i32.const 1))) + (br_if 0 (i32.le_u (local.get 0) (local.get 1))) + ) + ) + (local.get 2) + ) +) + +(assert_return (invoke "check-table-null" (i32.const 0) (i32.const 9)) (ref.null func)) +(assert_return (invoke "grow" (i32.const 10)) (i32.const 10)) +(assert_return (invoke "check-table-null" (i32.const 0) (i32.const 19)) (ref.null func)) + + +;; Type errors + +(assert_invalid + (module + (table $t 0 externref) + (func $type-init-size-empty-vs-i32-externref (result i32) + (table.grow $t) + ) + ) + "type mismatch" +) +(assert_invalid + (module + (table $t 0 externref) + (func $type-size-empty-vs-i32 (result i32) + (table.grow $t (ref.null extern)) + ) + ) + "type mismatch" +) +(assert_invalid + (module + (table $t 0 externref) + (func $type-init-empty-vs-externref (result i32) + (table.grow $t (i32.const 1)) + ) + ) + "type mismatch" +) +(assert_invalid + (module + (table $t 0 externref) + (func $type-size-f32-vs-i32 (result i32) + (table.grow $t (ref.null extern) (f32.const 1)) + ) + ) + "type mismatch" +) +(assert_invalid + (module + (table $t 0 funcref) + (func $type-init-externref-vs-funcref (param $r externref) (result i32) + (table.grow $t (local.get $r) (i32.const 1)) + ) + ) + "type mismatch" +) + +(assert_invalid + (module + (table $t 1 externref) + (func $type-result-i32-vs-empty + (table.grow $t (ref.null extern) (i32.const 0)) + ) + ) + "type mismatch" +) +(assert_invalid + (module + (table $t 1 externref) + (func $type-result-i32-vs-f32 (result f32) + (table.grow $t (ref.null extern) (i32.const 0)) + ) + ) + "type mismatch" +) diff --git a/test/spec/table_size.wast b/test/spec/table_size.wast index 5732ca1a8..ad293b5ee 100644 --- a/test/spec/table_size.wast +++ b/test/spec/table_size.wast @@ -1,5 +1,3 @@ -;; TODO: uncomment tests when table.grow is implemented - (module (table $t0 0 externref) (table $t1 1 externref) @@ -11,59 +9,59 @@ (func (export "size-t2") (result i32) (table.size $t2)) (func (export "size-t3") (result i32) (table.size $t3)) - ;; (func (export "grow-t0") (param $sz i32) - ;; (drop (table.grow $t0 (ref.null extern) (local.get $sz))) - ;; ) - ;; (func (export "grow-t1") (param $sz i32) - ;; (drop (table.grow $t1 (ref.null extern) (local.get $sz))) - ;; ) - ;; (func (export "grow-t2") (param $sz i32) - ;; (drop (table.grow $t2 (ref.null extern) (local.get $sz))) - ;; ) - ;; (func (export "grow-t3") (param $sz i32) - ;; (drop (table.grow $t3 (ref.null extern) (local.get $sz))) - ;; ) + (func (export "grow-t0") (param $sz i32) + (drop (table.grow $t0 (ref.null extern) (local.get $sz))) + ) + (func (export "grow-t1") (param $sz i32) + (drop (table.grow $t1 (ref.null extern) (local.get $sz))) + ) + (func (export "grow-t2") (param $sz i32) + (drop (table.grow $t2 (ref.null extern) (local.get $sz))) + ) + (func (export "grow-t3") (param $sz i32) + (drop (table.grow $t3 (ref.null extern) (local.get $sz))) + ) ) (assert_return (invoke "size-t0") (i32.const 0)) -;; (assert_return (invoke "grow-t0" (i32.const 1))) -;; (assert_return (invoke "size-t0") (i32.const 1)) -;; (assert_return (invoke "grow-t0" (i32.const 4))) -;; (assert_return (invoke "size-t0") (i32.const 5)) -;; (assert_return (invoke "grow-t0" (i32.const 0))) -;; (assert_return (invoke "size-t0") (i32.const 5)) +(assert_return (invoke "grow-t0" (i32.const 1))) +(assert_return (invoke "size-t0") (i32.const 1)) +(assert_return (invoke "grow-t0" (i32.const 4))) +(assert_return (invoke "size-t0") (i32.const 5)) +(assert_return (invoke "grow-t0" (i32.const 0))) +(assert_return (invoke "size-t0") (i32.const 5)) (assert_return (invoke "size-t1") (i32.const 1)) -;; (assert_return (invoke "grow-t1" (i32.const 1))) -;; (assert_return (invoke "size-t1") (i32.const 2)) -;; (assert_return (invoke "grow-t1" (i32.const 4))) -;; (assert_return (invoke "size-t1") (i32.const 6)) -;; (assert_return (invoke "grow-t1" (i32.const 0))) -;; (assert_return (invoke "size-t1") (i32.const 6)) +(assert_return (invoke "grow-t1" (i32.const 1))) +(assert_return (invoke "size-t1") (i32.const 2)) +(assert_return (invoke "grow-t1" (i32.const 4))) +(assert_return (invoke "size-t1") (i32.const 6)) +(assert_return (invoke "grow-t1" (i32.const 0))) +(assert_return (invoke "size-t1") (i32.const 6)) (assert_return (invoke "size-t2") (i32.const 0)) -;; (assert_return (invoke "grow-t2" (i32.const 3))) -;; (assert_return (invoke "size-t2") (i32.const 0)) -;; (assert_return (invoke "grow-t2" (i32.const 1))) -;; (assert_return (invoke "size-t2") (i32.const 1)) -;; (assert_return (invoke "grow-t2" (i32.const 0))) -;; (assert_return (invoke "size-t2") (i32.const 1)) -;; (assert_return (invoke "grow-t2" (i32.const 4))) -;; (assert_return (invoke "size-t2") (i32.const 1)) -;; (assert_return (invoke "grow-t2" (i32.const 1))) -;; (assert_return (invoke "size-t2") (i32.const 2)) +(assert_return (invoke "grow-t2" (i32.const 3))) +(assert_return (invoke "size-t2") (i32.const 0)) +(assert_return (invoke "grow-t2" (i32.const 1))) +(assert_return (invoke "size-t2") (i32.const 1)) +(assert_return (invoke "grow-t2" (i32.const 0))) +(assert_return (invoke "size-t2") (i32.const 1)) +(assert_return (invoke "grow-t2" (i32.const 4))) +(assert_return (invoke "size-t2") (i32.const 1)) +(assert_return (invoke "grow-t2" (i32.const 1))) +(assert_return (invoke "size-t2") (i32.const 2)) (assert_return (invoke "size-t3") (i32.const 3)) -;; (assert_return (invoke "grow-t3" (i32.const 1))) -;; (assert_return (invoke "size-t3") (i32.const 4)) -;; (assert_return (invoke "grow-t3" (i32.const 3))) -;; (assert_return (invoke "size-t3") (i32.const 7)) -;; (assert_return (invoke "grow-t3" (i32.const 0))) -;; (assert_return (invoke "size-t3") (i32.const 7)) -;; (assert_return (invoke "grow-t3" (i32.const 2))) -;; (assert_return (invoke "size-t3") (i32.const 7)) -;; (assert_return (invoke "grow-t3" (i32.const 1))) -;; (assert_return (invoke "size-t3") (i32.const 8)) +(assert_return (invoke "grow-t3" (i32.const 1))) +(assert_return (invoke "size-t3") (i32.const 4)) +(assert_return (invoke "grow-t3" (i32.const 3))) +(assert_return (invoke "size-t3") (i32.const 7)) +(assert_return (invoke "grow-t3" (i32.const 0))) +(assert_return (invoke "size-t3") (i32.const 7)) +(assert_return (invoke "grow-t3" (i32.const 2))) +(assert_return (invoke "size-t3") (i32.const 7)) +(assert_return (invoke "grow-t3" (i32.const 1))) +(assert_return (invoke "size-t3") (i32.const 8)) ;; Type errors |