From d6f1257410345d194c51686b13d36658a46f6c4a Mon Sep 17 00:00:00 2001 From: EgorBo Date: Tue, 11 Oct 2022 13:32:14 +0200 Subject: [PATCH 1/3] Fix gc hole in Frozen.cs --- src/tests/GC/API/Frozen/Frozen.cs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/tests/GC/API/Frozen/Frozen.cs b/src/tests/GC/API/Frozen/Frozen.cs index 3a9ad49175064b..33881e8d6238ae 100644 --- a/src/tests/GC/API/Frozen/Frozen.cs +++ b/src/tests/GC/API/Frozen/Frozen.cs @@ -134,16 +134,17 @@ internal class Node internal static class Program { - private static unsafe IntPtr GetMethodTablePointer(object obj) + internal sealed class RawData { - GCHandle gch = GCHandle.Alloc(obj); - IntPtr pointerToPointerToObject = GCHandle.ToIntPtr(gch); - IntPtr pointerToObject = *((IntPtr*)pointerToPointerToObject); - IntPtr methodTable = *((IntPtr*)pointerToObject); - gch.Free(); - return methodTable; + public byte Data; } + internal static ref byte GetRawData(this object obj) => + ref Unsafe.As(obj).Data; + + internal static unsafe IntPtr GetMethodTablePointer(object obj) => + (IntPtr)Unsafe.Add(ref Unsafe.As(ref obj.GetRawData()), -1); + private static unsafe int Main(string[] args) { Node template = new Node(); From 0b721e7e2e21634f8c0a90cf422ba11612c0190d Mon Sep 17 00:00:00 2001 From: Egor Bogatov Date: Tue, 11 Oct 2022 17:51:16 +0200 Subject: [PATCH 2/3] Update src/tests/GC/API/Frozen/Frozen.cs Co-authored-by: Jan Kotas --- src/tests/GC/API/Frozen/Frozen.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/GC/API/Frozen/Frozen.cs b/src/tests/GC/API/Frozen/Frozen.cs index 33881e8d6238ae..ef84e01051b94b 100644 --- a/src/tests/GC/API/Frozen/Frozen.cs +++ b/src/tests/GC/API/Frozen/Frozen.cs @@ -147,7 +147,7 @@ internal static unsafe IntPtr GetMethodTablePointer(object obj) => private static unsafe int Main(string[] args) { - Node template = new Node(); + IntPtr methodTable = typeof(Node).TypeHandle.Value; IntPtr methodTable = GetMethodTablePointer(template); FrozenSegmentBuilder frozenSegmentBuilder = new FrozenSegmentBuilder(1000); From c0425dda6faed4994d1900d92826903b05c65353 Mon Sep 17 00:00:00 2001 From: EgorBo Date: Tue, 11 Oct 2022 17:51:54 +0200 Subject: [PATCH 3/3] Clean up --- src/tests/GC/API/Frozen/Frozen.cs | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/tests/GC/API/Frozen/Frozen.cs b/src/tests/GC/API/Frozen/Frozen.cs index ef84e01051b94b..6067a21e915268 100644 --- a/src/tests/GC/API/Frozen/Frozen.cs +++ b/src/tests/GC/API/Frozen/Frozen.cs @@ -134,21 +134,9 @@ internal class Node internal static class Program { - internal sealed class RawData - { - public byte Data; - } - - internal static ref byte GetRawData(this object obj) => - ref Unsafe.As(obj).Data; - - internal static unsafe IntPtr GetMethodTablePointer(object obj) => - (IntPtr)Unsafe.Add(ref Unsafe.As(ref obj.GetRawData()), -1); - private static unsafe int Main(string[] args) { IntPtr methodTable = typeof(Node).TypeHandle.Value; - IntPtr methodTable = GetMethodTablePointer(template); FrozenSegmentBuilder frozenSegmentBuilder = new FrozenSegmentBuilder(1000); IntPtr node1Ptr = frozenSegmentBuilder.Allocate(methodTable);