summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/binaryen-c.cpp15
-rw-r--r--src/binaryen-c.h6
-rw-r--r--test/example/c-api-kitchen-sink.c75
3 files changed, 75 insertions, 21 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp
index 4501a67e0..06c71f5a5 100644
--- a/src/binaryen-c.cpp
+++ b/src/binaryen-c.cpp
@@ -315,12 +315,27 @@ BinaryenHeapType BinaryenHeapTypeNofunc() {
return static_cast<BinaryenHeapType>(HeapType::BasicHeapType::nofunc);
}
+bool BinaryenHeapTypeIsBasic(BinaryenHeapType heapType) {
+ return HeapType(heapType).isBasic();
+}
+bool BinaryenHeapTypeIsSignature(BinaryenHeapType heapType) {
+ return HeapType(heapType).isSignature();
+}
+bool BinaryenHeapTypeIsStruct(BinaryenHeapType heapType) {
+ return HeapType(heapType).isStruct();
+}
+bool BinaryenHeapTypeIsArray(BinaryenHeapType heapType) {
+ return HeapType(heapType).isArray();
+}
bool BinaryenHeapTypeIsBottom(BinaryenHeapType heapType) {
return HeapType(heapType).isBottom();
}
BinaryenHeapType BinaryenHeapTypeGetBottom(BinaryenHeapType heapType) {
return static_cast<BinaryenHeapType>(HeapType(heapType).getBottom());
}
+bool BinaryenHeapTypeIsSubType(BinaryenHeapType left, BinaryenHeapType right) {
+ return HeapType::isSubType(HeapType(left), HeapType(right));
+}
BinaryenHeapType BinaryenTypeGetHeapType(BinaryenType type) {
return Type(type).getHeapType().getID();
diff --git a/src/binaryen-c.h b/src/binaryen-c.h
index ea3988cae..480016a80 100644
--- a/src/binaryen-c.h
+++ b/src/binaryen-c.h
@@ -156,9 +156,15 @@ BINARYEN_API BinaryenHeapType BinaryenHeapTypeNone(void);
BINARYEN_API BinaryenHeapType BinaryenHeapTypeNoext(void);
BINARYEN_API BinaryenHeapType BinaryenHeapTypeNofunc(void);
+BINARYEN_API bool BinaryenHeapTypeIsBasic(BinaryenHeapType heapType);
+BINARYEN_API bool BinaryenHeapTypeIsSignature(BinaryenHeapType heapType);
+BINARYEN_API bool BinaryenHeapTypeIsStruct(BinaryenHeapType heapType);
+BINARYEN_API bool BinaryenHeapTypeIsArray(BinaryenHeapType heapType);
BINARYEN_API bool BinaryenHeapTypeIsBottom(BinaryenHeapType heapType);
BINARYEN_API BinaryenHeapType
BinaryenHeapTypeGetBottom(BinaryenHeapType heapType);
+BINARYEN_API bool BinaryenHeapTypeIsSubType(BinaryenHeapType left,
+ BinaryenHeapType right);
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 f333da4a2..fc3684171 100644
--- a/test/example/c-api-kitchen-sink.c
+++ b/test/example/c-api-kitchen-sink.c
@@ -2203,32 +2203,65 @@ void test_typebuilder() {
bool didBuildAndDispose = TypeBuilderBuildAndDispose(
builder, (BinaryenHeapType*)&heapTypes, &errorIndex, &errorReason);
assert(didBuildAndDispose);
- BinaryenType arrayType =
- BinaryenTypeFromHeapType(heapTypes[tempArrayIndex], true);
- BinaryenType structType =
- BinaryenTypeFromHeapType(heapTypes[tempStructIndex], true);
+
+ BinaryenHeapType arrayHeapType = heapTypes[tempArrayIndex];
+ assert(!BinaryenHeapTypeIsBasic(arrayHeapType));
+ assert(!BinaryenHeapTypeIsSignature(arrayHeapType));
+ assert(!BinaryenHeapTypeIsStruct(arrayHeapType));
+ assert(BinaryenHeapTypeIsArray(arrayHeapType));
+ assert(!BinaryenHeapTypeIsBottom(arrayHeapType));
+ assert(BinaryenHeapTypeIsSubType(arrayHeapType, BinaryenHeapTypeArray()));
+ BinaryenType arrayType = BinaryenTypeFromHeapType(arrayHeapType, true);
+
+ BinaryenHeapType structHeapType = heapTypes[tempStructIndex];
+ assert(!BinaryenHeapTypeIsBasic(structHeapType));
+ assert(!BinaryenHeapTypeIsSignature(structHeapType));
+ assert(BinaryenHeapTypeIsStruct(structHeapType));
+ assert(!BinaryenHeapTypeIsArray(structHeapType));
+ assert(!BinaryenHeapTypeIsBottom(structHeapType));
+ assert(BinaryenHeapTypeIsSubType(structHeapType, BinaryenHeapTypeData()));
+ BinaryenType structType = BinaryenTypeFromHeapType(structHeapType, true);
+
+ BinaryenHeapType signatureHeapType = heapTypes[tempSignatureIndex];
+ assert(!BinaryenHeapTypeIsBasic(signatureHeapType));
+ assert(BinaryenHeapTypeIsSignature(signatureHeapType));
+ assert(!BinaryenHeapTypeIsStruct(signatureHeapType));
+ assert(!BinaryenHeapTypeIsArray(signatureHeapType));
+ assert(!BinaryenHeapTypeIsBottom(signatureHeapType));
+ assert(BinaryenHeapTypeIsSubType(signatureHeapType, BinaryenHeapTypeFunc()));
BinaryenType signatureType =
- BinaryenTypeFromHeapType(heapTypes[tempSignatureIndex], true);
- BinaryenType basicType =
- BinaryenTypeFromHeapType(heapTypes[tempBasicIndex], true);
+ BinaryenTypeFromHeapType(signatureHeapType, true);
+
+ BinaryenHeapType basicHeapType = heapTypes[tempBasicIndex]; // = eq
+ assert(BinaryenHeapTypeIsBasic(basicHeapType));
+ assert(!BinaryenHeapTypeIsSignature(basicHeapType));
+ assert(!BinaryenHeapTypeIsStruct(basicHeapType));
+ assert(!BinaryenHeapTypeIsArray(basicHeapType));
+ assert(!BinaryenHeapTypeIsBottom(basicHeapType));
+ assert(BinaryenHeapTypeIsSubType(basicHeapType, BinaryenHeapTypeAny()));
+ BinaryenType basicType = BinaryenTypeFromHeapType(basicHeapType, true);
+
+ BinaryenHeapType subStructHeapType = heapTypes[tempSubStructIndex];
+ assert(!BinaryenHeapTypeIsBasic(subStructHeapType));
+ assert(!BinaryenHeapTypeIsSignature(subStructHeapType));
+ assert(BinaryenHeapTypeIsStruct(subStructHeapType));
+ assert(!BinaryenHeapTypeIsArray(subStructHeapType));
+ assert(!BinaryenHeapTypeIsBottom(subStructHeapType));
+ assert(BinaryenHeapTypeIsSubType(subStructHeapType, BinaryenHeapTypeData()));
+ assert(BinaryenHeapTypeIsSubType(subStructHeapType, structHeapType));
BinaryenType subStructType =
- BinaryenTypeFromHeapType(heapTypes[tempSubStructIndex], true);
+ BinaryenTypeFromHeapType(subStructHeapType, true);
// Build a simple test module, validate and print it
BinaryenModuleRef module = BinaryenModuleCreate();
- BinaryenModuleSetTypeName(module, heapTypes[tempArrayIndex], "SomeArray");
- BinaryenModuleSetTypeName(module, heapTypes[tempStructIndex], "SomeStruct");
- BinaryenModuleSetFieldName(
- module, heapTypes[tempStructIndex], 0, "SomeField");
- BinaryenModuleSetTypeName(
- module, heapTypes[tempSignatureIndex], "SomeSignature");
- BinaryenModuleSetTypeName(module, heapTypes[tempBasicIndex], "does-nothing");
- BinaryenModuleSetTypeName(
- module, heapTypes[tempSubStructIndex], "SomeSubStruct");
- BinaryenModuleSetFieldName(
- module, heapTypes[tempSubStructIndex], 0, "SomeField");
- BinaryenModuleSetFieldName(
- module, heapTypes[tempSubStructIndex], 1, "SomePackedField");
+ BinaryenModuleSetTypeName(module, arrayHeapType, "SomeArray");
+ BinaryenModuleSetTypeName(module, structHeapType, "SomeStruct");
+ BinaryenModuleSetFieldName(module, structHeapType, 0, "SomeField");
+ BinaryenModuleSetTypeName(module, signatureHeapType, "SomeSignature");
+ BinaryenModuleSetTypeName(module, basicHeapType, "does-nothing");
+ BinaryenModuleSetTypeName(module, subStructHeapType, "SomeSubStruct");
+ BinaryenModuleSetFieldName(module, subStructHeapType, 0, "SomeField");
+ BinaryenModuleSetFieldName(module, subStructHeapType, 1, "SomePackedField");
BinaryenModuleSetFeatures(
module, BinaryenFeatureReferenceTypes() | BinaryenFeatureGC());
{