public void TypedMethodInvocationWithComplexOwner() { FieldReference fieldReference = ClassEmitter.CreateField("CallTarget", typeof(ReferenceType)); FieldInfoReference fieldInfoReference = new FieldInfoReference(SelfReference.Self, fieldReference.Reference); var method = GetMethodEmitter(false, typeof(string), new Type[0]); method.AddStatement(new AssignStatement(fieldReference, new NewInstanceExpression(typeof(ReferenceType), Type.EmptyTypes))); method.ImplementByReturning(new TypedMethodInvocationExpression(fieldInfoReference, typeof(ReferenceType).GetMethod("Method"))); Assert.That(InvokeMethod(), Is.EqualTo("ReferenceTypeMethod")); }
public void TypedMethodInvocationWithArguments() { FieldReference fieldReference = ClassEmitter.CreateField("CallTarget", typeof(ReferenceType)); FieldInfoReference fieldInfoReference = new FieldInfoReference(SelfReference.Self, fieldReference.Reference); var method = GetMethodEmitter(false, typeof(Tuple <int, string>), new Type[0]); method.AddStatement(new AssignStatement(fieldReference, new NewInstanceExpression(typeof(ReferenceType), Type.EmptyTypes))); method.ImplementByReturning(new TypedMethodInvocationExpression(fieldInfoReference, typeof(ReferenceType).GetMethod("MethodWithArgs"), new ConstReference(1).ToExpression(), new ConstReference("2").ToExpression())); Assert.That(InvokeMethod(), Is.EqualTo(new Tuple <int, string> (1, "2"))); }
public void LoadAndStoreStatic() { FieldInfo fieldInfo = typeof(ClassWithPublicFields).GetField("StaticReferenceTypeField"); var methodEmitter = GetMethodEmitter(false, typeof(string), new Type[0]); LocalReference local = methodEmitter.DeclareLocal(typeof(string)); FieldInfoReference fieldReference = new FieldInfoReference(null, fieldInfo); methodEmitter .AddStatement(new AssignStatement(local, fieldReference.ToExpression())) .AddStatement(new AssignStatement(fieldReference, new ConstReference("Replacement").ToExpression())) .AddStatement(new ReturnStatement(local)); Assert.That(ClassWithPublicFields.StaticReferenceTypeField, Is.EqualTo("InitialStatic")); Assert.That(InvokeMethod(), Is.EqualTo("InitialStatic")); Assert.That(ClassWithPublicFields.StaticReferenceTypeField, Is.EqualTo("Replacement")); }
public void LoadAndStoreInstance() { FieldInfo fieldInfo = typeof(ClassWithPublicFields).GetField("ReferenceTypeField"); var methodEmitter = GetMethodEmitter(false, typeof(string), new[] { typeof(ClassWithPublicFields) }); LocalReference local = methodEmitter.DeclareLocal(typeof(string)); FieldInfoReference fieldReference = new FieldInfoReference(methodEmitter.ArgumentReferences[0], fieldInfo); methodEmitter .AddStatement(new AssignStatement(local, fieldReference.ToExpression())) .AddStatement(new AssignStatement(fieldReference, new ConstReference("Replacement").ToExpression())) .AddStatement(new ReturnStatement(local)); ClassWithPublicFields parameter = new ClassWithPublicFields(); Assert.That(parameter.ReferenceTypeField, Is.EqualTo("Initial")); Assert.That(InvokeMethod(parameter), Is.EqualTo("Initial")); Assert.That(parameter.ReferenceTypeField, Is.EqualTo("Replacement")); }
public void ReplicateBaseTypeConstructors() { var classEmitter = new CustomClassEmitter(Scope, "ReplicateBaseTypeConstructors", typeof(ClassWithReplicatableConstructors)); var fieldReference = new FieldInfoReference(SelfReference.Self, typeof(ClassWithReplicatableConstructors).GetField("CtorString")); var concatMethod = typeof(string).GetMethod("Concat", new[] { typeof(string), typeof(string) }); var preConcatExpression = new MethodInvocationExpression(null, concatMethod, fieldReference.ToExpression(), new ConstReference("pre").ToExpression()); var postConcatExpression = new MethodInvocationExpression(null, concatMethod, fieldReference.ToExpression(), new ConstReference("post").ToExpression()); classEmitter.ReplicateBaseTypeConstructors( emitter => emitter.CodeBuilder.AddStatement(new AssignStatement(fieldReference, preConcatExpression)), emitter => emitter.CodeBuilder.AddStatement(new AssignStatement(fieldReference, postConcatExpression))); Type builtType = classEmitter.BuildType(); var instance1 = (ClassWithReplicatableConstructors)Activator.CreateInstance(builtType); // default ctor Assert.That(instance1.CtorString, Is.EqualTo("preClassWithReplicatableConstructors()post")); var instance2 = (ClassWithReplicatableConstructors)Activator.CreateInstance(builtType, 7); // int ctor Assert.That(instance2.CtorString, Is.EqualTo("preClassWithReplicatableConstructors(7)post")); }