public InvokeMemberCallSite AddInvokeMemberCallSite(String memberName, IList <String> parameters) { InvokeMemberCallSite csr = new InvokeMemberCallSite(CallSiteReferences.Count, memberName, parameters, this); CallSiteReferences.Add(csr); return(csr); }
internal override void IntrospectiveInvocation(InvocationExpression node, Object obj, Object inheritedAttributes, string memberName) { InheritedAttributes ia = (InheritedAttributes)obj; IList <String> parameters = new List <string>(); for (int i = 0; i < node.Arguments.ExpressionCount; i++) { parameters.Add(node.Arguments.GetExpressionElement(i).ILTypeExpression.ILType()); } InvokeMemberCallSite callSite = GetCallSiteContainer(ia.CurrentMethod).AddInvokeMemberCallSite(memberName, parameters); this.codeGenerator.WriteLine(indent, "ldsfld class " + callSite.CallSiteType + " class " + callSite.FullName); this.codeGenerator.WriteLine(indent, "ldfld !0 class " + callSite.CallSiteType + "::Target"); this.codeGenerator.WriteLine(indent, "ldsfld class " + callSite.CallSiteType + " class " + callSite.FullName); node.Identifier.Accept(this, ia); for (int i = 0; i < node.Arguments.ExpressionCount; i++) { node.Arguments.GetExpressionElement(i).Accept(this, inheritedAttributes); } this.codeGenerator.WriteLine(indent, "callvirt instance !" + (parameters.Count + 2) + " class " + callSite.CallSiteSubType + "::Invoke(" + String.Join(",", Enumerable.Range(0, node.Arguments.ExpressionCount + 2).Select((t, i) => "!" + i)) + ")"); }