@@ -3839,23 +3839,6 @@ function determinePackedType(type: Type): PackedType {
38393839 return PackedType . NotPacked ;
38403840}
38413841
3842- /** Prepares a type, preserving nullable reference types. */
3843- function prepareTypeWithNullability (
3844- builder : binaryen . TypeBuilderRef ,
3845- seen : Map < Type , HeapTypeRef > ,
3846- type : Type
3847- ) : TypeRef {
3848- return type . is ( TypeFlags . Nullable )
3849- ? binaryen . _TypeBuilderGetTempRefType (
3850- builder ,
3851- binaryen . _BinaryenTypeGetHeapType (
3852- prepareType ( builder , seen , type . nonNullableType )
3853- ) ,
3854- true
3855- )
3856- : prepareType ( builder , seen , type ) ;
3857- }
3858-
38593842/** Recursively prepares the given GC type, potentially returning a temporary type. */
38603843function prepareType ( builder : binaryen . TypeBuilderRef , seen : Map < Type , HeapTypeRef > , type : Type ) : TypeRef {
38613844 // Obtain basic type if applicable
@@ -3916,7 +3899,17 @@ function prepareType(builder: binaryen.TypeBuilderRef, seen: Map<Type,HeapTypeRe
39163899 if ( DEBUG_TYPEBUILDER ) {
39173900 console . log ( ` field ${ fieldType . toString ( ) } ` ) ;
39183901 }
3919- fieldTypes . push ( prepareTypeWithNullability ( builder , seen , fieldType ) ) ;
3902+ fieldTypes . push (
3903+ fieldType . is ( TypeFlags . Nullable )
3904+ ? binaryen . _TypeBuilderGetTempRefType (
3905+ builder ,
3906+ binaryen . _BinaryenTypeGetHeapType (
3907+ prepareType ( builder , seen , fieldType . nonNullableType )
3908+ ) ,
3909+ true
3910+ )
3911+ : prepareType ( builder , seen , fieldType )
3912+ ) ;
39203913 packedTypes . push ( determinePackedType ( fieldType ) ) ;
39213914 fieldMutables . push ( 1 ) ;
39223915 }
@@ -3958,17 +3951,50 @@ function prepareType(builder: binaryen.TypeBuilderRef, seen: Map<Type,HeapTypeRe
39583951 let resultTypes = new Array < TypeRef > ( ) ;
39593952 let parameterTypes = signatureReference . parameterTypes ;
39603953 for ( let i = 0 , k = parameterTypes . length ; i < k ; ++ i ) {
3961- paramTypes . push ( prepareTypeWithNullability ( builder , seen , parameterTypes [ i ] ) ) ;
3954+ let paramType = parameterTypes [ i ] ;
3955+ paramTypes . push (
3956+ paramType . is ( TypeFlags . Nullable )
3957+ ? binaryen . _TypeBuilderGetTempRefType (
3958+ builder ,
3959+ binaryen . _BinaryenTypeGetHeapType (
3960+ prepareType ( builder , seen , paramType . nonNullableType )
3961+ ) ,
3962+ true
3963+ )
3964+ : prepareType ( builder , seen , paramType )
3965+ ) ;
39623966 }
39633967 let returnTypes = signatureReference . returnTypes ;
39643968 if ( returnTypes ) {
39653969 for ( let i = 0 , k = returnTypes . length ; i < k ; ++ i ) {
3966- resultTypes . push ( prepareTypeWithNullability ( builder , seen , returnTypes [ i ] ) ) ;
3970+ let returnType = returnTypes [ i ] ;
3971+ resultTypes . push (
3972+ returnType . is ( TypeFlags . Nullable )
3973+ ? binaryen . _TypeBuilderGetTempRefType (
3974+ builder ,
3975+ binaryen . _BinaryenTypeGetHeapType (
3976+ prepareType ( builder , seen , returnType . nonNullableType )
3977+ ) ,
3978+ true
3979+ )
3980+ : prepareType ( builder , seen , returnType )
3981+ ) ;
39673982 }
39683983 } else if ( signatureReference . returnType == Type . void ) {
39693984 resultTypes . push ( TypeRef . None ) ;
39703985 } else {
3971- resultTypes . push ( prepareTypeWithNullability ( builder , seen , signatureReference . returnType ) ) ;
3986+ let returnType = signatureReference . returnType ;
3987+ resultTypes . push (
3988+ returnType . is ( TypeFlags . Nullable )
3989+ ? binaryen . _TypeBuilderGetTempRefType (
3990+ builder ,
3991+ binaryen . _BinaryenTypeGetHeapType (
3992+ prepareType ( builder , seen , returnType . nonNullableType )
3993+ ) ,
3994+ true
3995+ )
3996+ : prepareType ( builder , seen , returnType )
3997+ ) ;
39723998 }
39733999 let tempParamType : TypeRef ;
39744000 if ( paramTypes . length > 1 ) {
0 commit comments