private void EmitDelegateCreation(BoundExpression node, BoundExpression receiver, bool isExtensionMethod, MethodSymbol method, TypeSymbol delegateType, bool used) { var isStatic = receiver == null || (!isExtensionMethod && method.IsStatic); if (!used) { if (!isStatic) { EmitExpression(receiver, false); } return; } // emit the receiver if (isStatic) { builder.EmitNullConstant(); } else { EmitExpression(receiver, true); if (!receiver.Type.IsVerifierReference()) { EmitBox(receiver.Type, receiver.Syntax); } } // emit method pointer // Metadata Spec (II.14.6): // Delegates shall be declared sealed. // The Invoke method shall be virtual. if (method.IsMetadataVirtual() && !method.ContainingType.IsDelegateType() && !receiver.SuppressVirtualCalls) { // NOTE: method.IsMetadataVirtual -> receiver != null builder.EmitOpCode(ILOpCode.Dup); builder.EmitOpCode(ILOpCode.Ldvirtftn); // substitute the method with original virtual method method = method.GetConstructedLeastOverriddenMethod(this.method.ContainingType); } else { builder.EmitOpCode(ILOpCode.Ldftn); } EmitSymbolToken(method, node.Syntax, null); // call delegate constructor builder.EmitOpCode(ILOpCode.Newobj, -1); // pop 2 args and push delegate object var ctor = DelegateConstructor(node.Syntax, delegateType); if ((object)ctor != null) EmitSymbolToken(ctor, node.Syntax, null); }
public BoundExpression MethodInfo(MethodSymbol method) { var originalMethod = method.GetConstructedLeastOverriddenMethod(this.CompilationState.Type); return new BoundMethodInfo( Syntax, originalMethod, GetMethodFromHandleMethod(originalMethod.ContainingType), WellKnownType(Microsoft.CodeAnalysis.WellKnownType.System_Reflection_MethodInfo)) { WasCompilerGenerated = true }; }
public BoundExpression MethodInfo(MethodSymbol method) { // The least overridden virtual method is only called for value type receivers // in special circumstances. These circumstances are exactly the checks performed by // MayUseCallForStructMethod (which is also used by the emitter when determining // whether or not to call a method with a value type receiver directly). if (!method.ContainingType.IsValueType || !Microsoft.CodeAnalysis.CSharp.CodeGen.CodeGenerator.MayUseCallForStructMethod(method)) { method = method.GetConstructedLeastOverriddenMethod(this.CompilationState.Type); } return new BoundMethodInfo( Syntax, method, GetMethodFromHandleMethod(method.ContainingType), WellKnownType(Microsoft.CodeAnalysis.WellKnownType.System_Reflection_MethodInfo)) { WasCompilerGenerated = true }; }