1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
//
// DynamicILInfoTest.cs - NUnit Test Cases for the DynamicILInfo class
//
// Zoltan Varga (vargaz@gmail.com)
//
// (C) 2011 Novell
using System;
using System.Reflection;
using System.Reflection.Emit;
using System.Text;
using NUnit.Framework;
namespace MonoTests.System.Reflection.Emit
{
[TestFixture]
public class DynamicILInfoTest
{
[Test]
public void GetDynamicILInfo_Unique () {
DynamicMethod dm = new DynamicMethod("HelloWorld", typeof(string), Type.EmptyTypes, typeof(DynamicILInfoTest), false);
DynamicILInfo il = dm.GetDynamicILInfo();
DynamicILInfo il2 = dm.GetDynamicILInfo();
Assert.IsTrue (Object.ReferenceEquals (il, il2));
}
[Test]
public void GetDynamicMethod () {
DynamicMethod dm = new DynamicMethod("HelloWorld", typeof(string), Type.EmptyTypes, typeof(DynamicILInfoTest), false);
DynamicILInfo il = dm.GetDynamicILInfo();
Assert.AreEqual (dm, il.DynamicMethod);
}
[Test]
public void GetTokenFor_String () {
DynamicMethod dm = new DynamicMethod("HelloWorld", typeof(string), Type.EmptyTypes, typeof(DynamicILInfoTest), false);
DynamicILInfo il = dm.GetDynamicILInfo();
byte[] code = { 0x00, 0x72, 0x01, 0x00, 0x00, 0x70, 0x2a };
int token0 = il.GetTokenFor("ABCD");
PutInteger4(token0, 0x0002, code);
il.SetCode(code, 8);
var res = dm.Invoke(null, null);
Assert.AreEqual ("ABCD", res);
}
[Test]
public void GetTokenFor_Method () {
DynamicMethod dm = new DynamicMethod("HelloWorld", typeof(string), Type.EmptyTypes, typeof(DynamicILInfoTest), false);
DynamicILInfo il = dm.GetDynamicILInfo();
// ldstr "ABCD"; call string::ToLower (); ret
byte[] code = { 0x00, 0x72, 0x01, 0x00, 0x00, 0x70, 0x28, 0x04, 0x00, 0x00, 0x0a, 0x00, 0x2a };
int token0 = il.GetTokenFor("ABCD");
int token1 = il.GetTokenFor(typeof(string).GetMethod("ToLower", Type.EmptyTypes).MethodHandle);
PutInteger4(token0, 0x0002, code);
PutInteger4(token1, 0x0007, code);
il.SetCode(code, 8);
var res = dm.Invoke(null, null);
Assert.AreEqual ("abcd", res);
}
[Test] // bug #13969
public void GetTokenFor_Constructor () {
var m = typeof (object).GetConstructor (Type.EmptyTypes);
var dm = new DynamicMethod ("Foo", typeof (void), Type.EmptyTypes);
var dil = dm.GetDynamicILInfo ();
dil.GetTokenFor (m.MethodHandle);
}
[Test]
public void GetTokenFor_Type () {
DynamicMethod dm = new DynamicMethod("HelloWorld", typeof(Type), Type.EmptyTypes, typeof(DynamicILInfoTest), false);
DynamicILInfo il = dm.GetDynamicILInfo();
byte[] code = { 0x00, 0xd0, 0x01, 0x00, 0x00, 0x70, 0x28, 0x04, 0x00, 0x00, 0x0a, 0x00, 0x2a };
int token0 = il.GetTokenFor(typeof (int).TypeHandle);
int token1 = il.GetTokenFor(typeof(Type).GetMethod("GetTypeFromHandle", new Type[] { typeof(RuntimeTypeHandle) }).MethodHandle);
PutInteger4(token0, 0x0002, code);
PutInteger4(token1, 0x0007, code);
il.SetCode(code, 8);
var res = dm.Invoke(null, null);
Assert.AreEqual (typeof (int), res);
}
[Test]
public void GetTokenFor_DynamicMethod () {
DynamicMethod dm = new DynamicMethod("HelloWorld", typeof(RuntimeMethodHandle), Type.EmptyTypes, typeof(DynamicILInfoTest), false);
DynamicILInfo il = dm.GetDynamicILInfo();
byte[] code = { 0x00, 0xd0, 0x01, 0x00, 0x00, 0x70, 0x2a };
int token0 = il.GetTokenFor(dm);
PutInteger4(token0, 0x0002, code);
il.SetCode(code, 8);
var res = dm.Invoke(null, null);
Assert.AreEqual (dm.MethodHandle, res);
}
static int aField;
[Test]
public void GetTokenFor_FieldInfo () {
aField = aField + 1;
DynamicMethod dm = new DynamicMethod("HelloWorld", typeof(RuntimeFieldHandle), Type.EmptyTypes, typeof(DynamicILInfoTest), false);
DynamicILInfo il = dm.GetDynamicILInfo();
var f = typeof (DynamicILInfoTest).GetField ("aField", BindingFlags.Static|BindingFlags.NonPublic).FieldHandle;
byte[] code = { 0x00, 0xd0, 0x01, 0x00, 0x00, 0x70, 0x2a };
int token0 = il.GetTokenFor(f);
PutInteger4(token0, 0x0002, code);
il.SetCode(code, 8);
var res = dm.Invoke(null, null);
Assert.AreEqual (f, res);
}
static void PutInteger4(int value, int startPos, byte[] array) {
array[startPos++] = (byte)value;
array[startPos++] = (byte)(value >> 8);
array[startPos++] = (byte)(value >> 16);
array[startPos++] = (byte)(value >> 24);
}
}
}
|