@@ -3428,18 +3428,20 @@ and GenFormalSlotsig m cenv eenv (TSlotSig(_,typ,ctps,mtps,paraml,returnTy)) =
34283428let eenvForSlotSig = EnvForTypars( ctps@ mtps) eenv
34293429let ilParams = paraml|> List.map( GenSlotParam m cenv eenvForSlotSig)
34303430let ilRetTy = GenReturnType cenv.amap m eenvForSlotSig.tyenv returnTy
3431- let ilReturn = mkILReturn ilRetTy
3432- ilTy, ilParams, ilReturn
3431+ let ilRet = mkILReturn ilRetTy
3432+ ilTy, ilParams, ilRet
34333433
34343434and instSlotParam inst ( TSlotParam ( nm , ty , inFlag , fl2 , fl3 , attrs )) = TSlotParam( nm, instType inst ty, inFlag, fl2, fl3, attrs)
34353435
3436- and GenActualSlotsig m cenv eenv ( TSlotSig ( _ , typ , ctps , mtps , paraml , returnTy )) methTyparsOfOverridingMethod =
3437- let paraml = List.concatparaml
3436+ and GenActualSlotsig m cenv eenv ( TSlotSig ( _ , typ , ctps , mtps , ilSlotParams , ilSlotRetTy )) methTyparsOfOverridingMethod ( methodParams : Val list ) =
3437+ let ilSlotParams = List.concatilSlotParams
34383438let instForSlotSig = mkTyparInst( ctps@ mtps) ( argsOfAppTy cenv.g typ@ generalizeTypars methTyparsOfOverridingMethod)
3439- let ilParams = paraml|> List.map( instSlotParam instForSlotSig>> GenSlotParam m cenv eenv)
3440- let ilRetTy = GenReturnType cenv.amap m eenv.tyenv( Option.map( instType instForSlotSig) returnTy)
3441- let ilReturn = mkILReturn ilRetTy
3442- ilParams, ilReturn
3439+ let ilParams = ilSlotParams|> List.map( instSlotParam instForSlotSig>> GenSlotParam m cenv eenv)
3440+ // Use the better names if available
3441+ let ilParams = if ilParams.Length= methodParams.Lengththen ( ilParams, methodParams) ||> List.map2( fun p pv -> { pwith Name= Some( nameOfVal pv) }) else ilParams
3442+ let ilRetTy = GenReturnType cenv.amap m eenv.tyenv( Option.map( instType instForSlotSig) ilSlotRetTy)
3443+ let iLRet = mkILReturn ilRetTy
3444+ ilParams, iLRet
34433445
34443446and GenNameOfOverridingMethod cenv ( useMethodImpl ,( TSlotSig ( nameOfOverridenMethod , enclTypOfOverridenMethod , _ , _ , _ , _ ))) =
34453447if useMethodImplthen qualifiedMangledNameOfTyconRef( tcrefOfAppTy cenv.g enclTypOfOverridenMethod) nameOfOverridenMethodelse nameOfOverridenMethod
@@ -3453,7 +3455,7 @@ and GenMethodImpl cenv eenv (useMethodImpl,(TSlotSig(nameOfOverridenMethod,_,_,_
34533455let ilOverrideTyRef = ilOverrideTy.TypeRef
34543456let ilOverrideMethRef = mkILMethRef( ilOverrideTyRef, ILCallingConv.Instance, nameOfOverridenMethod, List.length( DropErasedTypars methTyparsOfOverridingMethod), ( typesOfILParams ilOverrideParams), ilOverrideRet.Type)
34553457let eenvForOverrideBy = AddTyparsToEnv methTyparsOfOverridingMethod eenv
3456- let ilParamsOfOverridingMethod , ilReturnOfOverridingMethod = GenActualSlotsig m cenv eenvForOverrideBy slotsig methTyparsOfOverridingMethod
3458+ let ilParamsOfOverridingMethod , ilReturnOfOverridingMethod = GenActualSlotsig m cenv eenvForOverrideBy slotsig methTyparsOfOverridingMethod[]
34573459let ilOverrideMethGenericParams = GenGenericParams cenv eenvForOverrideBy methTyparsOfOverridingMethod
34583460let ilOverrideMethGenericArgs = mkILFormalGenericArgs0 ilOverrideMethGenericParams
34593461let ilOverrideBy = mkILInstanceMethSpecInTy( ilTyForOverriding, nameOfOverridingMethod, typesOfILParams ilParamsOfOverridingMethod, ilReturnOfOverridingMethod.Type, ilOverrideMethGenericArgs)
@@ -3500,11 +3502,12 @@ and GenObjectMethod cenv eenvinner (cgbuf:CodeGenBuffer) useMethodImpl tmethod =
35003502[]
35013503else
35023504let eenvUnderTypars = AddTyparsToEnv methTyparsOfOverridingMethod eenvinner
3503- let ilParamsOfOverridingMethod , ilReturnOfOverridingMethod = GenActualSlotsig m cenv eenvUnderTypars slotsig methTyparsOfOverridingMethod
3505+ let methodParams = List.concat methodParams
3506+ let methodParamsNonSelf = match methodParamswith [] -> [] | _:: t-> t// drop the 'this' arg when computing better argument names for IL parameters
3507+ let ilParamsOfOverridingMethod , ilReturnOfOverridingMethod = GenActualSlotsig m cenv eenvUnderTypars slotsig methTyparsOfOverridingMethod methodParamsNonSelf
35043508let ilAttribs = GenAttrs cenv eenvinner attribs
35053509
35063510// Args are stored starting at #1
3507- let methodParams = List.concat methodParams
35083511let eenvForMeth = AddStorageForLocalVals cenv.g( methodParams|> List.mapi( fun i v -> ( v, Arg i))) eenvUnderTypars
35093512let ilMethodBody = CodeGenMethodForExpr cenv cgbuf.mgbuf( SPAlways,[], nameOfOverridenMethod, eenvForMeth, 0 , 0 , methodBodyExpr,( if slotSigHasVoidReturnTy slotsigthen discardAndReturnVoidelse Return))
35103513
@@ -4081,12 +4084,13 @@ and GenDelegateExpr cenv cgbuf eenvouter expr (TObjExprMethod((TSlotSig(_,delega
40814084
40824085let envForDelegeeUnderTypars = AddTyparsToEnv methTyparsOfOverridingMethod eenvinner
40834086
4087+ let numthis = 1
4088+ let tmvs , body = BindUnitVars cenv.g( tmvs, List.replicate( List.concat slotsig.FormalParams) .Length ValReprInfo.unnamedTopArg1, body)
4089+
40844090// The slot sig contains a formal instantiation. When creating delegates we're only
40854091// interested in the actual instantiation since we don't have to emit a method impl.
4086- let ilDelegeeParams , ilDelegeeRet = GenActualSlotsig m cenv envForDelegeeUnderTypars slotsig methTyparsOfOverridingMethod
4092+ let ilDelegeeParams , ilDelegeeRet = GenActualSlotsig m cenv envForDelegeeUnderTypars slotsig methTyparsOfOverridingMethod tmvs
40874093
4088- let numthis = 1
4089- let tmvs , body = BindUnitVars cenv.g( tmvs, List.replicate( List.concat slotsig.FormalParams) .Length ValReprInfo.unnamedTopArg1, body)
40904094let envForDelegeeMeth = AddStorageForLocalVals cenv.g( List.mapi( fun i v -> ( v, Arg( i+ numthis))) tmvs) envForDelegeeUnderTypars
40914095let ilMethodBody = CodeGenMethodForExpr cenv cgbuf.mgbuf( SPAlways,[], delegeeMethName, envForDelegeeMeth, 1 , 0 , body,( if slotSigHasVoidReturnTy slotsigthen discardAndReturnVoidelse Return))
40924096let delegeeInvokeMeth =
@@ -6482,7 +6486,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) =
64826486match paramlwith
64836487| [[ tsp]] when isUnitTy cenv.g tsp.Type-> [] (* suppress unit arg*)
64846488| paraml-> paraml
6485- GenActualSlotsig m cenv eenvinner( TSlotSig( nm, typ, ctps, mtps, paraml, returnTy)) []
6489+ GenActualSlotsig m cenv eenvinner( TSlotSig( nm, typ, ctps, mtps, paraml, returnTy)) [] []
64866490for ilMethodDefin mkILDelegateMethods cenv.g.ilg( cenv.g.iltyp_ AsyncCallback, cenv.g.iltyp_ IAsyncResult) ( p, r) do
64876491yield { ilMethodDefwith Access= reprAccess}
64886492| _ ->