Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,8 @@ internal void SetFormat(string format, int curIndex, int length)

public override bool IsTypeDefinition => false;

public override bool IsByRefLike => false;

public override bool IsSZArray => _rank <= 1 && _isSzArray;

public override Type? GetNullableUnderlyingType() => null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,7 @@ public override Type? BaseType
protected override TypeAttributes GetAttributeFlagsImpl() { return _genericType.Attributes; }

public override bool IsTypeDefinition => false;
public override bool IsByRefLike => _genericType.IsByRefLike;
public override bool IsSZArray => false;

protected override bool IsArrayImpl() { return false; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ public override Type[] GetGenericParameterConstraints() =>
public override bool IsGenericType => false;
public override bool IsGenericParameter => true;
public override bool IsConstructedGenericType => false;
public override bool IsByRefLike => false;
public override bool ContainsGenericParameters => false;
public override MethodBase? DeclaringMethod => _type.DeclaringMethod;
public override Type? BaseType => _parent;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -622,6 +622,7 @@ public override Type GetEnumUnderlyingType()
throw new ArgumentException(SR.Argument_MustBeEnum);
}
}
public override bool IsByRefLike => false;
public override bool IsSZArray => false;
public override Guid GUID => throw new NotSupportedException();
public override Type? BaseType => _typeParent;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1010,5 +1010,38 @@ public void TestContainsGenericParametersOnMethodCtorOfConstructedGenericType()
Assert.False(TypeBuilder.GetConstructor(instantiatedTypeBuilder2, constructorBuilder).ContainsGenericParameters);
Assert.False(TypeBuilder.GetMethod(instantiatedTypeBuilder2, methodBuilder).ContainsGenericParameters);
}

[Fact]
public void IsByRefLike_TypeBuilderAndConstructedTypes_ReturnsFalse()
{
AssemblySaveTools.PopulateAssemblyBuilderAndTypeBuilder(out TypeBuilder type);
GenericTypeParameterBuilder[] typeParams = type.DefineGenericParameters("T");

Type[] types =
[
type,
typeParams[0],
type.MakeGenericType(typeof(int)),
type.MakeArrayType(),
type.MakeArrayType(2),
type.MakePointerType(),
type.MakeByRefType(),
typeParams[0].MakeArrayType(),
typeParams[0].MakePointerType(),
typeParams[0].MakeByRefType(),
];

Assert.All(types, t => Assert.False(t.IsByRefLike));
}

[Theory]
[InlineData(typeof(Span<>), true)]
[InlineData(typeof(ReadOnlySpan<>), true)]
[InlineData(typeof(List<>), false)]
public void IsByRefLike_RuntimeGenericTypeInstantiatedOverTypeBuilder_MatchesGenericTypeDefinition(Type genericTypeDefinition, bool expected)
{
AssemblySaveTools.PopulateAssemblyBuilderAndTypeBuilder(out TypeBuilder type);
Assert.Equal(expected, genericTypeDefinition.MakeGenericType(type).IsByRefLike);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Collections.Generic;
using Xunit;

namespace System.Reflection.Emit.Tests
Expand All @@ -13,5 +14,36 @@ public void IsByRefLikeReturnsFalse()
TypeBuilder type = Helpers.DynamicType(TypeAttributes.Public);
Assert.False(type.IsByRefLike);
}

[Fact]
public void IsByRefLike_TypesConstructedFromTypeBuilder_ReturnsFalse()
{
TypeBuilder type = Helpers.DynamicType(TypeAttributes.Public);
GenericTypeParameterBuilder[] typeParams = type.DefineGenericParameters("T");

Type[] constructedTypes =
[
type.MakeGenericType(typeof(int)),
type.MakeArrayType(),
type.MakeArrayType(2),
type.MakePointerType(),
type.MakeByRefType(),
typeParams[0].MakeArrayType(),
typeParams[0].MakePointerType(),
typeParams[0].MakeByRefType(),
];

Assert.All(constructedTypes, t => Assert.False(t.IsByRefLike));
}

[Theory]
[InlineData(typeof(Span<>), true)]
[InlineData(typeof(ReadOnlySpan<>), true)]
[InlineData(typeof(List<>), false)]
public void IsByRefLike_RuntimeGenericTypeInstantiatedOverTypeBuilder_MatchesGenericTypeDefinition(Type genericTypeDefinition, bool expected)
{
TypeBuilder type = Helpers.DynamicType(TypeAttributes.Public);
Assert.Equal(expected, genericTypeDefinition.MakeGenericType(type).IsByRefLike);
}
}
}
Loading