diff options
Diffstat (limited to 'src/wasm')
-rw-r--r-- | src/wasm/wasm-type.cpp | 30 |
1 files changed, 30 insertions, 0 deletions
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; } |