public void Int64Load32Unsigned_Compiled_Then_Shift()
        {
            // Adapted from Int64Load8Unsigned_Compiled_Then_Shift.
            const int  off   = 4;
            const byte b     = 0x9f;
            const int  shift = 40;

            var compiled = MemoryReadTestBase <long> .CreateInstance(
                new LocalGet(),
                new Int64Load32Unsigned
            {
                Offset = off,
            },
                new Int64Constant(shift),
                new Int64ShiftLeft(),
                new End()
                );

            using (compiled)
            {
                Assert.IsNotNull(compiled);
                Assert.IsNotNull(compiled.Exports);
                var memory = compiled.Exports.Memory;
                Assert.AreNotEqual(IntPtr.Zero, memory.Start);

                var exports = compiled.Exports;

                Marshal.WriteByte(memory.Start + off, b);
                const long should_be = ((long)b) << shift;
                Assert.AreEqual(should_be, exports.Test(0));
            }
        }
Пример #2
0
        public void Float32Load_Compiled_Offset1()
        {
            var compiled = MemoryReadTestBase <float> .CreateInstance(
                new GetLocal(),
                new Float32Load
            {
                Offset = 1,
            },
                new End()
                );

            using (compiled)
            {
                Assert.IsNotNull(compiled);

                var exports = compiled.Exports;
                Assert.IsNotNull(exports);
                var memory = exports.Memory;
                Assert.AreNotEqual(IntPtr.Zero, memory.Start);
                Assert.AreEqual(0, exports.Test(0));

                var invariantCulture = CultureInfo.InvariantCulture;

                var testData = Samples.Memory;
                Marshal.Copy(testData, 0, memory.Start, testData.Length);
                Assert.AreEqual("6.207163E-36", exports.Test(0).ToString(invariantCulture));
                Assert.AreEqual("2.501747E-35", exports.Test(1).ToString(invariantCulture));
                Assert.AreEqual("1.008251E-34", exports.Test(2).ToString(invariantCulture));
                Assert.AreEqual("4.063216E-34", exports.Test(3).ToString(invariantCulture));
                Assert.AreEqual("0.03320982", exports.Test(4).ToString(invariantCulture));
                Assert.AreEqual("-8.313687E+14", exports.Test(5).ToString(invariantCulture));
                Assert.AreEqual("9.602914E-14", exports.Test(6).ToString(invariantCulture));
                Assert.AreEqual("-1.912281E+17", exports.Test(7).ToString(invariantCulture));
                Assert.AreEqual("2.021882E-38", exports.Test(8).ToString(invariantCulture));

                Assert.AreEqual(0, exports.Test((int)Memory.PageSize - 5));

                MemoryAccessOutOfRangeException x;

                x = ExceptionAssert.Expect <MemoryAccessOutOfRangeException>(() => exports.Test((int)Memory.PageSize - 4));
                Assert.AreEqual(Memory.PageSize - 3, x.Offset);
                Assert.AreEqual(4u, x.Length);

                x = ExceptionAssert.Expect <MemoryAccessOutOfRangeException>(() => exports.Test((int)Memory.PageSize - 3));
                Assert.AreEqual(Memory.PageSize - 2, x.Offset);
                Assert.AreEqual(4u, x.Length);

                x = ExceptionAssert.Expect <MemoryAccessOutOfRangeException>(() => exports.Test((int)Memory.PageSize - 2));
                Assert.AreEqual(Memory.PageSize - 1, x.Offset);
                Assert.AreEqual(4u, x.Length);

                x = ExceptionAssert.Expect <MemoryAccessOutOfRangeException>(() => exports.Test((int)Memory.PageSize - 1));
                Assert.AreEqual(Memory.PageSize, x.Offset);
                Assert.AreEqual(4u, x.Length);

                ExceptionAssert.Expect <OverflowException>(() => exports.Test(unchecked ((int)uint.MaxValue)));
            }
        }
        public void Float64Load_Compiled_Offset1()
        {
            var compiled = MemoryReadTestBase <double> .CreateInstance(
                new GetLocal(),
                new Float64Load
            {
                Offset = 1,
            },
                new End()
                );

            using (compiled)
            {
                Assert.IsNotNull(compiled);
                Assert.IsNotNull(compiled.Exports);
                var memory = compiled.Exports.Memory;
                Assert.AreNotEqual(IntPtr.Zero, memory.Start);

                var exports = compiled.Exports;
                Assert.AreEqual(0, exports.Test(0));

                var invariantCulture = CultureInfo.InvariantCulture;

                var testData = Samples.Memory;
                Marshal.Copy(testData, 0, memory.Start, testData.Length);
                Assert.AreEqual("1.06703248910785E-14", exports.Test(0).ToString(invariantCulture));
                Assert.AreEqual("-1.14389371511465E+117", exports.Test(1).ToString(invariantCulture));
                Assert.AreEqual("4.12824598825351E-107", exports.Test(2).ToString(invariantCulture));
                Assert.AreEqual("-9.39245758009613E+135", exports.Test(3).ToString(invariantCulture));
                Assert.AreEqual("1.60424369241791E-304", exports.Test(4).ToString(invariantCulture));
                Assert.AreEqual("1.19599597184682E-309", exports.Test(5).ToString(invariantCulture));
                Assert.AreEqual("4.6718592650265E-312", exports.Test(6).ToString(invariantCulture));
                Assert.AreEqual("1.82494502538554E-314", exports.Test(7).ToString(invariantCulture));
                Assert.AreEqual("7.12869138768568E-317", exports.Test(8).ToString(invariantCulture));

                Assert.AreEqual(0, exports.Test((int)Memory.PageSize - 9));

                MemoryAccessOutOfRangeException x;

                x = Assert.ThrowsException <MemoryAccessOutOfRangeException>(() => exports.Test((int)Memory.PageSize - 8));
                Assert.AreEqual(Memory.PageSize - 7, x.Offset);
                Assert.AreEqual(8u, x.Length);

                x = Assert.ThrowsException <MemoryAccessOutOfRangeException>(() => exports.Test((int)Memory.PageSize - 6));
                Assert.AreEqual(Memory.PageSize - 5, x.Offset);
                Assert.AreEqual(8u, x.Length);

                x = Assert.ThrowsException <MemoryAccessOutOfRangeException>(() => exports.Test((int)Memory.PageSize - 2));
                Assert.AreEqual(Memory.PageSize - 1, x.Offset);
                Assert.AreEqual(8u, x.Length);

                x = Assert.ThrowsException <MemoryAccessOutOfRangeException>(() => exports.Test((int)Memory.PageSize - 1));
                Assert.AreEqual(Memory.PageSize, x.Offset);
                Assert.AreEqual(8u, x.Length);

                Assert.ThrowsException <OverflowException>(() => exports.Test(unchecked ((int)uint.MaxValue)));
            }
        }
