Inheritance: TypeReference
		private AssignStatement SetDelegate(LocalReference localDelegate, ReferenceExpression localTarget,
		                                    Type closedDelegateType, MethodInfo closedMethodOnTarget)
		{
			var delegateCreateDelegate = new MethodInvocationExpression(
				null,
				DelegateMethods.CreateDelegate,
				new TypeTokenExpression(closedDelegateType),
				localTarget,
				new MethodTokenExpression(closedMethodOnTarget));
			return new AssignStatement(localDelegate, new ConvertExpression(closedDelegateType, delegateCreateDelegate));
		}
		public static void CopyOutAndRefParameters(TypeReference[] dereferencedArguments, LocalReference invocation, MethodInfo method, MethodEmitter emitter)
		{
			var parameters = method.GetParameters();
			if (!ArgumentsUtil.IsAnyByRef(parameters))
			{
				return; //saving the need to create locals if there is no need
			}

			var arguments = StoreInvocationArgumentsInLocal(emitter, invocation);

			for (int i = 0; i < parameters.Length; i++)
			{
				if (!parameters[i].ParameterType.IsByRef) continue;

				emitter.CodeBuilder.AddStatement(AssignArgument(dereferencedArguments, i, arguments));
			}
		}
Example #3
0
 private static LocalReference StoreInvocationArgumentsInLocal(MethodEmitter emitter, LocalReference invocation)
 {
     var invocationArgs = emitter.CodeBuilder.DeclareLocal(typeof(object[]));
     emitter.CodeBuilder.AddStatement(GetArguments(invocationArgs, invocation));
     return invocationArgs;
 }
Example #4
0
 private static AssignStatement GetArguments(LocalReference invocationArgs, LocalReference invocation)
 {
     return new AssignStatement(invocationArgs, new MethodInvocationExpression(invocation, InvocationMethods.GetArguments));
 }
Example #5
0
 private static AssignStatement AssignArgument(TypeReference[] dereferencedArguments, int i,
                                               LocalReference invocationArgs)
 {
     return new AssignStatement(dereferencedArguments[i], Argument(i, invocationArgs, dereferencedArguments));
 }
Example #6
0
 private static ConvertExpression Argument(int i, LocalReference invocationArgs, TypeReference[] arguments)
 {
     return new ConvertExpression(arguments[i].Type, new LoadRefArrayElementExpression(i, invocationArgs));
 }
Example #7
0
		public LocalReference DeclareLocal(Type type)
		{
			LocalReference local = new LocalReference(type);
			ilmarkers.Add(local);
			return local;
		}
Example #8
0
 public ByRefReference(LocalReference localReference)
     : base(localReference.Type)
 {
     this.localReference = localReference;
 }
		private static void CopyOutAndRefParameters(
			TypeReference[] dereferencedArguments, LocalReference invocationImplLocal, MethodInfo method,
			MethodEmitter methodEmitter)
		{
			ParameterInfo[] parameters = method.GetParameters();
			bool hasByRefParam = false;
			for(int i = 0; i < parameters.Length; i++)
			{
				if (parameters[i].ParameterType.IsByRef)
					hasByRefParam = true;
			}
			if (!hasByRefParam)
				return; //saving the need to create locals if there is no need
			LocalReference invocationArgs = methodEmitter.CodeBuilder.DeclareLocal(typeof(object[]));
			methodEmitter.CodeBuilder.AddStatement(
				new AssignStatement(invocationArgs,
				                    new MethodInvocationExpression(invocationImplLocal, invocation_getArgumentsMethod)
					)
				);
			for(int i = 0; i < parameters.Length; i++)
			{
				if (parameters[i].ParameterType.IsByRef)
				{
					methodEmitter.CodeBuilder.AddStatement(
						new AssignStatement(dereferencedArguments[i],
						                    new ConvertExpression(dereferencedArguments[i].Type,
						                                          new LoadRefArrayElementExpression(i, invocationArgs)
						                    	)
							));
				}
			}
		}
		private void EmitLoadGenricMethodArguments(MethodEmitter methodEmitter, MethodInfo method,
		                                           LocalReference invocationImplLocal)
		{
			Type[] genericParameters =
				Array.FindAll(method.GetGenericArguments(), delegate(Type t) { return t.IsGenericParameter; });
			LocalReference genericParamsArrayLocal = methodEmitter.CodeBuilder.DeclareLocal(typeof(Type[]));
			methodEmitter.CodeBuilder.AddStatement(
				new AssignStatement(genericParamsArrayLocal, new NewArrayExpression(genericParameters.Length, typeof(Type))));

			for(int i = 0; i < genericParameters.Length; ++i)
			{
				methodEmitter.CodeBuilder.AddStatement(
					new AssignArrayStatement(genericParamsArrayLocal, i, new TypeTokenExpression(genericParameters[i])));
			}
			MethodInfo setGenericsArgs =
				typeof(AbstractInvocation).GetMethod("SetGenericMethodArguments", new Type[] {typeof(Type[])});
			methodEmitter.CodeBuilder.AddStatement(new ExpressionStatement(
			                                       	new MethodInvocationExpression(invocationImplLocal, setGenericsArgs,
			                                       	                               new ReferenceExpression(
			                                       	                               	genericParamsArrayLocal))));
		}
Example #11
0
		public ByRefReference(LocalReference localReference)
			: base(localReference.Type)
		{
			this.localReference = localReference;
		}