Skip to content
Merged
18 changes: 18 additions & 0 deletions src/tests/Loader/classloader/InlineArray/InlineArrayValid.cs
Original file line number Diff line number Diff line change
Expand Up @@ -448,3 +448,21 @@ public static void InlineArrayEqualsGetHashCode_Fails()
});
}
}

[InlineArray(LengthConst)]
public ref struct SpanArr
{
private const int LengthConst = 100;
public Span<object> element;

public int Length => LengthConst;

[UnscopedRef]
public unsafe Span<object>* At(int index)
{
fixed (Span<object>* ptr = &element)
{
return ptr + index;
}
Comment thread
jkoritzinsky marked this conversation as resolved.
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -85,50 +85,3 @@
.field private int32 a
.field private int32 b
}

.class public sequential ansi sealed beforefieldinit SpanArr
extends [System.Runtime]System.ValueType
{
.custom instance void [System.Runtime]System.Runtime.CompilerServices.IsByRefLikeAttribute::.ctor() = (
01 00 00 00
)
.custom instance void [System.Runtime]System.Runtime.CompilerServices.InlineArrayAttribute::.ctor(int32) = (
01 00 64 00 00 00 00 00
)

.field private static literal int32 LengthConst = int32(100)
.field public valuetype [System.Runtime]System.Span`1<object> element

.method public hidebysig
instance valuetype [System.Runtime]System.Span`1<object>* At (
int32
) cil managed
{
.locals init (
[0] valuetype [System.Runtime]System.Span`1<object>& pinned
)
ldarg.0
ldflda valuetype [System.Runtime]System.Span`1<object> SpanArr::element
stloc.0
ldloc.0
conv.u
ldarg.1
conv.i
sizeof valuetype [System.Runtime]System.Span`1<object>
mul
add
ret
}

.method public hidebysig specialname
instance int32 get_Length () cil managed
{
ldc.i4.s 100
ret
}

.property instance int32 Length()
{
.get instance int32 SpanArr::get_Length()
}
}
110 changes: 0 additions & 110 deletions src/tests/Loader/classloader/RefFields/InvalidCSharp.il
Original file line number Diff line number Diff line change
Expand Up @@ -74,113 +74,3 @@
// This field's valid Type would illegally overlap this type's first field using a precise GC.
.field [0] public valuetype InvalidCSharp.InnerValidByRef Invalid
}

.class public sequential ansi sealed beforefieldinit InvalidCSharp.WithRefField
extends [System.Runtime]System.ValueType
{
.custom instance void [System.Runtime]System.Runtime.CompilerServices.IsByRefLikeAttribute::.ctor() = (
01 00 00 00
)
.field public string& Str

.method public hidebysig specialname rtspecialname
instance void .ctor (
string&
) cil managed
{
ldarg.0
ldarg.1
stfld string& InvalidCSharp.WithRefField::Str
ret
}

.method public hidebysig
instance bool ConfirmFieldInstance (
string
) cil managed
{
ldarg.0
ldfld string& InvalidCSharp.WithRefField::Str
ldind.ref
ldarg.1
ceq
ret
}
}

.class public sequential ansi sealed beforefieldinit InvalidCSharp.WithRefStructField
extends [System.Runtime]System.ValueType
{
.custom instance void [System.Runtime]System.Runtime.CompilerServices.IsByRefLikeAttribute::.ctor() = (
01 00 00 00
)
.field public valuetype InvalidCSharp.WithRefField& Field

.method public hidebysig specialname rtspecialname
instance void .ctor (
valuetype InvalidCSharp.WithRefField&
) cil managed
{
ldarg.0
ldarg.1
stfld valuetype InvalidCSharp.WithRefField& InvalidCSharp.WithRefStructField::Field
ret
}

.method public hidebysig
instance bool ConfirmFieldInstance (
valuetype InvalidCSharp.WithRefField&
) cil managed
{
ldarg.0
ldfld valuetype InvalidCSharp.WithRefField& InvalidCSharp.WithRefStructField::Field
ldarg.1
ceq
ret
}
}

.class public sequential ansi sealed beforefieldinit InvalidCSharp.WithTypedReferenceField`1<T>
extends [System.Runtime]System.ValueType
{
.custom instance void [System.Runtime]System.Runtime.CompilerServices.IsByRefLikeAttribute::.ctor() = (
01 00 00 00
)
.field public typedref Field

.method public hidebysig specialname rtspecialname
instance void .ctor (
!T&
) cil managed
{
ldarg.0
ldarg.1
mkrefany !T
stfld typedref valuetype InvalidCSharp.WithTypedReferenceField`1<!T>::Field
ret
}

.method public hidebysig
instance class [System.Runtime]System.Type GetFieldType () cil managed
{
ldarg.0
ldfld typedref valuetype InvalidCSharp.WithTypedReferenceField`1<!T>::Field
refanytype
call class [System.Runtime]System.Type [System.Runtime]System.Type::GetTypeFromHandle(valuetype [System.Runtime]System.RuntimeTypeHandle )
ret
}

.method public hidebysig
instance bool ConfirmFieldInstance (
!T
) cil managed
{
ldarg.0
ldfld typedref valuetype InvalidCSharp.WithTypedReferenceField`1<!T>::Field
refanyval !T
ldind.ref
ldarg.1
ceq
ret
}
}
53 changes: 53 additions & 0 deletions src/tests/Loader/classloader/RefFields/Validate.cs
Original file line number Diff line number Diff line change
Expand Up @@ -129,4 +129,57 @@ public static void Validate_Create_TypedReferenceRefField()
Validate v = new();
Create_TypedReferenceRefField_Worker(v, 1);
}
}

namespace InvalidCSharp
{
public ref struct WithRefField
{
public ref string Str;

public WithRefField(ref string str)
{
Str = ref str;
}

public bool ConfirmFieldInstance(string value)
{
return object.ReferenceEquals(Str, value);
}
}

public ref struct WithRefStructField
{
public ref WithRefField Field;

public WithRefStructField(ref WithRefField field)
{
Field = ref field;
}

public bool ConfirmFieldInstance(ref WithRefField field)
{
return Unsafe.AreSame(ref Field, ref field);
}
}

public ref struct WithTypedReferenceField<T>
{
public TypedReference Field;

public WithTypedReferenceField(ref T value)
{
Field = __makeref(value);
}

public Type GetFieldType()
{
return __reftype(Field);
}

public bool ConfirmFieldInstance(T value)
{
return object.ReferenceEquals(__refvalue(Field, T), value);
}
}
}
Loading
Loading