From a697046975cb2f952d7cc1e67474f7cd000ed027 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 30 Sep 2022 16:57:55 -0700 Subject: [Wasm GC] Fix .depth() and add testing (#5102) --- src/wasm/wasm-type.cpp | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'src') diff --git a/src/wasm/wasm-type.cpp b/src/wasm/wasm-type.cpp index c77099a1d..d24e42acb 100644 --- a/src/wasm/wasm-type.cpp +++ b/src/wasm/wasm-type.cpp @@ -1392,6 +1392,36 @@ size_t HeapType::getDepth() const { for (auto curr = *this; (super = curr.getSuperType()); curr = *super) { ++depth; } + // In addition to the explicit supertypes we just traversed over, there is + // implicit supertyping wrt basic types. A signature type always has one more + // super, HeapType::func, etc. + if (!isBasic()) { + if (isFunction()) { + depth++; + } else if (isData()) { + // specific struct types <: data <: eq <: any + depth += 3; + } + } else { + // Some basic types have supers. + switch (getBasic()) { + case HeapType::ext: + case HeapType::func: + case HeapType::any: + break; + case HeapType::eq: + depth++; + break; + case HeapType::i31: + case HeapType::data: + case HeapType::string: + case HeapType::stringview_wtf8: + case HeapType::stringview_wtf16: + case HeapType::stringview_iter: + depth += 2; + break; + } + } return depth; } -- cgit v1.2.3