Beispiel #1
0
        internal override void EmulateVCall(EmuContext ctx)
        {
            VMSlot    slot      = ctx.Stack.Pop();
            VMSlot    slot2     = ctx.Stack.Pop();
            bool      flag      = (slot.U4 & 2147483648u) > 0u;
            FieldInfo fieldInfo = (FieldInfo)ctx.Header.References[slot.U4 & 2147483647u];
            bool      flag2     = !fieldInfo.IsStatic && slot2.O == null;

            if (flag2)
            {
                // throw new NullReferenceException();
                return;
            }
            if (flag)
            {
                ctx.Stack.Push(new VMSlot()
                {
                    O = new FieldRef(slot2.O, fieldInfo)
                });
            }
            else
            {
                bool   flag4 = fieldInfo.DeclaringType.IsValueType && slot2.O is IReference;
                object obj;
                if (flag4)
                {
                    obj = ((IReference)slot2.O).GetValue(ctx, PointerType.OBJECT).ToObject(fieldInfo.DeclaringType);
                }
                else
                {
                    obj = slot2.ToObject(fieldInfo.DeclaringType);
                }
                ctx.Stack.Push(VMSlot.FromObject(fieldInfo.GetValue(obj), fieldInfo.FieldType));
            }
        }
Beispiel #2
0
        internal override void EmulateVCall(EmuContext ctx)
        {
            VMSlot slot  = ctx.Stack.Pop();
            VMSlot value = ctx.Stack.Pop();
            Type   type  = (Type)ctx.Header.References[slot.U4];

            if (Type.GetTypeCode(type) == TypeCode.String && value.O == null)
            {
                value.O = ctx.Header.Strings[value.U4];
            }
            else
            {
                value.O = value.ToObject(type);
            }
            ctx.Stack.Push(value);
        }
Beispiel #3
0
        private static object PopObject(EmuContext ctx, Type type)
        {
            VMSlot vmslot = ctx.Stack.Pop();
            bool   flag   = Type.GetTypeCode(type) == TypeCode.String && vmslot.O == null;
            object result;

            if (flag)
            {
                result = ctx.Header.References[vmslot.U4];
            }
            else
            {
                result = vmslot.ToObject(type);
            }
            return(result);
        }
Beispiel #4
0
        internal unsafe override void EmulateVCall(EmuContext ctx)
        {
            VMSlot slot  = ctx.Stack.Pop();
            VMSlot slot2 = ctx.Stack.Pop();
            VMSlot slot3 = ctx.Stack.Pop();

            FieldInfo fieldInfo = (FieldInfo)ctx.Header.References[slot.U4];
            bool      flag      = !fieldInfo.IsStatic && slot3.O == null;

            if (flag)
            {
                throw new NullReferenceException();
            }
            bool   flag2 = Type.GetTypeCode(fieldInfo.FieldType) == TypeCode.String && slot2.O == null;
            object value;

            if (flag2)
            {
                value = ctx.Header.Strings[slot2.U4];
            }
            else
            {
                value = slot2.ToObject(fieldInfo.FieldType);
            }
            bool flag3 = fieldInfo.DeclaringType.IsValueType && slot3.O is IReference;

            if (flag3)
            {
                TypedReference obj;
                ((IReference)slot3.O).ToTypedReference(ctx, (void *)(&obj), fieldInfo.DeclaringType);
                Rhydon.Emulator.Helpers.TypedReferenceHelpers.CastTypedRef((void *)(&obj), fieldInfo.DeclaringType);
                fieldInfo.SetValueDirect(obj, value);
            }
            else
            {
                fieldInfo.SetValue(slot3.ToObject(fieldInfo.DeclaringType), value);
            }
        }