Microsoft.JScript.FieldAccessor.SpitAndInstantiateClassFor C# (CSharp) Method

SpitAndInstantiateClassFor() private method

private SpitAndInstantiateClassFor ( FieldInfo field ) : FieldAccessor
field FieldInfo
return FieldAccessor
    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);
    }
      

Usage Example

Example #1
0
        internal static FieldAccessor GetAccessorFor(FieldInfo field)
        {
            FieldAccessor accessor = FieldAccessor.accessorFor[field] as FieldAccessor;

            if (accessor != null)
            {
                return(accessor);
            }
            lock (FieldAccessor.accessorFor){
                accessor = FieldAccessor.accessorFor[field] as FieldAccessor;
                if (accessor != null)
                {
                    return(accessor);
                }
                accessor = FieldAccessor.SpitAndInstantiateClassFor(field);
                FieldAccessor.accessorFor[field] = accessor;
            }
            return(accessor);
        }