@@ -5703,10 +5703,11 @@ export class Compiler extends DiagnosticEmitter {
5703
5703
assert ( targetType != Type . void ) ;
5704
5704
let valueExpr = this . compileExpression ( valueExpression , targetType ) ;
5705
5705
let valueType = this . currentType ;
5706
+ if ( targetType . isNullableReference && this . currentFlow . isNonnull ( valueExpr , valueType ) ) targetType = targetType . nonNullableType ;
5706
5707
return this . makeAssignment (
5707
5708
target ,
5708
5709
this . convertExpression ( valueExpr , valueType , targetType , false , valueExpression ) ,
5709
- valueType ,
5710
+ targetType ,
5710
5711
valueExpression ,
5711
5712
thisExpression ,
5712
5713
elementExpression ,
@@ -5799,6 +5800,7 @@ export class Compiler extends DiagnosticEmitter {
5799
5800
return module . unreachable ( ) ;
5800
5801
}
5801
5802
assert ( setterInstance . signature . parameterTypes . length == 1 ) ;
5803
+ assert ( setterInstance . signature . returnType == Type . void ) ;
5802
5804
if ( propertyInstance . is ( CommonFlags . Instance ) ) {
5803
5805
let thisType = assert ( setterInstance . signature . thisType ) ;
5804
5806
let thisExpr = this . compileExpression (
@@ -5807,28 +5809,29 @@ export class Compiler extends DiagnosticEmitter {
5807
5809
Constraints . ConvImplicit | Constraints . IsThis
5808
5810
) ;
5809
5811
if ( ! tee ) return this . makeCallDirect ( setterInstance , [ thisExpr , valueExpr ] , valueExpression ) ;
5810
- let getterInstance = assert ( ( < Property > target ) . getterInstance ) ;
5811
- assert ( getterInstance . signature . thisType == thisType ) ;
5812
- let returnType = getterInstance . signature . returnType ;
5813
- let returnTypeRef = returnType . toRef ( ) ;
5814
- let tempThis = flow . getTempLocal ( thisType ) ;
5812
+ let tempLocal = flow . getTempLocal ( valueType ) ;
5813
+ let valueTypeRef = valueType . toRef ( ) ;
5815
5814
let ret = module . block ( null , [
5816
5815
this . makeCallDirect ( setterInstance , [
5817
- module . local_tee ( tempThis . index , thisExpr , /* isManaged=*/ false , thisType . toRef ( ) ) , // thisType is managed but here it must be alive
5818
- valueExpr
5816
+ thisExpr ,
5817
+ module . local_tee ( tempLocal . index , valueExpr , valueType . isManaged , valueTypeRef )
5819
5818
] , valueExpression ) ,
5820
- this . makeCallDirect ( getterInstance , [
5821
- module . local_get ( tempThis . index , thisType . toRef ( ) )
5822
- ] , valueExpression )
5823
- ] , returnTypeRef ) ;
5819
+ module . local_get ( tempLocal . index , valueTypeRef ) ,
5820
+ ] , valueTypeRef ) ;
5821
+ this . currentType = valueType ;
5824
5822
return ret ;
5825
5823
} else {
5826
5824
if ( ! tee ) return this . makeCallDirect ( setterInstance , [ valueExpr ] , valueExpression ) ;
5827
- let getterInstance = assert ( ( < Property > target ) . getterInstance ) ;
5828
- return module . block ( null , [
5829
- this . makeCallDirect ( setterInstance , [ valueExpr ] , valueExpression ) ,
5830
- this . makeCallDirect ( getterInstance , null , valueExpression )
5831
- ] , getterInstance . signature . returnType . toRef ( ) ) ;
5825
+ let tempLocal = flow . getTempLocal ( valueType ) ;
5826
+ let valueTypeRef = valueType . toRef ( ) ;
5827
+ let ret = module . block ( null , [
5828
+ this . makeCallDirect ( setterInstance , [
5829
+ module . local_tee ( tempLocal . index , valueExpr , valueType . isManaged , valueTypeRef ) ,
5830
+ ] , valueExpression ) ,
5831
+ module . local_get ( tempLocal . index , valueTypeRef ) ,
5832
+ ] , valueTypeRef ) ;
5833
+ this . currentType = valueType ;
5834
+ return ret ;
5832
5835
}
5833
5836
}
5834
5837
case ElementKind . IndexSignature : {
0 commit comments