summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordcode <dcode@dcode.io>2022-10-18 23:16:07 +0200
committerGitHub <noreply@github.com>2022-10-18 14:16:07 -0700
commite4fd739f72eae49aa47bef06af9f38625a3a9f33 (patch)
tree6ee226d199c05535a06539b6868d77b060854a0b
parent34e7e49cd7fbf520e4f3cfb976b1c88713b18e45 (diff)
downloadbinaryen-e4fd739f72eae49aa47bef06af9f38625a3a9f33.tar.gz
binaryen-e4fd739f72eae49aa47bef06af9f38625a3a9f33.tar.bz2
binaryen-e4fd739f72eae49aa47bef06af9f38625a3a9f33.zip
[C API] Add bottom heap types and array heap type (#5150)
Adds `BinaryenHeapTypeNone`, `BinaryenHeapTypeNoext` and `BinaryenHeapTypeNofunc` to obtain the bottom heap types. Also adds `BinaryenHeapTypeIsBottom` to test whether a given heap type is a bottom type, and `BinaryenHeapTypeGetBottom` to obtain the respective bottom type given a heap type.
-rw-r--r--src/binaryen-c.cpp22
-rw-r--r--src/binaryen-c.h9
-rw-r--r--test/example/c-api-kitchen-sink.c34
-rw-r--r--test/example/c-api-kitchen-sink.txt8
4 files changed, 73 insertions, 0 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp
index ec70baef2..cd3806810 100644
--- a/src/binaryen-c.cpp
+++ b/src/binaryen-c.cpp
@@ -202,6 +202,9 @@ BinaryenType BinaryenTypeI31ref(void) {
BinaryenType BinaryenTypeDataref(void) {
return Type(HeapType::data, NonNullable).getID();
}
+BinaryenType BinaryenTypeArrayref(void) {
+ return Type(HeapType::array, Nullable).getID();
+}
BinaryenType BinaryenTypeStringref() {
return Type(HeapType::string, Nullable).getID();
}
@@ -284,6 +287,9 @@ BinaryenHeapType BinaryenHeapTypeI31() {
BinaryenHeapType BinaryenHeapTypeData() {
return static_cast<BinaryenHeapType>(HeapType::BasicHeapType::data);
}
+BinaryenHeapType BinaryenHeapTypeArray() {
+ return static_cast<BinaryenHeapType>(HeapType::BasicHeapType::array);
+}
BinaryenHeapType BinaryenHeapTypeString() {
return static_cast<BinaryenHeapType>(HeapType::BasicHeapType::string);
}
@@ -299,6 +305,22 @@ BinaryenHeapType BinaryenHeapTypeStringviewIter() {
return static_cast<BinaryenHeapType>(
HeapType::BasicHeapType::stringview_iter);
}
+BinaryenHeapType BinaryenHeapTypeNone() {
+ return static_cast<BinaryenHeapType>(HeapType::BasicHeapType::none);
+}
+BinaryenHeapType BinaryenHeapTypeNoext() {
+ return static_cast<BinaryenHeapType>(HeapType::BasicHeapType::noext);
+}
+BinaryenHeapType BinaryenHeapTypeNofunc() {
+ return static_cast<BinaryenHeapType>(HeapType::BasicHeapType::nofunc);
+}
+
+bool BinaryenHeapTypeIsBottom(BinaryenHeapType heapType) {
+ return HeapType(heapType).isBottom();
+}
+BinaryenHeapType BinaryenHeapTypeGetBottom(BinaryenHeapType heapType) {
+ return static_cast<BinaryenHeapType>(HeapType(heapType).getBottom());
+}
BinaryenHeapType BinaryenTypeGetHeapType(BinaryenType type) {
return Type(type).getHeapType().getID();
diff --git a/src/binaryen-c.h b/src/binaryen-c.h
index 9cc282721..ea3988cae 100644
--- a/src/binaryen-c.h
+++ b/src/binaryen-c.h
@@ -105,6 +105,7 @@ BINARYEN_API BinaryenType BinaryenTypeAnyref(void);
BINARYEN_API BinaryenType BinaryenTypeEqref(void);
BINARYEN_API BinaryenType BinaryenTypeI31ref(void);
BINARYEN_API BinaryenType BinaryenTypeDataref(void);
+BINARYEN_API BinaryenType BinaryenTypeArrayref(void);
BINARYEN_API BinaryenType BinaryenTypeStringref(void);
BINARYEN_API BinaryenType BinaryenTypeStringviewWTF8(void);
BINARYEN_API BinaryenType BinaryenTypeStringviewWTF16(void);
@@ -146,10 +147,18 @@ BINARYEN_API BinaryenHeapType BinaryenHeapTypeAny(void);
BINARYEN_API BinaryenHeapType BinaryenHeapTypeEq(void);
BINARYEN_API BinaryenHeapType BinaryenHeapTypeI31(void);
BINARYEN_API BinaryenHeapType BinaryenHeapTypeData(void);
+BINARYEN_API BinaryenHeapType BinaryenHeapTypeArray(void);
BINARYEN_API BinaryenHeapType BinaryenHeapTypeString(void);
BINARYEN_API BinaryenHeapType BinaryenHeapTypeStringviewWTF8(void);
BINARYEN_API BinaryenHeapType BinaryenHeapTypeStringviewWTF16(void);
BINARYEN_API BinaryenHeapType BinaryenHeapTypeStringviewIter(void);
+BINARYEN_API BinaryenHeapType BinaryenHeapTypeNone(void);
+BINARYEN_API BinaryenHeapType BinaryenHeapTypeNoext(void);
+BINARYEN_API BinaryenHeapType BinaryenHeapTypeNofunc(void);
+
+BINARYEN_API bool BinaryenHeapTypeIsBottom(BinaryenHeapType heapType);
+BINARYEN_API BinaryenHeapType
+BinaryenHeapTypeGetBottom(BinaryenHeapType heapType);
BINARYEN_API BinaryenHeapType BinaryenTypeGetHeapType(BinaryenType type);
BINARYEN_API bool BinaryenTypeIsNullable(BinaryenType type);
diff --git a/test/example/c-api-kitchen-sink.c b/test/example/c-api-kitchen-sink.c
index 251aa3b90..f333da4a2 100644
--- a/test/example/c-api-kitchen-sink.c
+++ b/test/example/c-api-kitchen-sink.c
@@ -270,6 +270,13 @@ void test_types() {
BinaryenTypeExpand(dataref, &valueType);
assert(valueType == dataref);
+ BinaryenType arrayref = BinaryenTypeArrayref();
+ printf("BinaryenTypeArrayref: (ptr)\n");
+ assert(arrayref == BinaryenTypeArrayref());
+ assert(BinaryenTypeArity(arrayref) == 1);
+ BinaryenTypeExpand(arrayref, &valueType);
+ assert(valueType == arrayref);
+
BinaryenType stringref = BinaryenTypeStringref();
printf("BinaryenTypeStringref: (ptr)\n");
assert(BinaryenTypeArity(stringref) == 1);
@@ -294,6 +301,24 @@ void test_types() {
BinaryenTypeExpand(stringview_iter_, &valueType);
assert(valueType == stringview_iter_);
+ BinaryenType nullref = BinaryenTypeNullref();
+ printf("BinaryenTypeNullref: (ptr)\n");
+ assert(BinaryenTypeArity(nullref) == 1);
+ BinaryenTypeExpand(nullref, &valueType);
+ assert(valueType == nullref);
+
+ BinaryenType nullexternref = BinaryenTypeNullExternref();
+ printf("BinaryenTypeNullExternref: (ptr)\n");
+ assert(BinaryenTypeArity(nullexternref) == 1);
+ BinaryenTypeExpand(nullexternref, &valueType);
+ assert(valueType == nullexternref);
+
+ BinaryenType nullfuncref = BinaryenTypeNullFuncref();
+ printf("BinaryenTypeNullFuncref: (ptr)\n");
+ assert(BinaryenTypeArity(nullfuncref) == 1);
+ BinaryenTypeExpand(nullfuncref, &valueType);
+ assert(valueType == nullfuncref);
+
printf("BinaryenTypeAuto: %zd\n", BinaryenTypeAuto());
BinaryenType pair[] = {i32, i32};
@@ -324,6 +349,7 @@ void test_types() {
printf("BinaryenHeapTypeEq: %zd\n", BinaryenHeapTypeEq());
printf("BinaryenHeapTypeI31: %zd\n", BinaryenHeapTypeI31());
printf("BinaryenHeapTypeData: %zd\n", BinaryenHeapTypeData());
+ printf("BinaryenHeapTypeArray: %zd\n", BinaryenHeapTypeArray());
printf("BinaryenHeapTypeString: %zd\n", BinaryenHeapTypeString());
printf("BinaryenHeapTypeStringviewWTF8: %zd\n",
BinaryenHeapTypeStringviewWTF8());
@@ -331,6 +357,14 @@ void test_types() {
BinaryenHeapTypeStringviewWTF16());
printf("BinaryenHeapTypeStringviewIter: %zd\n",
BinaryenHeapTypeStringviewIter());
+ printf("BinaryenHeapTypeNone: %zd\n", BinaryenHeapTypeNone());
+ printf("BinaryenHeapTypeNoext: %zd\n", BinaryenHeapTypeNoext());
+ printf("BinaryenHeapTypeNofunc: %zd\n", BinaryenHeapTypeNofunc());
+
+ assert(!BinaryenHeapTypeIsBottom(BinaryenHeapTypeExt()));
+ assert(BinaryenHeapTypeIsBottom(BinaryenHeapTypeNoext()));
+ assert(BinaryenHeapTypeGetBottom(BinaryenHeapTypeExt()) ==
+ BinaryenHeapTypeNoext());
BinaryenHeapType eq = BinaryenTypeGetHeapType(eqref);
assert(eq == BinaryenHeapTypeEq());
diff --git a/test/example/c-api-kitchen-sink.txt b/test/example/c-api-kitchen-sink.txt
index 983c80d90..0d7ef581b 100644
--- a/test/example/c-api-kitchen-sink.txt
+++ b/test/example/c-api-kitchen-sink.txt
@@ -11,10 +11,14 @@ BinaryenTypeAnyref: (ptr)
BinaryenTypeEqref: (ptr)
BinaryenTypeI31ref: (ptr)
BinaryenTypeDataref: (ptr)
+BinaryenTypeArrayref: (ptr)
BinaryenTypeStringref: (ptr)
BinaryenTypeStringviewWTF8: (ptr)
BinaryenTypeStringviewWTF16: (ptr)
BinaryenTypeStringviewIter: (ptr)
+BinaryenTypeNullref: (ptr)
+BinaryenTypeNullExternref: (ptr)
+BinaryenTypeNullFuncref: (ptr)
BinaryenTypeAuto: -1
BinaryenPackedTypeNotPacked: 0
BinaryenPackedTypeInt8: 1
@@ -25,10 +29,14 @@ BinaryenHeapTypeAny: 2
BinaryenHeapTypeEq: 3
BinaryenHeapTypeI31: 4
BinaryenHeapTypeData: 5
+BinaryenHeapTypeArray: 6
BinaryenHeapTypeString: 7
BinaryenHeapTypeStringviewWTF8: 8
BinaryenHeapTypeStringviewWTF16: 9
BinaryenHeapTypeStringviewIter: 10
+BinaryenHeapTypeNone: 11
+BinaryenHeapTypeNoext: 12
+BinaryenHeapTypeNofunc: 13
BinaryenFeatureMVP: 0
BinaryenFeatureAtomics: 1
BinaryenFeatureBulkMemory: 16