Пример #4
0
        public void Int64Load_Compiled_Offset1()
        {
            var compiled = MemoryReadTestBase <long> .CreateInstance(
                new LocalGet(),
                new Int64Load
            {
                Offset = 1,
            },
                new End()
                );

            using (compiled)
            {
                Assert.IsNotNull(compiled);
                Assert.IsNotNull(compiled.Exports);
                var memory = compiled.Exports.Memory;
                Assert.AreNotEqual(IntPtr.Zero, memory.Start);

                var exports = compiled.Exports;
                Assert.AreEqual(0, exports.Test(0));

                var testData = Samples.Memory;
                Marshal.Copy(testData, 0, memory.Start, testData.Length);
                Assert.AreEqual(4397772758562636546, exports.Test(0));
                Assert.AreEqual(-2865124961678982141, exports.Test(1));
                Assert.AreEqual(3015227055211414788, exports.Test(2));
                Assert.AreEqual(-2582295154680986107, exports.Test(3));
                Assert.AreEqual(61970503589955334, exports.Test(4));
                Assert.AreEqual(242072279648263, exports.Test(5));
                Assert.AreEqual(945594842376, exports.Test(6));
                Assert.AreEqual(3693729853, exports.Test(7));
                Assert.AreEqual(14428632, exports.Test(8));

                Assert.AreEqual(0, exports.Test((int)Memory.PageSize - 9));

                MemoryAccessOutOfRangeException x;

                x = Assert.ThrowsException <MemoryAccessOutOfRangeException>(() => exports.Test((int)Memory.PageSize - 8));
                Assert.AreEqual(Memory.PageSize - 7, x.Offset);
                Assert.AreEqual(8u, x.Length);

                x = Assert.ThrowsException <MemoryAccessOutOfRangeException>(() => exports.Test((int)Memory.PageSize - 6));
                Assert.AreEqual(Memory.PageSize - 5, x.Offset);
                Assert.AreEqual(8u, x.Length);

                x = Assert.ThrowsException <MemoryAccessOutOfRangeException>(() => exports.Test((int)Memory.PageSize - 2));
                Assert.AreEqual(Memory.PageSize - 1, x.Offset);
                Assert.AreEqual(8u, x.Length);

                x = Assert.ThrowsException <MemoryAccessOutOfRangeException>(() => exports.Test((int)Memory.PageSize - 1));
                Assert.AreEqual(Memory.PageSize, x.Offset);
                Assert.AreEqual(8u, x.Length);

                Assert.ThrowsException <OverflowException>(() => exports.Test(unchecked ((int)uint.MaxValue)));
            }
        }
    public void Int64Load32Signed_Compiled_Offset1()
    {
        var compiled = MemoryReadTestBase <long> .CreateInstance(
            new LocalGet(),
            new Int64Load32Signed
        {
            Offset = 1,
        },
            new End()
            );

        using (compiled)
        {
            Assert.IsNotNull(compiled);
            Assert.IsNotNull(compiled.Exports);
            var memory = compiled.Exports.Memory;
            Assert.AreNotEqual(IntPtr.Zero, memory.Start);

            var exports = compiled.Exports;
            Assert.AreEqual(0, exports.Test(0));

            var testData = Samples.Memory;
            Marshal.Copy(testData, 0, memory.Start, testData.Length);
            Assert.AreEqual(84148994, exports.Test(0));
            Assert.AreEqual(100992003, exports.Test(1));
            Assert.AreEqual(117835012, exports.Test(2));
            Assert.AreEqual(134678021, exports.Test(3));
            Assert.AreEqual(1023936262, exports.Test(4));
            Assert.AreEqual(-667088889, exports.Test(5));
            Assert.AreEqual(702037256, exports.Test(6));
            Assert.AreEqual(-601237443, exports.Test(7));
            Assert.AreEqual(14428632, exports.Test(8));

            Assert.AreEqual(0, exports.Test((int)Memory.PageSize - 5));

            MemoryAccessOutOfRangeException x;

            x = Assert.ThrowsException <MemoryAccessOutOfRangeException>(() => exports.Test((int)Memory.PageSize - 4));
            Assert.AreEqual(Memory.PageSize - 3, x.Offset);
            Assert.AreEqual(4u, x.Length);

            x = Assert.ThrowsException <MemoryAccessOutOfRangeException>(() => exports.Test((int)Memory.PageSize - 3));
            Assert.AreEqual(Memory.PageSize - 2, x.Offset);
            Assert.AreEqual(4u, x.Length);

            x = Assert.ThrowsException <MemoryAccessOutOfRangeException>(() => exports.Test((int)Memory.PageSize - 2));
            Assert.AreEqual(Memory.PageSize - 1, x.Offset);
            Assert.AreEqual(4u, x.Length);

            x = Assert.ThrowsException <MemoryAccessOutOfRangeException>(() => exports.Test((int)Memory.PageSize - 1));
            Assert.AreEqual(Memory.PageSize, x.Offset);
            Assert.AreEqual(4u, x.Length);

            Assert.ThrowsException <OverflowException>(() => exports.Test(unchecked ((int)uint.MaxValue)));
        }
    }
