public abstract bool IsCompositeBuildMode { get; }
/// <summary>
+ /// Returns true when the compiler is running in large version bubble mode
+ /// </summary>
+ public abstract bool IsInputBubble { get; }
+
+ /// <summary>
/// List of input modules to use for the compilation.
/// </summary>
public abstract IEnumerable<EcmaModule> CompilationModuleSet { get; }
{
MetadataReader mdReader = _nodeFactory.CompilationModuleGroup.CompilationModuleSet.Single().MetadataReader;
_assemblyRefCount = mdReader.GetTableRowCount(TableIndex.AssemblyRef) + 1;
- for (int assemblyRefIndex = 1; assemblyRefIndex < _assemblyRefCount; assemblyRefIndex++)
+
+ if (!_nodeFactory.CompilationModuleGroup.IsInputBubble)
{
- AssemblyReferenceHandle assemblyRefHandle = MetadataTokens.AssemblyReferenceHandle(assemblyRefIndex);
- AssemblyReference assemblyRef = mdReader.GetAssemblyReference(assemblyRefHandle);
- string assemblyName = mdReader.GetString(assemblyRef.Name);
- _assemblyRefToModuleIdMap[assemblyName] = assemblyRefIndex;
+ for (int assemblyRefIndex = 1; assemblyRefIndex < _assemblyRefCount; assemblyRefIndex++)
+ {
+ AssemblyReferenceHandle assemblyRefHandle = MetadataTokens.AssemblyReferenceHandle(assemblyRefIndex);
+ AssemblyReference assemblyRef = mdReader.GetAssemblyReference(assemblyRefHandle);
+ string assemblyName = mdReader.GetString(assemblyRef.Name);
+ _assemblyRefToModuleIdMap[assemblyName] = assemblyRefIndex;
+ }
}
// AssemblyRefCount + 1 corresponds to ROWID 0 in the manifest metadata
private Dictionary<TypeDesc, ModuleToken> _typeRefsInCompilationModuleSet;
private readonly bool _compileGenericDependenciesFromVersionBubbleModuleSet;
private readonly bool _isCompositeBuildMode;
+ private readonly bool _isInputBubble;
private readonly ConcurrentDictionary<TypeDesc, bool> _containsTypeLayoutCache = new ConcurrentDictionary<TypeDesc, bool>();
private readonly ConcurrentDictionary<TypeDesc, bool> _versionsWithTypeCache = new ConcurrentDictionary<TypeDesc, bool>();
private readonly ConcurrentDictionary<MethodDesc, bool> _versionsWithMethodCache = new ConcurrentDictionary<MethodDesc, bool>();
public ReadyToRunCompilationModuleGroupBase(
TypeSystemContext context,
bool isCompositeBuildMode,
+ bool isInputBubble,
IEnumerable<EcmaModule> compilationModuleSet,
IEnumerable<ModuleDesc> versionBubbleModuleSet,
bool compileGenericDependenciesFromVersionBubbleModuleSet)
{
_compilationModuleSet = new HashSet<EcmaModule>(compilationModuleSet);
_isCompositeBuildMode = isCompositeBuildMode;
+ _isInputBubble = isInputBubble;
Debug.Assert(_isCompositeBuildMode || _compilationModuleSet.Count == 1);
var defType = (MetadataType)type;
if (!ContainsType(defType))
{
- if (!defType.IsValueType)
- {
- // Eventually, we may respect the non-versionable attribute for reference types too. For now, we are going
- // to play is safe and ignore it.
- return false;
- }
-
- // Valuetypes with non-versionable attribute are candidates for fixed layout. Reject the rest.
- if (!defType.HasCustomAttribute("System.Runtime.Versioning", "NonVersionableAttribute"))
- {
- return false;
- }
+ return false;
}
if (!defType.IsValueType && !ContainsTypeLayout(defType.BaseType))
{
public sealed override bool IsCompositeBuildMode => _isCompositeBuildMode;
+ public sealed override bool IsInputBubble => _isInputBubble;
+
public sealed override IEnumerable<EcmaModule> CompilationModuleSet => _compilationModuleSet;
private bool ComputeTypeVersionsWithCode(TypeDesc type)
public ReadyToRunSingleAssemblyCompilationModuleGroup(
TypeSystemContext context,
bool isCompositeBuildMode,
+ bool isInputBubble,
IEnumerable<EcmaModule> compilationModuleSet,
IEnumerable<ModuleDesc> versionBubbleModuleSet,
bool compileGenericDependenciesFromVersionBubbleModuleSet) :
base(context,
isCompositeBuildMode,
+ isInputBubble,
compilationModuleSet,
versionBubbleModuleSet,
compileGenericDependenciesFromVersionBubbleModuleSet)
public SingleMethodCompilationModuleGroup(
TypeSystemContext context,
bool isCompositeBuildMode,
+ bool isInputBubble,
IEnumerable<EcmaModule> compilationModuleSet,
IEnumerable<ModuleDesc> versionBubbleModuleSet,
bool compileGenericDependenciesFromVersionBubbleModuleSet,
MethodDesc method) :
base(context,
isCompositeBuildMode,
+ isInputBubble,
compilationModuleSet,
versionBubbleModuleSet,
compileGenericDependenciesFromVersionBubbleModuleSet)
compilationGroup = new SingleMethodCompilationModuleGroup(
typeSystemContext,
_commandLineOptions.Composite,
+ _commandLineOptions.InputBubble,
inputModules,
versionBubbleModules,
_commandLineOptions.CompileBubbleGenerics,
compilationGroup = new ReadyToRunSingleAssemblyCompilationModuleGroup(
typeSystemContext,
_commandLineOptions.Composite,
+ _commandLineOptions.InputBubble,
inputModules,
versionBubbleModules,
_commandLineOptions.CompileBubbleGenerics);