Пример #1
0
        public void TestDevirtualizeAbstract()
        {
            MetadataType            testType   = _testModule.GetType("Devirtualization", "DevirtualizeAbstract");
            DevirtualizationManager scanDevirt = GetDevirtualizationManagerFromScan(testType.GetMethod("Run", null));

            Assert.False(scanDevirt.IsEffectivelySealed(testType.GetNestedType("Abstract")));
        }
Пример #2
0
        public void TestDevirtualizeWithOtherUnallocatedType()
        {
            MetadataType            testType   = _testModule.GetType("Devirtualization", "DevirtualizeWithOtherUnallocatedType");
            DevirtualizationManager scanDevirt = GetDevirtualizationManagerFromScan(testType.GetMethod("Run", null));

            MetadataType impl = testType.GetNestedType("Derived");

            // The resolved method should not be treated as sealed
            Assert.False(scanDevirt.IsEffectivelySealed(impl.GetMethod("Unreachable", null)));
        }
Пример #3
0
        public void TestDevirtualizeSimple()
        {
            MetadataType            testType   = _testModule.GetType("Devirtualization", "DevirtualizeSimple");
            DevirtualizationManager scanDevirt = GetDevirtualizationManagerFromScan(testType.GetMethod("Run", null));

            MethodDesc implMethod = testType.GetNestedType("Derived").GetMethod("Virtual", null);

            // The impl method should be treated as sealed
            Assert.True(scanDevirt.IsEffectivelySealed(implMethod));

            // Even though the metadata based algorithm would say it isn't
            var devirt = new DevirtualizationManager();

            Assert.False(devirt.IsEffectivelySealed(implMethod));
        }
Пример #4
0
        public void TestDevirtualizeWithUnallocatedType()
        {
            MetadataType            testType   = _testModule.GetType("Devirtualization", "DevirtualizeWithUnallocatedType");
            DevirtualizationManager scanDevirt = GetDevirtualizationManagerFromScan(testType.GetMethod("Run", null));

            MethodDesc   decl = testType.GetNestedType("Base").GetMethod("Unreachable", null);
            MetadataType impl = testType.GetNestedType("Derived");

            // Base::Unreachable should resolve into Derived::Unreachable on Derived.
            MethodDesc resolvedMethod = scanDevirt.ResolveVirtualMethod(decl, impl);

            Assert.Same(impl.GetMethod("Unreachable", null), resolvedMethod);

            // The resolved method should not be treated as sealed
            Assert.False(scanDevirt.IsEffectivelySealed(resolvedMethod));

            // Even though the metadata based algorithm would say it's sealed
            var devirt = new DevirtualizationManager();

            Assert.True(devirt.IsEffectivelySealed(resolvedMethod));
        }
Пример #5
0
 public CompilationBuilder UseDevirtualizationManager(DevirtualizationManager manager)
 {
     _devirtualizationManager = manager;
     return(this);
 }