Ejemplo n.º 1
0
        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)) + ")");
        }