Skip to content

Commit

Permalink
Improve tests
Browse files Browse the repository at this point in the history
  • Loading branch information
ltrzesniewski committed Jul 27, 2024
1 parent 6191eb0 commit 4236107
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 5 deletions.
1 change: 1 addition & 0 deletions src/InlineIL.Tests.Common/ReferencedAssemblyType.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ public unsafe class TypeFromReferencedAssembly
{
public readonly StructFromReferencedAssembly FieldWithTypeFromThisAssembly = default;
public readonly StructFromReferencedAssembly* PointerField = default;
public readonly TypeFromReferencedAssembly<StructFromReferencedAssembly> GenericTypeField = new();
}

public unsafe class TypeFromReferencedAssembly<T>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.CompilerServices;
using InlineIL.Tests.Common;
using static InlineIL.IL.Emit;

Expand All @@ -9,7 +10,7 @@ namespace InlineIL.Tests.UnverifiableAssemblyToProcess;
[SuppressMessage("ReSharper", "UnusedMember.Global")]
[SuppressMessage("ReSharper", "UnassignedField.Global")]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
public class FieldRefTestCases
public unsafe class FieldRefTestCases
{
public void ReadFieldFromReferencedAssemblyType()
{
Expand All @@ -24,22 +25,38 @@ public void ReadPointerFieldFromReferencedAssemblyType()
{
IL.Push(new TypeFromReferencedAssembly());
Ldfld(FieldRef.Field(typeof(TypeFromReferencedAssembly), nameof(TypeFromReferencedAssembly.PointerField)));
Pop();
Call(MethodRef.Method(typeof(FieldRefTestCases), nameof(ConsumePointer)));
}

public void ReadGenericPointerFieldFromReferencedAssemblyType()
{
IL.Push(new TypeFromReferencedAssembly<OtherStructFromReferencedAssembly>());
Ldfld(FieldRef.Field(typeof(TypeFromReferencedAssembly<OtherStructFromReferencedAssembly>), nameof(TypeFromReferencedAssembly<OtherStructFromReferencedAssembly>.PointerField)));
Pop();
Call(MethodRef.Method(typeof(FieldRefTestCases), nameof(ConsumePointer)));

IL.Push(new TypeFromReferencedAssembly<DateTime>());
Ldfld(FieldRef.Field(typeof(TypeFromReferencedAssembly<DateTime>), nameof(TypeFromReferencedAssembly<DateTime>.PointerField)));
Pop();
Call(MethodRef.Method(typeof(FieldRefTestCases), nameof(ConsumePointer)));

IL.Push(new TypeFromReferencedAssembly<InternalStruct>());
Ldfld(FieldRef.Field(typeof(TypeFromReferencedAssembly<InternalStruct>), nameof(TypeFromReferencedAssembly<InternalStruct>.PointerField)));
Pop();
Call(MethodRef.Method(typeof(FieldRefTestCases), nameof(ConsumePointer)));
}

public void ReadGenericTypeFieldFromReferencedAssemblyType()
{
IL.Push(new TypeFromReferencedAssembly());
Ldfld(FieldRef.Field(typeof(TypeFromReferencedAssembly), nameof(TypeFromReferencedAssembly.GenericTypeField)));
Ldfld(FieldRef.Field(typeof(TypeFromReferencedAssembly<StructFromReferencedAssembly>), nameof(TypeFromReferencedAssembly<StructFromReferencedAssembly>.PointerField)));
Call(MethodRef.Method(typeof(FieldRefTestCases), nameof(ConsumePointer)));
}

[MethodImpl(MethodImplOptions.NoInlining)]
[SuppressMessage("ReSharper", "UnusedParameter.Local")]
private static void ConsumePointer(void* value)
{
// This could probably have been replaced by a pop, but having a noinline method
// makes sure the JIT won't be able to optimize away reading the unused field value
}
}

Expand Down
7 changes: 7 additions & 0 deletions src/InlineIL.Tests/Weaving/FieldRefTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,13 @@ public void should_handle_generic_fields_with_types_from_referenced_assemblies()
instance.ReadGenericPointerFieldFromReferencedAssemblyType();
}

[Fact]
public void should_handle_generic_type_fields_from_referenced_assemblies()
{
var instance = GetUnverifiableInstance();
instance.ReadGenericTypeFieldFromReferencedAssemblyType();
}

[Fact]
public void should_reference_field_in_different_ways()
{
Expand Down

0 comments on commit 4236107

Please sign in to comment.