summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/binaryen.js/exception-handling.js.txt8
-rw-r--r--test/binaryen.js/kitchen-sink.js1
-rw-r--r--test/binaryen.js/kitchen-sink.js.txt43
-rw-r--r--test/example/c-api-kitchen-sink.c7
-rw-r--r--test/example/c-api-kitchen-sink.txt4
-rw-r--r--test/lit/table-operations.wast29
-rw-r--r--test/spec/table_grow.wast174
-rw-r--r--test/spec/table_size.wast90
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