Пример #6
0
        public void Int64Load32Unsigned_Compiled_Offset0()
        {
            var compiled = MemoryReadTestBase <long> .CreateInstance(
                new GetLocal(),
                new Int64Load32Unsigned(),
                new End()
                );

            using (compiled)
            {
                Assert.IsNotNull(compiled);
                Assert.IsNotNull(compiled.Exports);
                var memory = compiled.Exports.Memory;
                Assert.AreNotEqual(IntPtr.Zero, memory.Start);

                var exports = compiled.Exports;
                Assert.AreEqual(0, exports.Test(0));

                var testData = Samples.Memory;
                Marshal.Copy(testData, 0, memory.Start, testData.Length);
                Assert.AreEqual(67306238, exports.Test(0));
                Assert.AreEqual(84148994, exports.Test(1));
                Assert.AreEqual(100992003, exports.Test(2));
                Assert.AreEqual(117835012, exports.Test(3));
                Assert.AreEqual(134678021, exports.Test(4));
                Assert.AreEqual(1023936262, exports.Test(5));
                Assert.AreEqual(3627878407, exports.Test(6));
                Assert.AreEqual(702037256, exports.Test(7));
                Assert.AreEqual(3693729853, exports.Test(8));

                Assert.AreEqual(0, exports.Test((int)Memory.PageSize - 4));

                MemoryAccessOutOfRangeException x;

                x = ExceptionAssert.Expect <MemoryAccessOutOfRangeException>(() => exports.Test((int)Memory.PageSize - 3));
                Assert.AreEqual(Memory.PageSize - 3, x.Offset);
                Assert.AreEqual(4u, x.Length);

                x = ExceptionAssert.Expect <MemoryAccessOutOfRangeException>(() => exports.Test((int)Memory.PageSize - 2));
                Assert.AreEqual(Memory.PageSize - 2, x.Offset);
                Assert.AreEqual(4u, x.Length);

                x = ExceptionAssert.Expect <MemoryAccessOutOfRangeException>(() => exports.Test((int)Memory.PageSize - 1));
                Assert.AreEqual(Memory.PageSize - 1, x.Offset);
                Assert.AreEqual(4u, x.Length);

                x = ExceptionAssert.Expect <MemoryAccessOutOfRangeException>(() => exports.Test((int)Memory.PageSize));
                Assert.AreEqual(Memory.PageSize, x.Offset);
                Assert.AreEqual(4u, x.Length);

                ExceptionAssert.Expect <OverflowException>(() => exports.Test(unchecked ((int)uint.MaxValue)));
            }
        }
