Esempio n. 1
0
        protected internal override Delegate CreateDelegate()
        {
            MemberInfo member            = LookupUtils.GetMember(CallInfo);
            bool       handleInnerStruct = CallInfo.ShouldHandleInnerStruct;

            if (handleInnerStruct)
            {
                Generator
                .ldarg_0                                        // load arg-0 (this)
                .DeclareLocal(CallInfo.TargetType);             // TargetType tmpStr
                LoadInnerStructToLocal(0);                      // tmpStr = ((ValueTypeHolder)this)).Value
                Generator.DeclareLocal(Constants.ObjectType);   // object result;
            }
            else if (!CallInfo.IsStatic)
            {
                Generator
                .ldarg_0                                  // load arg-0 (this)
                .castclass(CallInfo.TargetType);          // (TargetType)this
            }

            if (member.MemberType == MemberTypes.Field)
            {
                var field = member as FieldInfo;
                Generator
                .ldfld(CallInfo.IsStatic, field)            // (this|tmpStr).field OR TargetType.field
                .boxIfValueType(field.FieldType);           // (object)<stack>
            }
            else
            {
                PropertyInfo prop      = member as PropertyInfo;
                MethodInfo   getMethod = LookupUtils.GetPropertyGetMethod(prop, CallInfo);
                Generator
                .call(CallInfo.IsStatic || CallInfo.IsTargetTypeStruct, getMethod)       // (this|tmpStr).prop OR TargetType.prop
                .boxIfValueType(prop.PropertyType);                                      // (object)<stack>
            }

            if (handleInnerStruct)
            {
                Generator.stloc_1.end();           // resultLocal = <stack>
                StoreLocalToInnerStruct(0);        // ((ValueTypeHolder)this)).Value = tmpStr
                Generator.ldloc_1.end();           // push resultLocal
            }

            Generator.ret();

            return(CallInfo.IsStatic ? Method.CreateDelegate(typeof(StaticMemberGetter)) : Method.CreateDelegate(typeof(MemberGetter)));
        }
Esempio n. 2
0
        protected internal override Delegate CreateDelegate()
        {
            MemberInfo member            = LookupUtils.GetMember(CallInfo);
            bool       handleInnerStruct = CallInfo.ShouldHandleInnerStruct;

            Generator.ldarg_0.end();                            // load arg-0 (this or value-to-be-set)
            if (handleInnerStruct)
            {
                Generator.DeclareLocal(CallInfo.TargetType);    // TargetType tmpStr
                LoadInnerStructToLocal(0);                      // tmpStr = ((ValueTypeHolder)this)).Value;
                Generator.ldarg_1.end();                        // load value-to-be-set;
            }
            else if (!CallInfo.IsStatic)
            {
                Generator.castclass(CallInfo.TargetType)      // (TargetType)this
                .ldarg_1.end();                               // load value-to-be-set;
            }

            Type memberType = member is FieldInfo ? ((FieldInfo)member).FieldType : ((PropertyInfo)member).PropertyType;

            Generator.CastFromObject(memberType);               // unbox | cast value-to-be-set
            if (member.MemberType == MemberTypes.Field)
            {
                Generator.stfld(CallInfo.IsStatic, (FieldInfo)member);  // (this|tmpStr).field = value-to-be-set;
            }
            else
            {
                MethodInfo setMethod = LookupUtils.GetPropertySetMethod((PropertyInfo)member, CallInfo);
                Generator.call(CallInfo.IsStatic || CallInfo.IsTargetTypeStruct, setMethod); // (this|tmpStr).set_Prop(value-to-be-set);
            }

            if (handleInnerStruct)
            {
                StoreLocalToInnerStruct(0); // ((ValueTypeHolder)this)).Value = tmpStr
            }

            Generator.ret();

            return(CallInfo.IsStatic ? Method.CreateDelegate(typeof(StaticMemberSetter)) : Method.CreateDelegate(typeof(MemberSetter)));
        }