Skip to content

Commit 1b39cde

Browse files
authored
Fix immediate delegate invoke (#12920)
* Fix #5607 * Fix #5607
1 parent 3fa8ebe commit 1b39cde

File tree

12 files changed

+151
-107
lines changed

12 files changed

+151
-107
lines changed

src/fsharp/CheckExpressions.fs

Lines changed: 46 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -8953,26 +8953,39 @@ and TcValueItemThen cenv overallTy env vref tpenv mItem afterResolution delayed
89538953
and TcPropertyItemThen cenv overallTy env nm pinfos tpenv mItem afterResolution delayed =
89548954
let g = cenv.g
89558955
let ad = env.eAccessRights
8956-
if isNil pinfos then error (InternalError ("Unexpected error: empty property list", mItem))
8957-
// if there are both intrinsics and extensions in pinfos, intrinsics will be listed first.
8956+
8957+
if isNil pinfos then
8958+
error (InternalError ("Unexpected error: empty property list", mItem))
8959+
8960+
// If there are both intrinsics and extensions in pinfos, intrinsics will be listed first.
89588961
// by looking at List.Head we are letting the intrinsics determine indexed/non-indexed
89598962
let pinfo = List.head pinfos
8963+
89608964
let _, tyargsOpt, args, delayed, tpenv =
8961-
if pinfo.IsIndexer
8962-
then GetMemberApplicationArgs delayed cenv env tpenv
8963-
else ExprAtomicFlag.Atomic, None, [mkSynUnit mItem], delayed, tpenv
8964-
if not pinfo.IsStatic then error (Error (FSComp.SR.tcPropertyIsNotStatic nm, mItem))
8965+
if pinfo.IsIndexer then
8966+
GetMemberApplicationArgs delayed cenv env tpenv
8967+
else
8968+
ExprAtomicFlag.Atomic, None, [mkSynUnit mItem], delayed, tpenv
8969+
8970+
if not pinfo.IsStatic then
8971+
error (Error (FSComp.SR.tcPropertyIsNotStatic nm, mItem))
8972+
89658973
match delayed with
89668974
| DelayedSet(e2, mStmt) :: otherDelayed ->
89678975
if not (isNil otherDelayed) then error(Error(FSComp.SR.tcInvalidAssignment(), mStmt))
8976+
89688977
// Static Property Set (possibly indexer)
89698978
UnifyTypes cenv env mStmt overallTy.Commit g.unit_ty
8979+
89708980
let meths = pinfos |> SettersOfPropInfos
8981+
89718982
if meths.IsEmpty then
89728983
let meths = pinfos |> GettersOfPropInfos
89738984
let isByrefMethReturnSetter = meths |> List.exists (function _,Some pinfo -> isByrefTy g (pinfo.GetPropertyType(cenv.amap,mItem)) | _ -> false)
8985+
89748986
if not isByrefMethReturnSetter then
89758987
errorR (Error (FSComp.SR.tcPropertyCannotBeSet1 nm, mItem))
8988+
89768989
// x.P <- ... byref setter
89778990
if isNil meths then error (Error (FSComp.SR.tcPropertyIsNotReadable nm, mItem))
89788991
TcMethodApplicationThen cenv env overallTy None tpenv tyargsOpt [] mItem mItem nm ad NeverMutates true meths afterResolution NormalValUse args ExprAtomicFlag.Atomic delayed
@@ -9067,7 +9080,6 @@ and GetSynMemberApplicationArgs delayed tpenv =
90679080
| otherDelayed ->
90689081
(ExprAtomicFlag.NonAtomic, None, [], otherDelayed, tpenv)
90699082

9070-
90719083
and TcMemberTyArgsOpt cenv env tpenv tyargsOpt =
90729084
match tyargsOpt with
90739085
| None -> None, tpenv
@@ -9233,15 +9245,15 @@ and TcEventItemThen cenv overallTy env tpenv mItem mExprAndItem objDetails (einf
92339245
| None, false -> error (Error (FSComp.SR.tcEventIsNotStatic nm, mItem))
92349246
| _ -> ()
92359247

9236-
let delegateType = einfo.GetDelegateType(cenv.amap, mItem)
9237-
let (SigOfFunctionForDelegate(invokeMethInfo, compiledViewOfDelArgTys, _, _)) = GetSigOfFunctionForDelegate cenv.infoReader delegateType mItem ad
9248+
let delTy = einfo.GetDelegateType(cenv.amap, mItem)
9249+
let (SigOfFunctionForDelegate(delInvokeMeth, delArgTys, _, _)) = GetSigOfFunctionForDelegate cenv.infoReader delTy mItem ad
92389250
let objArgs = Option.toList (Option.map fst objDetails)
9239-
MethInfoChecks g cenv.amap true None objArgs env.eAccessRights mItem invokeMethInfo
9251+
MethInfoChecks g cenv.amap true None objArgs env.eAccessRights mItem delInvokeMeth
92409252

92419253
// This checks for and drops the 'object' sender
92429254
let argsTy = ArgsTypOfEventInfo cenv.infoReader mItem ad einfo
9243-
if not (slotSigHasVoidReturnTy (invokeMethInfo.GetSlotSig(cenv.amap, mItem))) then errorR (nonStandardEventError einfo.EventName mItem)
9244-
let delEventTy = mkIEventType g delegateType argsTy
9255+
if not (slotSigHasVoidReturnTy (delInvokeMeth.GetSlotSig(cenv.amap, mItem))) then errorR (nonStandardEventError einfo.EventName mItem)
9256+
let delEventTy = mkIEventType g delTy argsTy
92459257

92469258
let bindObjArgs f =
92479259
match objDetails with
@@ -9253,17 +9265,17 @@ and TcEventItemThen cenv overallTy env tpenv mItem mExprAndItem objDetails (einf
92539265
let expr =
92549266
bindObjArgs (fun objVars ->
92559267
// EventHelper ((fun d -> e.add_X(d)), (fun d -> e.remove_X(d)), (fun f -> new 'Delegate(f)))
9256-
mkCallCreateEvent g mItem delegateType argsTy
9257-
(let dv, de = mkCompGenLocal mItem "eventDelegate" delegateType
9268+
mkCallCreateEvent g mItem delTy argsTy
9269+
(let dv, de = mkCompGenLocal mItem "eventDelegate" delTy
92589270
let callExpr, _ = BuildPossiblyConditionalMethodCall cenv env PossiblyMutates mItem false einfo.AddMethod NormalValUse [] objVars [de]
92599271
mkLambda mItem dv (callExpr, g.unit_ty))
9260-
(let dv, de = mkCompGenLocal mItem "eventDelegate" delegateType
9272+
(let dv, de = mkCompGenLocal mItem "eventDelegate" delTy
92619273
let callExpr, _ = BuildPossiblyConditionalMethodCall cenv env PossiblyMutates mItem false einfo.RemoveMethod NormalValUse [] objVars [de]
92629274
mkLambda mItem dv (callExpr, g.unit_ty))
92639275
(let fvty = mkFunTy g g.obj_ty (mkFunTy g argsTy g.unit_ty)
92649276
let fv, fe = mkCompGenLocal mItem "callback" fvty
9265-
let createExpr = BuildNewDelegateExpr (Some einfo, g, cenv.amap, delegateType, invokeMethInfo, compiledViewOfDelArgTys, fe, fvty, mItem)
9266-
mkLambda mItem fv (createExpr, delegateType)))
9277+
let createExpr = BuildNewDelegateExpr (Some einfo, g, cenv.amap, delTy, delInvokeMeth, delArgTys, fe, fvty, mItem)
9278+
mkLambda mItem fv (createExpr, delTy)))
92679279

92689280
let exprty = delEventTy
92699281
PropagateThenTcDelayed cenv overallTy env tpenv mExprAndItem (MakeApplicableExprNoFlex cenv expr) exprty ExprAtomicFlag.Atomic delayed
@@ -9986,23 +9998,28 @@ and TcMethodArg cenv env (lambdaPropagationInfo, tpenv) (lambdaPropagationInfoFo
99869998

99879999
CallerArg(callerArgTy, mArg, isOpt, e'), (lambdaPropagationInfo, tpenv)
998810000

9989-
/// Typecheck "new Delegate(fun x y z -> ...)" constructs
9990-
and TcNewDelegateThen cenv (overallTy: OverallTy) env tpenv mDelTy mExprAndArg delegateTy arg atomicFlag delayed =
10001+
/// Typecheck "Delegate(fun x y z -> ...)" constructs
10002+
and TcNewDelegateThen cenv (overallTy: OverallTy) env tpenv mDelTy mExprAndArg delegateTy synArg atomicFlag delayed =
999110003
let g = cenv.g
999210004
let ad = env.eAccessRights
9993-
UnifyTypes cenv env mExprAndArg overallTy.Commit delegateTy
9994-
let (SigOfFunctionForDelegate(invokeMethInfo, delArgTys, _, fty)) = GetSigOfFunctionForDelegate cenv.infoReader delegateTy mDelTy ad
10005+
10006+
let intermediateTy = if isNil delayed then overallTy.Commit else NewInferenceType g
10007+
10008+
UnifyTypes cenv env mExprAndArg intermediateTy delegateTy
10009+
10010+
let (SigOfFunctionForDelegate(delInvokeMeth, delArgTys, _, delFuncTy)) = GetSigOfFunctionForDelegate cenv.infoReader delegateTy mDelTy ad
999510011

999610012
// We pass isInstance = true here because we're checking the rights to access the "Invoke" method
9997-
MethInfoChecks g cenv.amap true None [] env.eAccessRights mExprAndArg invokeMethInfo
9998-
let args = GetMethodArgs arg
10013+
MethInfoChecks g cenv.amap true None [] env.eAccessRights mExprAndArg delInvokeMeth
999910014

10000-
match args with
10001-
| [farg], [] ->
10002-
let m = arg.Range
10003-
let callerArg, (_, tpenv) = TcMethodArg cenv env (Array.empty, tpenv) (Array.empty, CallerArg(fty, m, false, farg))
10004-
let expr = BuildNewDelegateExpr (None, g, cenv.amap, delegateTy, invokeMethInfo, delArgTys, callerArg.Expr, fty, m)
10005-
PropagateThenTcDelayed cenv overallTy env tpenv m (MakeApplicableExprNoFlex cenv expr) delegateTy atomicFlag delayed
10015+
let synArgs = GetMethodArgs synArg
10016+
10017+
match synArgs with
10018+
| [synFuncArg], [] ->
10019+
let m = synArg.Range
10020+
let callerArg, (_, tpenv) = TcMethodArg cenv env (Array.empty, tpenv) (Array.empty, CallerArg(delFuncTy, m, false, synFuncArg))
10021+
let expr = BuildNewDelegateExpr (None, g, cenv.amap, delegateTy, delInvokeMeth, delArgTys, callerArg.Expr, delFuncTy, m)
10022+
PropagateThenTcDelayed cenv overallTy env tpenv m (MakeApplicableExprNoFlex cenv expr) intermediateTy atomicFlag delayed
1000610023
| _ ->
1000710024
error(Error(FSComp.SR.tcDelegateConstructorMustBePassed(), mExprAndArg))
1000810025

src/fsharp/InfoReader.fs

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -900,38 +900,49 @@ let GetIntrinisicMostSpecificOverrideMethInfoSetsOfType (infoReader: InfoReader)
900900
/// The Invoke MethInfo, the function argument types, the function return type
901901
/// and the overall F# function type for the function type associated with a .NET delegate type
902902
[<NoEquality;NoComparison>]
903-
type SigOfFunctionForDelegate = SigOfFunctionForDelegate of MethInfo * TType list * TType * TType
903+
type SigOfFunctionForDelegate =
904+
SigOfFunctionForDelegate of
905+
delInvokeMeth: MethInfo *
906+
delArgTys: TType list *
907+
delRetTy: TType *
908+
delFuncTy: TType
904909

905910
/// Given a delegate type work out the minfo, argument types, return type
906911
/// and F# function type by looking at the Invoke signature of the delegate.
907912
let GetSigOfFunctionForDelegate (infoReader: InfoReader) delty m ad =
908913
let g = infoReader.g
909914
let amap = infoReader.amap
910-
let invokeMethInfo =
915+
let delInvokeMeth =
911916
match GetIntrinsicMethInfosOfType infoReader (Some "Invoke") ad AllowMultiIntfInstantiations.Yes IgnoreOverrides m delty with
912917
| [h] -> h
913918
| [] -> error(Error(FSComp.SR.noInvokeMethodsFound (), m))
914919
| h :: _ -> warning(InternalError(FSComp.SR.moreThanOneInvokeMethodFound (), m)); h
915920

916921
let minst = [] // a delegate's Invoke method is never generic
917-
let compiledViewOfDelArgTys =
918-
match invokeMethInfo.GetParamTypes(amap, m, minst) with
922+
923+
let delArgTys =
924+
match delInvokeMeth.GetParamTypes(amap, m, minst) with
919925
| [args] -> args
920926
| _ -> error(Error(FSComp.SR.delegatesNotAllowedToHaveCurriedSignatures (), m))
927+
921928
let fsharpViewOfDelArgTys =
922-
match compiledViewOfDelArgTys with
929+
match delArgTys with
923930
| [] -> [g.unit_ty]
924-
| _ -> compiledViewOfDelArgTys
925-
let delRetTy = invokeMethInfo.GetFSharpReturnTy(amap, m, minst)
926-
CheckMethInfoAttributes g m None invokeMethInfo |> CommitOperationResult
927-
let fty = mkIteratedFunTy g fsharpViewOfDelArgTys delRetTy
928-
SigOfFunctionForDelegate(invokeMethInfo, compiledViewOfDelArgTys, delRetTy, fty)
931+
| _ -> delArgTys
932+
933+
let delRetTy = delInvokeMeth.GetFSharpReturnTy(amap, m, minst)
934+
935+
CheckMethInfoAttributes g m None delInvokeMeth |> CommitOperationResult
936+
937+
let delFuncTy = mkIteratedFunTy g fsharpViewOfDelArgTys delRetTy
938+
939+
SigOfFunctionForDelegate(delInvokeMeth, delArgTys, delRetTy, delFuncTy)
929940

930941
/// Try and interpret a delegate type as a "standard" .NET delegate type associated with an event, with a "sender" parameter.
931942
let TryDestStandardDelegateType (infoReader: InfoReader) m ad delTy =
932943
let g = infoReader.g
933-
let (SigOfFunctionForDelegate(_, compiledViewOfDelArgTys, delRetTy, _)) = GetSigOfFunctionForDelegate infoReader delTy m ad
934-
match compiledViewOfDelArgTys with
944+
let (SigOfFunctionForDelegate(_, delArgTys, delRetTy, _)) = GetSigOfFunctionForDelegate infoReader delTy m ad
945+
match delArgTys with
935946
| senderTy :: argTys when (isObjTy g senderTy) && not (List.exists (isByrefTy g) argTys) -> Some(mkRefTupledTy g argTys, delRetTy)
936947
| _ -> None
937948

src/fsharp/InfoReader.fsi

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,15 @@ val TryFindIntrinsicPropInfo: infoReader:InfoReader -> m:range -> ad:AccessorDom
159159
/// Get a set of most specific override methods.
160160
val GetIntrinisicMostSpecificOverrideMethInfoSetsOfType: infoReader:InfoReader -> m:range -> ty:TType -> NameMultiMap<TType * MethInfo>
161161

162-
/// The Invoke MethInfo, the function argument types, the function return type
162+
/// Represents information about the delegate - the Invoke MethInfo, the delegate argument types, the delegate return type
163163
/// and the overall F# function type for the function type associated with a .NET delegate type
164164
[<NoEquality; NoComparison>]
165-
type SigOfFunctionForDelegate = | SigOfFunctionForDelegate of MethInfo * TType list * TType * TType
165+
type SigOfFunctionForDelegate =
166+
SigOfFunctionForDelegate of
167+
delInvokeMeth: MethInfo *
168+
delArgTys: TType list *
169+
delRetTy: TType *
170+
delFuncTy: TType
166171

167172
/// Given a delegate type work out the minfo, argument types, return type
168173
/// and F# function type by looking at the Invoke signature of the delegate.

src/fsharp/LowerStateMachines.fs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,9 +229,8 @@ type LowerStateMachine(g: TcGlobals) =
229229
if sm_verbose then printfn "application was partial, reducing further args %A" laterArgs
230230
TryReduceApp env expandedExpr laterArgs
231231

232-
| NewDelegateExpr g (_, macroParamsCurried, macroBody, _, _) ->
232+
| NewDelegateExpr g (_, macroParams, macroBody, _, _) ->
233233
let m = expr.Range
234-
let macroParams = List.concat macroParamsCurried
235234
let macroVal2 = mkLambdas g m [] macroParams (macroBody, tyOfExpr g macroBody)
236235
if args.Length < macroParams.Length then
237236
//warning(Error(FSComp.SR.stateMachineMacroUnderapplied(), m))

src/fsharp/MethodCalls.fs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -139,10 +139,10 @@ type CallerArgs<'T> =
139139

140140
let AdjustDelegateTy (infoReader: InfoReader) actualTy reqdTy m =
141141
let g = infoReader.g
142-
let (SigOfFunctionForDelegate(_, delArgTys, _, fty)) = GetSigOfFunctionForDelegate infoReader reqdTy m AccessibleFromSomewhere
142+
let (SigOfFunctionForDelegate(_, delArgTys, _, delFuncTy)) = GetSigOfFunctionForDelegate infoReader reqdTy m AccessibleFromSomewhere
143143
let delArgTys = if isNil delArgTys then [g.unit_ty] else delArgTys
144144
if (fst (stripFunTy g actualTy)).Length = delArgTys.Length then
145-
fty
145+
delFuncTy
146146
else
147147
reqdTy
148148

@@ -1208,8 +1208,8 @@ let BuildObjCtorCall (g: TcGlobals) m =
12081208
Expr.Op (TOp.ILCall (false, false, false, false, CtorValUsedAsSuperInit, false, true, ilMethRef, [], [], [g.obj_ty]), [], [], m)
12091209

12101210
/// Implements the elaborated form of adhoc conversions from functions to delegates at member callsites
1211-
let BuildNewDelegateExpr (eventInfoOpt: EventInfo option, g, amap, delegateTy, invokeMethInfo: MethInfo, delArgTys, f, fty, m) =
1212-
let slotsig = invokeMethInfo.GetSlotSig(amap, m)
1211+
let BuildNewDelegateExpr (eventInfoOpt: EventInfo option, g, amap, delegateTy, delInvokeMeth: MethInfo, delArgTys, delFuncExpr, delFuncTy, m) =
1212+
let slotsig = delInvokeMeth.GetSlotSig(amap, m)
12131213
let delArgVals, expr =
12141214
let topValInfo = ValReprInfo([], List.replicate (max 1 (List.length delArgTys)) ValReprInfo.unnamedTopArg, ValReprInfo.unnamedRetVal)
12151215

@@ -1219,7 +1219,7 @@ let BuildNewDelegateExpr (eventInfoOpt: EventInfo option, g, amap, delegateTy, i
12191219
if Option.isSome eventInfoOpt then
12201220
None
12211221
else
1222-
tryDestTopLambda g amap topValInfo (f, fty)
1222+
tryDestTopLambda g amap topValInfo (delFuncExpr, delFuncTy)
12231223

12241224
match lambdaContents with
12251225
| None ->
@@ -1238,19 +1238,19 @@ let BuildNewDelegateExpr (eventInfoOpt: EventInfo option, g, amap, delegateTy, i
12381238
| h :: t -> [exprForVal m h; mkRefTupledVars g m t]
12391239
| None ->
12401240
if isNil delArgTys then [mkUnit g m] else List.map (exprForVal m) delArgVals
1241-
mkApps g ((f, fty), [], args, m)
1241+
mkApps g ((delFuncExpr, delFuncTy), [], args, m)
12421242
delArgVals, expr
12431243

12441244
| Some _ ->
1245-
let _, _, _, vsl, body, _ = IteratedAdjustArityOfLambda g amap topValInfo f
1245+
let _, _, _, vsl, body, _ = IteratedAdjustArityOfLambda g amap topValInfo delFuncExpr
12461246
List.concat vsl, body
12471247

12481248
let meth = TObjExprMethod(slotsig, [], [], [delArgVals], expr, m)
12491249
mkObjExpr(delegateTy, None, BuildObjCtorCall g m, [meth], [], m)
12501250

12511251
let CoerceFromFSharpFuncToDelegate g amap infoReader ad callerArgTy m callerArgExpr delegateTy =
1252-
let (SigOfFunctionForDelegate(invokeMethInfo, delArgTys, _, _)) = GetSigOfFunctionForDelegate infoReader delegateTy m ad
1253-
BuildNewDelegateExpr (None, g, amap, delegateTy, invokeMethInfo, delArgTys, callerArgExpr, callerArgTy, m)
1252+
let (SigOfFunctionForDelegate(delInvokeMeth, delArgTys, _, _)) = GetSigOfFunctionForDelegate infoReader delegateTy m ad
1253+
BuildNewDelegateExpr (None, g, amap, delegateTy, delInvokeMeth, delArgTys, callerArgExpr, callerArgTy, m)
12541254

12551255
// Handle adhoc argument conversions
12561256
let rec AdjustExprForTypeDirectedConversions tcVal (g: TcGlobals) amap infoReader ad reqdTy actualTy m expr =

src/fsharp/MethodCalls.fsi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ val BuildMethodCall:
328328
val BuildObjCtorCall: g:TcGlobals -> m:range -> Expr
329329

330330
/// Implements the elaborated form of adhoc conversions from functions to delegates at member callsites
331-
val BuildNewDelegateExpr: eventInfoOpt:EventInfo option * g:TcGlobals * amap:ImportMap * delegateTy:TType * invokeMethInfo:MethInfo * delArgTys:TType list * f:Expr * fty:TType * m:range -> Expr
331+
val BuildNewDelegateExpr: eventInfoOpt:EventInfo option * g:TcGlobals * amap:ImportMap * delegateTy:TType * delInvokeMeth:MethInfo * delArgTys:TType list * delFuncExpr:Expr * delFuncTy:TType * m:range -> Expr
332332

333333
val CoerceFromFSharpFuncToDelegate: g:TcGlobals -> amap:ImportMap -> infoReader:InfoReader -> ad:AccessorDomain -> callerArgTy:TType -> m:range -> callerArgExpr:Expr -> delegateTy:TType -> Expr
334334

src/fsharp/NameResolution.fs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3897,9 +3897,9 @@ let ResolveCompletionsInType (ncenv: NameResolver) nenv (completionTargets: Reso
38973897
if completionTargets.ResolveAll then
38983898
[ for einfo in einfos do
38993899
let delegateType = einfo.GetDelegateType(amap, m)
3900-
let (SigOfFunctionForDelegate(invokeMethInfo, _, _, _)) = GetSigOfFunctionForDelegate ncenv.InfoReader delegateType m ad
3900+
let (SigOfFunctionForDelegate(delInvokeMeth, _, _, _)) = GetSigOfFunctionForDelegate ncenv.InfoReader delegateType m ad
39013901
// Only events with void return types are suppressed in intellisense.
3902-
if slotSigHasVoidReturnTy (invokeMethInfo.GetSlotSig(amap, m)) then
3902+
if slotSigHasVoidReturnTy (delInvokeMeth.GetSlotSig(amap, m)) then
39033903
yield einfo.AddMethod.DisplayName
39043904
yield einfo.RemoveMethod.DisplayName ]
39053905
else []
@@ -4620,9 +4620,9 @@ let ResolveCompletionsInTypeForItem (ncenv: NameResolver) nenv m ad statics ty (
46204620

46214621
[ for einfo in einfos do
46224622
let delegateType = einfo.GetDelegateType(amap, m)
4623-
let (SigOfFunctionForDelegate(invokeMethInfo, _, _, _)) = GetSigOfFunctionForDelegate ncenv.InfoReader delegateType m ad
4623+
let (SigOfFunctionForDelegate(delInvokeMeth, _, _, _)) = GetSigOfFunctionForDelegate ncenv.InfoReader delegateType m ad
46244624
// Only events with void return types are suppressed in intellisense.
4625-
if slotSigHasVoidReturnTy (invokeMethInfo.GetSlotSig(amap, m)) then
4625+
if slotSigHasVoidReturnTy (delInvokeMeth.GetSlotSig(amap, m)) then
46264626
yield einfo.AddMethod.DisplayName
46274627
yield einfo.RemoveMethod.DisplayName ]
46284628

0 commit comments

Comments
 (0)