Skip to content
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
1 change: 1 addition & 0 deletions src/mono/wasm/debugger/BrowserDebugProxy/DebugStore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,7 @@ internal sealed class MethodInfo
internal bool IsEnCMethod;
internal LocalScopeHandleCollection localScopes;
public bool IsStatic() => (methodDef.Attributes & MethodAttributes.Static) != 0;
public MethodAttributes Attributes => methodDef.Attributes;
public int IsAsync { get; set; }
public DebuggerAttributesInfo DebuggerAttrInfo { get; set; }
public TypeInfo TypeInfo { get; }
Expand Down
79 changes: 41 additions & 38 deletions src/mono/wasm/debugger/BrowserDebugProxy/DevToolsHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,64 +63,67 @@ public MessageId(string sessionId, int id)

internal sealed class DotnetObjectId
{
private int? _intValue;

public string Scheme { get; }
public int Value { get; }
public int Value
{
get
{
if (_intValue == null)
throw new ArgumentException($"DotnetObjectId (scheme: {Scheme}, ValueAsJson: {ValueAsJson}) does not have an int value");
return _intValue.Value;
}
}
public int SubValue { get; set; }
public bool IsValueType { get; set; }
public bool IsValueType => Scheme == "valuetype";

public JObject ValueAsJson { get; init; }

public static bool TryParse(JToken jToken, out DotnetObjectId objectId) => TryParse(jToken?.Value<string>(), out objectId);

public static bool TryParse(string id, out DotnetObjectId objectId)
{
objectId = null;
try
{
if (id == null)
return false;

if (!id.StartsWith("dotnet:"))
return false;
if (id == null)
return false;

string[] parts = id.Split(":");
if (!id.StartsWith("dotnet:"))
return false;

if (parts.Length < 3)
return false;
string[] parts = id.Split(":", 3);

objectId = new DotnetObjectId(parts[1], int.Parse(parts[2]));
switch (objectId.Scheme)
{
case "methodId":
if (parts.Length > 4)
{
objectId.SubValue = int.Parse(parts[3]);
objectId.IsValueType = parts[4] == "ValueType";
return true;
}
return false;
}
return true;
}
catch (Exception)
{
if (parts.Length < 3)
return false;
}

objectId = new DotnetObjectId(parts[1], parts[2]);
return true;
}

public DotnetObjectId(string scheme, int value)
{
Scheme = scheme;
Value = value;
}
: this(scheme, value.ToString()) { }

public override string ToString()
public DotnetObjectId(string scheme, string value)
{
switch (Scheme)
Scheme = scheme;
if (int.TryParse(value, out int ival))
{
case "methodId":
return $"dotnet:{Scheme}:{Value}:{SubValue}";
_intValue = ival;
}
else
{
try
{
ValueAsJson = JObject.Parse(value);
}
catch (JsonReaderException) { }
}
return $"dotnet:{Scheme}:{Value}";
}

public override string ToString()
=> _intValue != null
? $"dotnet:{Scheme}:{_intValue}"
: $"dotnet:{Scheme}:{ValueAsJson}";
}

public struct Result
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
using System.Net.Sockets;
using System.Threading;
using System.Threading.Tasks;
using BrowserDebugProxy;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json.Linq;

Expand Down Expand Up @@ -472,7 +473,7 @@ protected override async Task<bool> AcceptCommand(MessageId sessionId, JObject a
var to = args?["to"].Value<string>().Replace("propertyIterator", "");
if (!DotnetObjectId.TryParse(to, out DotnetObjectId objectId))
return false;
var res = await RuntimeGetPropertiesInternal(sessionId, objectId, args, token);
var res = await RuntimeGetObjectMembers(sessionId, objectId, args, token);
var variables = ConvertToFirefoxContent(res);
var o = JObject.FromObject(new
{
Expand Down Expand Up @@ -521,7 +522,7 @@ protected override async Task<bool> AcceptCommand(MessageId sessionId, JObject a
//{"iterator":{"type":"propertyIterator","actor":"server1.conn19.child63/propertyIterator73","count":3},"from":"server1.conn19.child63/obj71"}
if (!DotnetObjectId.TryParse(args?["to"], out DotnetObjectId objectId))
return false;
var res = await RuntimeGetPropertiesInternal(sessionId, objectId, args, token);
var res = await RuntimeGetObjectMembers(sessionId, objectId, args, token);
var variables = ConvertToFirefoxContent(res);
var o = JObject.FromObject(new
{
Expand All @@ -547,7 +548,7 @@ protected override async Task<bool> AcceptCommand(MessageId sessionId, JObject a
if (ctx.CallStack == null)
return false;
Frame scope = ctx.CallStack.FirstOrDefault(s => s.Id == objectId.Value);
var res = await RuntimeGetPropertiesInternal(sessionId, objectId, args, token);
var res = await RuntimeGetObjectMembers(sessionId, objectId, args, token);
var variables = ConvertToFirefoxContent(res);
var o = JObject.FromObject(new
{
Expand Down Expand Up @@ -701,11 +702,12 @@ private static JObject GetPrototype(DotnetObjectId objectId, JObject args)
return o;
}

private static JObject ConvertToFirefoxContent(ValueOrError<JToken> res)
private static JObject ConvertToFirefoxContent(ValueOrError<GetMembersResult> res)
{
JObject variables = new JObject();
//TODO check if res.Error and do something
foreach (var variable in res.Value)
var resVars = res.Value.Flatten();
foreach (var variable in resVars)
{
JObject variableDesc;
if (variable["get"] != null)
Expand Down
Loading