Пример #7
0
        public void Int64Load8Unsigned_Compiled_Then_Shift()
        {
            if (!Environment.Is64BitProcess)
            {
                Assert.Inconclusive("32-bit .NET doesn't support 64-bit bit shift amounts.");
            }

            // seems like the offset here needs to be different so it
            // doesn't interfere with other tests above.  so I just
            // picked a number.
            const int off = 4;

            const byte b = 0x9f;

            // shift needs to be >23 to repro the problem
            const int shift = 40;

            // the issue here is that Ldind_U8 results in int32,
            // not int64.  so if the shift would push things too
            // far, it gives the wrong result.

            // Int64Load8Unsigned will need to do a Conv_I8

            // in fact, I believe this affects Int64LoadFoo, for
            // all Foo narrow than 64 bits

            var compiled = MemoryReadTestBase <long> .CreateInstance(
                new LocalGet(),
                new Int64Load8Unsigned
            {
                Offset = off,
            },
                new Int64Constant(shift),
                new Int64ShiftLeft(),
                new End()
                );

            using (compiled)
            {
                Assert.IsNotNull(compiled);
                Assert.IsNotNull(compiled.Exports);
                var memory = compiled.Exports.Memory;
                Assert.AreNotEqual(IntPtr.Zero, memory.Start);

                var exports = compiled.Exports;

                Marshal.WriteByte(memory.Start + off, b);
                var should_be = ((long)b) << shift;
                Assert.AreEqual(should_be, exports.Test(0));
            }
        }
        public void Int32Load16Unsigned_Compiled_Offset1()
        {
            var compiled = MemoryReadTestBase <int> .CreateInstance(
                new GetLocal(),
                new Int32Load16Unsigned
            {
                Offset = 1,
            },
                new End()
                );

            using (compiled)
            {
                Assert.IsNotNull(compiled);
                Assert.IsNotNull(compiled.Exports);
                var memory = compiled.Exports.Memory;
                Assert.AreNotEqual(IntPtr.Zero, memory.Start);

                var exports = compiled.Exports;
                Assert.AreEqual(0, exports.Test(0));

                var testData = Samples.Memory;
                Marshal.Copy(testData, 0, memory.Start, testData.Length);
                Assert.AreEqual(770, exports.Test(0));
                Assert.AreEqual(1027, exports.Test(1));
                Assert.AreEqual(1284, exports.Test(2));
                Assert.AreEqual(1541, exports.Test(3));
                Assert.AreEqual(1798, exports.Test(4));
                Assert.AreEqual(2055, exports.Test(5));
                Assert.AreEqual(15624, exports.Test(6));
                Assert.AreEqual(55357, exports.Test(7));
                Assert.AreEqual(10712, exports.Test(8));

                Assert.AreEqual(0, exports.Test((int)Memory.PageSize - 3));

                MemoryAccessOutOfRangeException x;

                x = Assert.ThrowsException <MemoryAccessOutOfRangeException>(() => exports.Test((int)Memory.PageSize - 2));
                Assert.AreEqual(Memory.PageSize - 1, x.Offset);
                Assert.AreEqual(2u, x.Length);

                x = Assert.ThrowsException <MemoryAccessOutOfRangeException>(() => exports.Test((int)Memory.PageSize - 1));
                Assert.AreEqual(Memory.PageSize, x.Offset);
                Assert.AreEqual(2u, x.Length);

                Assert.ThrowsException <OverflowException>(() => exports.Test(unchecked ((int)uint.MaxValue)));
            }
        }
