public void TestDevirtualizeAbstract() { MetadataType testType = _testModule.GetType("Devirtualization", "DevirtualizeAbstract"); DevirtualizationManager scanDevirt = GetDevirtualizationManagerFromScan(testType.GetMethod("Run", null)); Assert.False(scanDevirt.IsEffectivelySealed(testType.GetNestedType("Abstract"))); }
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))); }
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)); }
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)); }
public CompilationBuilder UseDevirtualizationManager(DevirtualizationManager manager) { _devirtualizationManager = manager; return(this); }