diff options
author | dcode <dcode@dcode.io> | 2022-07-14 17:29:56 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-14 08:29:56 -0700 |
commit | adde087245c8c7b072534cfaaa461dc364dae4d3 (patch) | |
tree | 4f31f0e45e02d009b73ec8e69aabef92baca4008 | |
parent | 555ba8fc6787e4425c24c60e2f419bd7826b422a (diff) | |
download | binaryen-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.cpp | 15 | ||||
-rw-r--r-- | src/binaryen-c.h | 9 | ||||
-rw-r--r-- | test/example/c-api-kitchen-sink.c | 9 |
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() { |