private static FieldAccessor SpitAndInstantiateClassFor(FieldInfo field){
Type ft = field.FieldType;
TypeBuilder tb = Runtime.ThunkModuleBuilder.DefineType("accessor"+FieldAccessor.count++, TypeAttributes.Public, typeof(FieldAccessor));
MethodBuilder mb = tb.DefineMethod("GetValue", MethodAttributes.Public|MethodAttributes.Virtual|MethodAttributes.ReuseSlot,
typeof(Object), new Type[]{typeof(Object)});
#if !DEBUG
mb.SetCustomAttribute(new CustomAttributeBuilder(Runtime.TypeRefs.debuggerStepThroughAttributeCtor, new Object[]{}));
mb.SetCustomAttribute(new CustomAttributeBuilder(Runtime.TypeRefs.debuggerHiddenAttributeCtor, new Object[]{}));
#endif
ILGenerator il = mb.GetILGenerator();
if (field.IsLiteral)
(new ConstantWrapper(TypeReferences.GetConstantValue(field), null)).TranslateToIL(il, ft);
else if (field.IsStatic)
il.Emit(OpCodes.Ldsfld, field);
else{
il.Emit(OpCodes.Ldarg_1);
il.Emit(OpCodes.Ldfld, field);
}
if (ft.IsValueType)
il.Emit(OpCodes.Box, ft);
il.Emit(OpCodes.Ret);
mb = tb.DefineMethod("SetValue", MethodAttributes.Public|MethodAttributes.Virtual|MethodAttributes.ReuseSlot,
typeof(void), new Type[]{typeof(Object), typeof(Object)});
#if !DEBUG
mb.SetCustomAttribute(new CustomAttributeBuilder(Runtime.TypeRefs.debuggerStepThroughAttributeCtor, new Object[]{}));
mb.SetCustomAttribute(new CustomAttributeBuilder(Runtime.TypeRefs.debuggerHiddenAttributeCtor, new Object[]{}));
#endif
il = mb.GetILGenerator();
if (!field.IsLiteral){
if (!field.IsStatic)
il.Emit(OpCodes.Ldarg_1);
il.Emit(OpCodes.Ldarg_2);
if (ft.IsValueType)
Convert.EmitUnbox(il, ft, Type.GetTypeCode(ft));
if (field.IsStatic)
il.Emit(OpCodes.Stsfld, field);
else
il.Emit(OpCodes.Stfld, field);
}
il.Emit(OpCodes.Ret);
Type t = tb.CreateType();
return (FieldAccessor)Activator.CreateInstance(t);
}