Skip to content
This repository has been archived by the owner on Jan 23, 2023. It is now read-only.

Adding placeholder Span debugger proxy #14749

Merged
merged 2 commits into from
Nov 8, 2017
Merged
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 @@ -438,6 +438,7 @@
<Compile Include="$(MSBuildThisFileDirectory)System\SerializableAttribute.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Single.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Span.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\SpanDebugView.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Span.NonGeneric.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\String.Searching.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\StringSpanHelpers.cs" />
Expand Down
1 change: 1 addition & 0 deletions src/mscorlib/shared/System/ReadOnlySpan.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ namespace System
/// ReadOnlySpan represents a contiguous region of arbitrary memory. Unlike arrays, it can point to either managed
/// or native memory, or to memory allocated on the stack. It is type- and memory-safe.
/// </summary>
[DebuggerTypeProxy(typeof(SpanDebugView<>))]
[DebuggerDisplay("{DebuggerDisplay,nq}")]
[NonVersionable]
public readonly ref struct ReadOnlySpan<T>
Expand Down
1 change: 1 addition & 0 deletions src/mscorlib/shared/System/Span.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ namespace System
/// Span represents a contiguous region of arbitrary memory. Unlike arrays, it can point to either managed
/// or native memory, or to memory allocated on the stack. It is type- and memory-safe.
/// </summary>
[DebuggerTypeProxy(typeof(SpanDebugView<>))]
[DebuggerDisplay("{DebuggerDisplay,nq}")]
[NonVersionable]
public readonly ref struct Span<T>
Expand Down
28 changes: 28 additions & 0 deletions src/mscorlib/shared/System/SpanDebugView.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;

namespace System
{
internal sealed class SpanDebugView<T>
{
private readonly T[] _array;

public SpanDebugView(Span<T> span)
{
_array = span.ToArray();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not sure if making copy will work. You should talk to the debugger people or try on some other type wrapping an array. The reason is that I think the debugger instantiates just one proxy and then calls the properties on it multiple times (when it needs to refresh the view).

Copy link
Author

@ahsonkhan ahsonkhan Nov 8, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't understand. If the instantiation only happens once and only the items property gets called, then wouldn't this issue cause problems while debugging slow span too (see SpanDebugView)?

Can you provide a code sample that would cause issues?

byte[] array = new byte[5] { 1, 2, 3, 4, 5 };

string[] strArray = new string[6] { "12", "ab", "agfs", "AGadg", "ag", "" };

var span = new Span<byte>(array, 1, 3);
Console.WriteLine(span.Length);

span = span.Slice(2);

var rospan = new ReadOnlySpan<byte>(array, 1, 3);
Console.WriteLine(rospan.Length);

var span2 = new Span<string>(strArray, 1, 3);
Console.WriteLine(span2.Length);
}

image

image

}

public SpanDebugView(ReadOnlySpan<T> span)
{
_array = span.ToArray();
}

[DebuggerBrowsable(DebuggerBrowsableState.RootHidden)]
public T[] Items => _array;
}
}