From 060442225165d0423d06ea33ab865e850b54f61b Mon Sep 17 00:00:00 2001 From: Thomas Lively <7121787+tlively@users.noreply.github.com> Date: Thu, 20 Jan 2022 16:39:27 -0800 Subject: Reset global type state between tests (#4468) Add a `destroyAllTypes` function to clear the global state of the type system and use it in a custom gtest test fixture to ensure that each test starts and ends with a fresh state. --- src/wasm-type.h | 5 +++++ src/wasm/wasm-type.cpp | 13 +++++++++++++ 2 files changed, 18 insertions(+) (limited to 'src') diff --git a/src/wasm-type.h b/src/wasm-type.h index 7d6306ef7..48b6f2217 100644 --- a/src/wasm-type.h +++ b/src/wasm-type.h @@ -45,6 +45,11 @@ void setTypeSystem(TypeSystem system); TypeSystem getTypeSystem(); +// Dangerous! Frees all types and heap types that have ever been created and +// resets the type system's internal state. This is only really meant to be used +// for tests. +void destroyAllTypesForTestingPurposesOnly(); + // The types defined in this file. All of them are small and typically passed by // value except for `Tuple` and `Struct`, which may own an unbounded amount of // data. diff --git a/src/wasm/wasm-type.cpp b/src/wasm/wasm-type.cpp index fc42fe230..af382da23 100644 --- a/src/wasm/wasm-type.cpp +++ b/src/wasm/wasm-type.cpp @@ -653,6 +653,11 @@ template struct Store { } bool hasCanonical(const Info& info, typename Info::type_t& canonical); + void clear() { + typeIDs.clear(); + constructedTypes.clear(); + } + private: template typename Info::type_t doInsert(Ref& infoRef) { const Info& info = [&]() { @@ -754,12 +759,20 @@ struct SignatureTypeCache { std::lock_guard lock(mutex); cache.insert({type.getSignature(), type}); } + + void clear() { cache.clear(); } }; static SignatureTypeCache nominalSignatureCache; } // anonymous namespace +void destroyAllTypesForTestingPurposesOnly() { + globalTypeStore.clear(); + globalHeapTypeStore.clear(); + nominalSignatureCache.clear(); +} + Type::Type(std::initializer_list types) : Type(Tuple(types)) {} Type::Type(const Tuple& tuple) { -- cgit v1.2.3