summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorThomas Lively <7121787+tlively@users.noreply.github.com>2021-03-24 21:01:55 -0700
committerGitHub <noreply@github.com>2021-03-24 21:01:55 -0700
commit4506ffba7da377044e5a4a6d9385591ff730221c (patch)
tree66da23d3c146688e07214e3fb45161e33bcb448d /test
parent78de694ceb1b642076050d75c26ce4c1bf996b31 (diff)
downloadbinaryen-4506ffba7da377044e5a4a6d9385591ff730221c.tar.gz
binaryen-4506ffba7da377044e5a4a6d9385591ff730221c.tar.bz2
binaryen-4506ffba7da377044e5a4a6d9385591ff730221c.zip
Refactor TypeBuilder (#3728)
Makes TypeBuilders growable, adds a `getTempHeapType` method, allows the `getTemp*Type` methods to take arbitrary temporary or canonical HeapTypes rather than just an index, and allows BasicHeapTypes to be assigned to TypeBuilder slots. All of these changes are necessary for the upcoming re-implementation of equirecursive LUB calculation. Also adds a new utility to TypeBuilder for using `operator[]` as an intuitive and readable wrapper around the `getTempHeapType` and `setHeapType` methods.
Diffstat (limited to 'test')
-rw-r--r--test/example/type-builder.cpp119
-rw-r--r--test/example/type-builder.txt3
2 files changed, 75 insertions, 47 deletions
diff --git a/test/example/type-builder.cpp b/test/example/type-builder.cpp
index 0ac13f974..29ff20f75 100644
--- a/test/example/type-builder.cpp
+++ b/test/example/type-builder.cpp
@@ -13,13 +13,16 @@ void test_builder() {
// (type $struct (struct (field (ref null $array) (mut rtt 0 $array))))
// (type $array (array (mut externref)))
- TypeBuilder builder(3);
-
- Type refSig = builder.getTempRefType(0, NonNullable);
- Type refStruct = builder.getTempRefType(1, NonNullable);
- Type refArray = builder.getTempRefType(2, NonNullable);
- Type refNullArray = builder.getTempRefType(2, Nullable);
- Type rttArray = builder.getTempRttType(2, 0);
+ TypeBuilder builder;
+ assert(builder.size() == 0);
+ builder.grow(3);
+ assert(builder.size() == 3);
+
+ Type refSig = builder.getTempRefType(builder[0], NonNullable);
+ Type refStruct = builder.getTempRefType(builder[1], NonNullable);
+ Type refArray = builder.getTempRefType(builder[2], NonNullable);
+ Type refNullArray = builder.getTempRefType(builder[2], Nullable);
+ Type rttArray = builder.getTempRttType(Rtt(0, builder[2]));
Type refNullExt(HeapType::ext, Nullable);
Signature sig(refStruct, builder.getTempTupleType({refArray, Type::i32}));
@@ -33,9 +36,9 @@ void test_builder() {
std::cout << "(ref null $array) => " << refNullArray << "\n";
std::cout << "(rtt 0 $array) => " << rttArray << "\n\n";
- builder.setHeapType(0, sig);
- builder.setHeapType(1, struct_);
- builder.setHeapType(2, array);
+ builder[0] = sig;
+ builder[1] = struct_;
+ builder[2] = array;
std::cout << "After setting heap types:\n";
std::cout << "(ref $sig) => " << refSig << "\n";
@@ -78,19 +81,19 @@ void test_canonicalization() {
TypeBuilder builder(4);
- Type tempSigRef1 = builder.getTempRefType(2, Nullable);
- Type tempSigRef2 = builder.getTempRefType(3, Nullable);
+ Type tempSigRef1 = builder.getTempRefType(builder[2], Nullable);
+ Type tempSigRef2 = builder.getTempRefType(builder[3], Nullable);
assert(tempSigRef1 != tempSigRef2);
assert(tempSigRef1 != Type(sig, Nullable));
assert(tempSigRef2 != Type(sig, Nullable));
- builder.setHeapType(
- 0, Struct({Field(tempSigRef1, Immutable), Field(tempSigRef1, Immutable)}));
- builder.setHeapType(
- 1, Struct({Field(tempSigRef2, Immutable), Field(tempSigRef2, Immutable)}));
- builder.setHeapType(2, Signature(Type::none, Type::none));
- builder.setHeapType(3, Signature(Type::none, Type::none));
+ builder[0] =
+ Struct({Field(tempSigRef1, Immutable), Field(tempSigRef1, Immutable)});
+ builder[1] =
+ Struct({Field(tempSigRef2, Immutable), Field(tempSigRef2, Immutable)});
+ builder[2] = Signature(Type::none, Type::none);
+ builder[3] = Signature(Type::none, Type::none);
std::vector<HeapType> built = builder.build();
@@ -108,8 +111,8 @@ void test_recursive() {
std::vector<HeapType> built;
{
TypeBuilder builder(1);
- Type temp = builder.getTempRefType(0, Nullable);
- builder.setHeapType(0, Signature(Type::none, temp));
+ Type temp = builder.getTempRefType(builder[0], Nullable);
+ builder[0] = Signature(Type::none, temp);
built = builder.build();
}
std::cout << built[0] << "\n\n";
@@ -122,10 +125,10 @@ void test_recursive() {
std::vector<HeapType> built;
{
TypeBuilder builder(2);
- Type temp0 = builder.getTempRefType(0, Nullable);
- Type temp1 = builder.getTempRefType(1, Nullable);
- builder.setHeapType(0, Signature(Type::none, temp1));
- builder.setHeapType(1, Signature(Type::none, temp0));
+ Type temp0 = builder.getTempRefType(builder[0], Nullable);
+ Type temp1 = builder.getTempRefType(builder[1], Nullable);
+ builder[0] = Signature(Type::none, temp1);
+ builder[1] = Signature(Type::none, temp0);
built = builder.build();
}
std::cout << built[0] << "\n";
@@ -140,16 +143,16 @@ void test_recursive() {
std::vector<HeapType> built;
{
TypeBuilder builder(5);
- Type temp0 = builder.getTempRefType(0, Nullable);
- Type temp1 = builder.getTempRefType(1, Nullable);
- Type temp2 = builder.getTempRefType(2, Nullable);
- Type temp3 = builder.getTempRefType(3, Nullable);
- Type temp4 = builder.getTempRefType(4, Nullable);
- builder.setHeapType(0, Signature(Type::none, temp1));
- builder.setHeapType(1, Signature(Type::none, temp2));
- builder.setHeapType(2, Signature(Type::none, temp3));
- builder.setHeapType(3, Signature(Type::none, temp4));
- builder.setHeapType(4, Signature(Type::none, temp0));
+ Type temp0 = builder.getTempRefType(builder[0], Nullable);
+ Type temp1 = builder.getTempRefType(builder[1], Nullable);
+ Type temp2 = builder.getTempRefType(builder[2], Nullable);
+ Type temp3 = builder.getTempRefType(builder[3], Nullable);
+ Type temp4 = builder.getTempRefType(builder[4], Nullable);
+ builder[0] = Signature(Type::none, temp1);
+ builder[1] = Signature(Type::none, temp2);
+ builder[2] = Signature(Type::none, temp3);
+ builder[3] = Signature(Type::none, temp4);
+ builder[4] = Signature(Type::none, temp0);
built = builder.build();
}
std::cout << built[0] << "\n";
@@ -174,18 +177,18 @@ void test_recursive() {
std::vector<HeapType> built;
{
TypeBuilder builder(6);
- Type temp0 = builder.getTempRefType(0, Nullable);
- Type temp1 = builder.getTempRefType(1, Nullable);
- Type temp2 = builder.getTempRefType(2, Nullable);
- Type temp3 = builder.getTempRefType(3, Nullable);
+ Type temp0 = builder.getTempRefType(builder[0], Nullable);
+ Type temp1 = builder.getTempRefType(builder[1], Nullable);
+ Type temp2 = builder.getTempRefType(builder[2], Nullable);
+ Type temp3 = builder.getTempRefType(builder[3], Nullable);
Type tuple0_2 = builder.getTempTupleType({temp0, temp2});
Type tuple1_3 = builder.getTempTupleType({temp1, temp3});
- builder.setHeapType(0, Signature(Type::none, tuple0_2));
- builder.setHeapType(1, Signature(Type::none, tuple1_3));
- builder.setHeapType(2, Signature());
- builder.setHeapType(3, Signature());
- builder.setHeapType(4, Signature(Type::none, temp0));
- builder.setHeapType(5, Signature(Type::none, temp1));
+ builder[0] = Signature(Type::none, tuple0_2);
+ builder[1] = Signature(Type::none, tuple1_3);
+ builder[2] = Signature();
+ builder[3] = Signature();
+ builder[4] = Signature(Type::none, temp0);
+ builder[5] = Signature(Type::none, temp1);
built = builder.build();
}
std::cout << built[0] << "\n";
@@ -210,16 +213,38 @@ void test_recursive() {
std::vector<HeapType> built;
{
TypeBuilder builder(2);
- Type temp0 = builder.getTempRefType(0, Nullable);
- builder.setHeapType(0, Signature(Type::none, temp0));
- builder.setHeapType(1, Signature(Type::none, temp0));
+ Type temp0 = builder.getTempRefType(builder[0], Nullable);
+ builder[0] = Signature(Type::none, temp0);
+ builder[1] = Signature(Type::none, temp0);
+ built = builder.build();
+ }
+ std::cout << built[0] << "\n";
+ std::cout << built[1] << "\n\n";
+ assert(built[0].getSignature().results.getHeapType() == built[0]);
+ assert(built[1].getSignature().results.getHeapType() == built[0]);
+ assert(built[0] == built[1]);
+ }
+
+ {
+ // Including a basic heap type
+ std::vector<HeapType> built;
+ {
+ TypeBuilder builder(3);
+ Type temp0 = builder.getTempRefType(builder[0], Nullable);
+ Type anyref = builder.getTempRefType(builder[2], Nullable);
+ builder[0] = Signature(anyref, temp0);
+ builder[1] = Signature(anyref, temp0);
+ builder[2] = HeapType::any;
built = builder.build();
}
std::cout << built[0] << "\n";
std::cout << built[1] << "\n\n";
assert(built[0].getSignature().results.getHeapType() == built[0]);
assert(built[1].getSignature().results.getHeapType() == built[0]);
+ assert(built[0].getSignature().params == Type::anyref);
+ assert(built[1].getSignature().params == Type::anyref);
assert(built[0] == built[1]);
+ assert(built[2] == HeapType::any);
}
}
diff --git a/test/example/type-builder.txt b/test/example/type-builder.txt
index a2985c2ed..f65a94321 100644
--- a/test/example/type-builder.txt
+++ b/test/example/type-builder.txt
@@ -43,3 +43,6 @@ After building types:
(func (result (ref null ...1)))
(func (result (ref null ...1)))
+(func (param anyref) (result (ref null ...1)))
+(func (param anyref) (result (ref null ...1)))
+