| #include "wasm-traversal.h" | |
| #include "wasm.h" | |
| #include "gtest/gtest.h" | |
| using LeavesTest = ::testing::Test; | |
| using namespace wasm; | |
| TEST_F(LeavesTest, Manual) { | |
| // Verify some interesting cases manually. | |
| // LocalGet is a leaf. | |
| EXPECT_TRUE(IsLeaf<LocalGet>::value); | |
| // GlobalSet is not a leaf due to a child. | |
| EXPECT_FALSE(IsLeaf<GlobalSet>::value); | |
| // Return is not a leaf due to an optional child. | |
| EXPECT_FALSE(IsLeaf<Return>::value); | |
| // Call is not a leaf due to a vector of children. | |
| EXPECT_FALSE(IsLeaf<Call>::value); | |
| } | |
| TEST_F(LeavesTest, Automatic) { | |
| // Verify them all automatically. | |
| // Count total expression classes and total with children. | |
| size_t total = 0, totalWithChildren = 0; | |
| #define DELEGATE_FIELD_CASE_START(id) \ | |
| { \ | |
| bool hasChildren = false; | |
| #define DELEGATE_FIELD_CHILD(id, field) hasChildren = true; | |
| #define DELEGATE_FIELD_OPTIONAL_CHILD(id, field) hasChildren = true; | |
| #define DELEGATE_FIELD_CHILD_VECTOR(id, field) hasChildren = true; | |
| // Verify that IsLeaf has the right value. | |
| #define DELEGATE_FIELD_CASE_END(id) \ | |
| EXPECT_EQ(IsLeaf<id>::value, !hasChildren); \ | |
| total++; \ | |
| if (hasChildren) { \ | |
| totalWithChildren++; \ | |
| } \ | |
| } | |
| #define DELEGATE_FIELD_INT(id, field) | |
| #define DELEGATE_FIELD_LITERAL(id, field) | |
| #define DELEGATE_FIELD_NAME(id, field) | |
| #define DELEGATE_FIELD_SCOPE_NAME_DEF(id, field) | |
| #define DELEGATE_FIELD_SCOPE_NAME_USE(id, field) | |
| #define DELEGATE_FIELD_TYPE(id, field) | |
| #define DELEGATE_FIELD_HEAPTYPE(id, field) | |
| #define DELEGATE_FIELD_ADDRESS(id, field) | |
| #define DELEGATE_FIELD_INT_ARRAY(id, field) | |
| #define DELEGATE_FIELD_INT_VECTOR(id, field) | |
| #define DELEGATE_FIELD_NAME_VECTOR(id, field) | |
| #define DELEGATE_FIELD_NAME_USE_VECTOR(id, field) | |
| #define DELEGATE_FIELD_TYPE_VECTOR(id, field) | |
| #define DELEGATE_FIELD_SCOPE_NAME_USE_VECTOR(id, field) | |
| #define DELEGATE_FIELD_MAIN_START | |
| #define DELEGATE_FIELD_MAIN_END | |
| #include "wasm-delegations-fields.def" | |
| // Not all have children (this just verifies the macros are actually doing | |
| // something). | |
| EXPECT_LT(totalWithChildren, total); | |
| EXPECT_GT(totalWithChildren, 0); | |
| EXPECT_GT(total, 0); | |
| } |