Пример #9
0
        public void Int64Load8Unsigned_Compiled_Offset1()
        {
            var compiled = MemoryReadTestBase <long> .CreateInstance(
                new GetLocal(),
                new Int64Load8Unsigned
            {
                Offset = 1,
            },
                new End()
                );

            using (compiled)
            {
                Assert.IsNotNull(compiled);
                Assert.IsNotNull(compiled.Exports);
                var memory = compiled.Exports.Memory;
                Assert.AreNotEqual(IntPtr.Zero, memory.Start);

                var exports = compiled.Exports;
                Assert.AreEqual(0, exports.Test(0));

                var testData = Samples.Memory;
                Marshal.Copy(testData, 0, memory.Start, testData.Length);
                Assert.AreEqual(2, exports.Test(0));
                Assert.AreEqual(3, exports.Test(1));
                Assert.AreEqual(4, exports.Test(2));
                Assert.AreEqual(5, exports.Test(3));
                Assert.AreEqual(6, exports.Test(4));
                Assert.AreEqual(7, exports.Test(5));
                Assert.AreEqual(8, exports.Test(6));
                Assert.AreEqual(61, exports.Test(7));
                Assert.AreEqual(216, exports.Test(8));

                Assert.AreEqual(0, exports.Test((int)Memory.PageSize - 5));

                MemoryAccessOutOfRangeException x;

                x = ExceptionAssert.Expect <MemoryAccessOutOfRangeException>(() => exports.Test((int)Memory.PageSize - 1));
                Assert.AreEqual(Memory.PageSize, x.Offset);
                Assert.AreEqual(1u, x.Length);

                ExceptionAssert.Expect <OverflowException>(() => exports.Test(unchecked ((int)uint.MaxValue)));
            }
        }
    public void Int64Load32Signed_Compiled_Then_Shift()
    {
        if (!Environment.Is64BitProcess)
        {
            Assert.Inconclusive("32-bit .NET doesn't support 64-bit bit shift amounts.");
        }

        // Adapted from Int64Load8Unsigned_Compiled_Then_Shift.
        const int   off   = 4;
        const sbyte b     = 0x5f;
        const int   shift = 40;

        var compiled = MemoryReadTestBase <long> .CreateInstance(
            new LocalGet(),
            new Int64Load32Signed
        {
            Offset = off,
        },
            new Int64Constant(shift),
            new Int64ShiftLeft(),
            new End()
            );

        using (compiled)
        {
            Assert.IsNotNull(compiled);
            Assert.IsNotNull(compiled.Exports);
            var memory = compiled.Exports.Memory;
            Assert.AreNotEqual(IntPtr.Zero, memory.Start);

            var exports = compiled.Exports;

            Marshal.WriteByte(memory.Start + off, (byte)b);
            const long should_be = ((long)b) << shift;
            Assert.AreEqual(should_be, exports.Test(0));
        }
    }