summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/wasm/wasm-binary.cpp31
1 files changed, 17 insertions, 14 deletions
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp
index 91309c906..1d0e99415 100644
--- a/src/wasm/wasm-binary.cpp
+++ b/src/wasm/wasm-binary.cpp
@@ -1393,6 +1393,18 @@ void WasmBinaryWriter::writeInlineBuffer(const char* data, size_t size) {
void WasmBinaryWriter::writeType(Type type) {
if (type.isRef()) {
+ // The only reference types allowed without GC are funcref and externref. We
+ // internally use more refined versions of those types, but we cannot emit
+ // those more refined types.
+ if (!wasm->features.hasGC()) {
+ if (Type::isSubType(type, Type(HeapType::func, Nullable))) {
+ o << S32LEB(BinaryConsts::EncodedType::funcref);
+ return;
+ }
+ assert(Type::isSubType(type, Type(HeapType::ext, Nullable)));
+ o << S32LEB(BinaryConsts::EncodedType::externref);
+ return;
+ }
auto heapType = type.getHeapType();
if (heapType.isBasic() && type.isNullable()) {
switch (heapType.getBasic()) {
@@ -1433,20 +1445,10 @@ void WasmBinaryWriter::writeType(Type type) {
o << S32LEB(BinaryConsts::EncodedType::nullref);
return;
case HeapType::noext:
- // See comment on writeHeapType.
- if (!wasm->features.hasGC()) {
- o << S32LEB(BinaryConsts::EncodedType::externref);
- } else {
- o << S32LEB(BinaryConsts::EncodedType::nullexternref);
- }
+ o << S32LEB(BinaryConsts::EncodedType::nullexternref);
return;
case HeapType::nofunc:
- // See comment on writeHeapType.
- if (!wasm->features.hasGC()) {
- o << S32LEB(BinaryConsts::EncodedType::funcref);
- } else {
- o << S32LEB(BinaryConsts::EncodedType::nullfuncref);
- }
+ o << S32LEB(BinaryConsts::EncodedType::nullfuncref);
return;
}
}
@@ -1491,9 +1493,10 @@ void WasmBinaryWriter::writeHeapType(HeapType type) {
// only actually valid with GC enabled. When GC is not enabled, emit the
// corresponding valid top types instead.
if (!wasm->features.hasGC()) {
- if (type == HeapType::nofunc || type.isSignature()) {
+ if (HeapType::isSubType(type, HeapType::func)) {
type = HeapType::func;
- } else if (type == HeapType::noext) {
+ } else {
+ assert(HeapType::isSubType(type, HeapType::ext));
type = HeapType::ext;
}
}