@@ -74,7 +74,8 @@ Literal::Literal(std::shared_ptr<GCData> gcData, HeapType type)
7474 : gcData(gcData), type(type, gcData ? NonNullable : Nullable) {
7575 // The type must be a proper type for GC data: either a struct, array, or
7676 // string; or an externalized version of the same; or a null.
77- assert ((isData () && gcData) || (type == HeapType::ext && gcData) ||
77+ assert ((isData () && gcData) ||
78+ (type.isMaybeShared (HeapType::ext) && gcData) ||
7879 (type.isBottom () && !gcData));
7980}
8081
@@ -115,7 +116,7 @@ Literal::Literal(const Literal& other) : type(other.type) {
115116 new (&gcData) std::shared_ptr<GCData>();
116117 return ;
117118 }
118- if (other.isData () || other.type .getHeapType () == HeapType::ext) {
119+ if (other.isData () || other.type .getHeapType (). isMaybeShared ( HeapType::ext) ) {
119120 new (&gcData) std::shared_ptr<GCData>(other.gcData );
120121 return ;
121122 }
@@ -160,7 +161,7 @@ Literal::~Literal() {
160161 if (type.isBasic ()) {
161162 return ;
162163 }
163- if (isNull () || isData () || type.getHeapType () == HeapType::ext) {
164+ if (isNull () || isData () || type.getHeapType (). isMaybeShared ( HeapType::ext) ) {
164165 gcData.~shared_ptr ();
165166 }
166167}
@@ -2684,36 +2685,29 @@ Literal Literal::relaxedFmsF64x2(const Literal& left,
26842685}
26852686
26862687Literal Literal::externalize () const {
2687- assert (Type::isSubType ( type, Type ( HeapType::any, Nullable)) &&
2688+ assert (type. isRef () && type. getHeapType (). getUnsharedTop () == HeapType::any &&
26882689 " can only externalize internal references" );
26892690 if (isNull ()) {
26902691 return Literal (std::shared_ptr<GCData>{}, HeapType::noext);
26912692 }
26922693 auto heapType = type.getHeapType ();
26932694 auto extType = HeapTypes::ext.getBasic (heapType.getShared ());
2694- if (heapType.isBasic ()) {
2695- switch (heapType.getBasic (Unshared)) {
2696- case HeapType::i31: {
2697- return Literal (std::make_shared<GCData>(HeapType::i31, Literals{*this }),
2698- extType);
2699- }
2700- case HeapType::string:
2701- WASM_UNREACHABLE (" TODO: string literals" );
2702- default :
2703- WASM_UNREACHABLE (" unexpected type" );
2704- }
2695+ if (heapType.isMaybeShared (HeapType::i31)) {
2696+ return Literal (std::make_shared<GCData>(heapType, Literals{*this }),
2697+ extType);
27052698 }
27062699 return Literal (gcData, extType);
27072700}
27082701
27092702Literal Literal::internalize () const {
2710- assert (Type::isSubType (type, Type (HeapType::ext, Nullable)) &&
2703+ auto extType = HeapTypes::ext.getBasic (type.getHeapType ().getShared ());
2704+ assert (Type::isSubType (type, Type (extType, Nullable)) &&
27112705 " can only internalize external references" );
27122706 if (isNull ()) {
27132707 return Literal (std::shared_ptr<GCData>{}, HeapType::none);
27142708 }
2715- if (gcData->type == HeapType::i31) {
2716- assert (gcData->values [0 ].type .getHeapType () == HeapType::i31);
2709+ if (gcData->type . isMaybeShared ( HeapType::i31) ) {
2710+ assert (gcData->values [0 ].type .getHeapType (). isMaybeShared ( HeapType::i31) );
27172711 return gcData->values [0 ];
27182712 }
27192713 return Literal (gcData, gcData->type );
0 commit comments