summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordcode <dcode@dcode.io>2022-07-14 17:29:56 +0200
committerGitHub <noreply@github.com>2022-07-14 08:29:56 -0700
commitadde087245c8c7b072534cfaaa461dc364dae4d3 (patch)
tree4f31f0e45e02d009b73ec8e69aabef92baca4008
parent555ba8fc6787e4425c24c60e2f419bd7826b422a (diff)
downloadbinaryen-adde087245c8c7b072534cfaaa461dc364dae4d3.tar.gz
binaryen-adde087245c8c7b072534cfaaa461dc364dae4d3.tar.bz2
binaryen-adde087245c8c7b072534cfaaa461dc364dae4d3.zip
[C-API] Add utility to go between types and heap types (#4792)
-rw-r--r--src/binaryen-c.cpp15
-rw-r--r--src/binaryen-c.h9
-rw-r--r--test/example/c-api-kitchen-sink.c9
3 files changed, 33 insertions, 0 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp
index 0cc4bb115..e2afe66dc 100644
--- a/src/binaryen-c.cpp
+++ b/src/binaryen-c.cpp
@@ -184,6 +184,21 @@ BinaryenPackedType BinaryenPackedTypeInt16(void) {
return Field::PackedType::i16;
}
+// Heap types
+
+BinaryenHeapType BinaryenTypeGetHeapType(BinaryenType type) {
+ return Type(type).getHeapType().getID();
+}
+bool BinaryenTypeIsNullable(BinaryenType type) {
+ return Type(type).isNullable();
+}
+BinaryenType BinaryenTypeFromHeapType(BinaryenHeapType heapType,
+ bool nullable) {
+ return Type(HeapType(heapType),
+ nullable ? Nullability::Nullable : Nullability::NonNullable)
+ .getID();
+}
+
// TypeSystem
BinaryenTypeSystem BinaryenTypeSystemEquirecursive() {
diff --git a/src/binaryen-c.h b/src/binaryen-c.h
index bf8ed01bb..7b5c22bf9 100644
--- a/src/binaryen-c.h
+++ b/src/binaryen-c.h
@@ -129,6 +129,15 @@ BINARYEN_API BinaryenPackedType BinaryenPackedTypeNotPacked(void);
BINARYEN_API BinaryenPackedType BinaryenPackedTypeInt8(void);
BINARYEN_API BinaryenPackedType BinaryenPackedTypeInt16(void);
+// Heap types
+
+typedef uintptr_t BinaryenHeapType;
+
+BINARYEN_API BinaryenHeapType BinaryenTypeGetHeapType(BinaryenType type);
+BINARYEN_API bool BinaryenTypeIsNullable(BinaryenType type);
+BINARYEN_API BinaryenType BinaryenTypeFromHeapType(BinaryenHeapType heapType,
+ bool nullable);
+
// TypeSystem
typedef uint32_t BinaryenTypeSystem;
diff --git a/test/example/c-api-kitchen-sink.c b/test/example/c-api-kitchen-sink.c
index cb156c7c1..28e784a05 100644
--- a/test/example/c-api-kitchen-sink.c
+++ b/test/example/c-api-kitchen-sink.c
@@ -287,6 +287,15 @@ void test_types() {
printf("BinaryenPackedTypeInt8: %d\n", i8);
BinaryenPackedType i16 = BinaryenPackedTypeInt16();
printf("BinaryenPackedTypeInt16: %d\n", i16);
+
+ BinaryenHeapType eq = BinaryenTypeGetHeapType(eqref);
+ BinaryenType ref_null_eq = BinaryenTypeFromHeapType(eq, true);
+ assert(BinaryenTypeGetHeapType(ref_null_eq) == eq);
+ assert(BinaryenTypeIsNullable(ref_null_eq));
+ BinaryenType ref_eq = BinaryenTypeFromHeapType(eq, false);
+ assert(ref_eq != ref_null_eq);
+ assert(BinaryenTypeGetHeapType(ref_eq) == eq);
+ assert(!BinaryenTypeIsNullable(ref_eq));
}
void test_features() {