Ejemplo n.º 1
0
        public static TEnum VolatileRead <TEnum>(this ref TEnum value)
            where TEnum : struct, Enum
        {
            const string resultVar   = "result";
            const string nonFastPath = "nonFastPath";

            DeclareLocals(false, new Var(resultVar, typeof(long)));
            Push(ref value);
            Emit.Sizeof <TEnum>();
            Emit.Ldc_I4_8();
            Emit.Beq(nonFastPath);

            // fast path - use volatile read instruction
            Emit.Volatile();
            Emit.Ldobj <TEnum>();
            Emit.Ret();

            // non-fast path - use Volatile class
            MarkLabel(nonFastPath);
            Emit.Call(Method(typeof(Volatile), nameof(Volatile.Read), Type <long>().MakeByRefType()));
            Emit.Stloc(resultVar);
            Emit.Ldloca(resultVar);
            Emit.Ldobj <TEnum>();
            return(Return <TEnum>());
        }