Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Prev Previous commit
Next Next commit
Moving implementation of InvokeToStringAsync to sdbhelper and reuse i…
…t on objects and valuetypes.
  • Loading branch information
thaystg committed Oct 10, 2022
commit 99b24293ffea1955dd80053329c918e353f4a087
44 changes: 3 additions & 41 deletions src/mono/wasm/debugger/BrowserDebugProxy/JObjectValueCreator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -266,45 +266,7 @@ async Task<string> GetNullObjectClassName()
return className;
}
}
private async Task<string> InvokeToStringAsync(List<int> typeIds, int objectId, CancellationToken token)
{
string description = "";
try {
foreach (var typeId in typeIds)
{
var typeInfo = await _sdbAgent.GetTypeInfo(typeId, token);
if (typeInfo == null || typeInfo.Name == "object")
continue;
{
MethodInfo methodInfo = typeInfo.Info.Methods.FirstOrDefault(m => m.Name == "ToString");
if (methodInfo != null)
{
int[] methodIds = await _sdbAgent.GetMethodIdsByName(typeId, "ToString", BindingFlags.DeclaredOnly, token);
if (methodIds != null)
{
foreach (var methodId in methodIds)
{
var methodInfoFromRuntime = await _sdbAgent.GetMethodInfo(methodId, token);
if (methodInfoFromRuntime.Info.GetParametersInfo().Length > 0)
continue;
var toString = await _sdbAgent.InvokeMethod(objectId, methodId, isValueType: false, token);
if (toString["value"]?["value"] != null)
{
description = toString["value"]?["value"].Value<string>();
}
}
}
break;
}
}
}
}
catch (Exception e)
{
_logger.LogDebug($"Error while evaluating ToString method: {e}");
}
return description;
}

private async Task<JObject> ReadAsObjectValue(MonoBinaryReader retDebuggerCmdReader, int typeIdFromAttribute, bool forDebuggerDisplayAttribute, CancellationToken token)
{
var objectId = retDebuggerCmdReader.ReadInt32();
Expand Down Expand Up @@ -334,8 +296,8 @@ private async Task<JObject> ReadAsObjectValue(MonoBinaryReader retDebuggerCmdRea
}
else
{
var toString = await InvokeToStringAsync(typeIds, objectId, token);
if (toString != "")
var toString = await _sdbAgent.InvokeToStringAsync(typeIds, false, false, objectId, BindingFlags.DeclaredOnly, token);
if (toString != null)
description = toString;
}
return Create<object>(value: null, type: "object", description: description, className: className, objectId: $"dotnet:object:{objectId}");
Expand Down
37 changes: 37 additions & 0 deletions src/mono/wasm/debugger/BrowserDebugProxy/MonoSDBHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1839,6 +1839,43 @@ public Task<JObject> InvokeMethod(DotnetObjectId dotnetObjectId, CancellationTok
: throw new ArgumentException($"Cannot invoke method with id {methodId} on {dotnetObjectId}", nameof(dotnetObjectId));
}

public async Task<string> InvokeToStringAsync(List<int> typeIds, bool isValueType, bool isEnum, int objectId, BindingFlags extraFlags, CancellationToken token)
Copy link
Member

Choose a reason for hiding this comment

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

nit: extraFlags could have BindingFlags.Default as the default value.

{
try
{
foreach (var typeId in typeIds)
{
var typeInfo = await GetTypeInfo(typeId, token);
if (typeInfo == null)
continue;
if (typeInfo.Name == "object")
continue;
Microsoft.WebAssembly.Diagnostics.MethodInfo methodInfo = typeInfo.Info.Methods.FirstOrDefault(m => m.Name == "ToString");
if (isEnum != true && methodInfo == null)
continue;
int[] methodIds = await GetMethodIdsByName(typeId, "ToString", extraFlags, token);
if (methodIds == null)
continue;
foreach (var methodId in methodIds)
{
var methodInfoFromRuntime = await GetMethodInfo(methodId, token);
if (methodInfoFromRuntime.Info.GetParametersInfo().Length > 0)
Copy link
Member

Choose a reason for hiding this comment

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

MethodInfoWithDebugInformation implements GetParametersInfo(), so we could shorten:

Suggested change
if (methodInfoFromRuntime.Info.GetParametersInfo().Length > 0)
if (methodInfoFromRuntime.GetParametersInfo().Length > 0)

continue;
var retMethod = await InvokeMethod(objectId, methodId, isValueType, token);
return retMethod["value"]?["value"].Value<string>();
}
}
return null;
}
catch (Exception e)
{
logger.LogDebug($"Error while evaluating ToString method: {e}");
}
return null;
}



public async Task<int> GetPropertyMethodIdByName(int typeId, string propertyName, CancellationToken token)
{
using var retDebuggerCmdReader = await GetTypePropertiesReader(typeId, token);
Expand Down
34 changes: 2 additions & 32 deletions src/mono/wasm/debugger/BrowserDebugProxy/ValueTypeClass.cs
Original file line number Diff line number Diff line change
Expand Up @@ -112,42 +112,12 @@ JObject GetFieldWithMetadata(FieldTypeClass field, JObject fieldValue, bool isSt
}
}

public async Task<string> InvokeToStringAsync(MonoSDBHelper sdbAgent, CancellationToken token)
{
var typeInfo = await sdbAgent.GetTypeInfo(TypeId, token);
if (typeInfo == null)
return null;
if (typeInfo.Name == "object")
return null;
Microsoft.WebAssembly.Diagnostics.MethodInfo methodInfo = typeInfo.Info.Methods.FirstOrDefault(m => m.Name == "ToString");
if (!IsEnum && methodInfo == null)
return null;
int[] methodIds = await sdbAgent.GetMethodIdsByName(TypeId, "ToString", IsEnum ? BindingFlags.Default : BindingFlags.DeclaredOnly, token);
if (methodIds == null)
return null;
try {
foreach (var methodId in methodIds)
{
var methodInfoFromRuntime = await sdbAgent.GetMethodInfo(methodId, token);
if (methodInfoFromRuntime.Info.GetParametersInfo().Length > 0)
continue;
var retMethod = await sdbAgent.InvokeMethod(Buffer, methodId, token, "methodRet");
return retMethod["value"]?["value"].Value<string>();
}
}
catch (Exception e)
{
sdbAgent.logger.LogDebug($"Error while evaluating ToString method: {e}");
}
return null;
}

public async Task<JObject> ToJObject(MonoSDBHelper sdbAgent, bool forDebuggerDisplayAttribute, CancellationToken token)
{
string description = className;
if (ShouldAutoInvokeToString(className) || IsEnum)
{
var toString = await InvokeToStringAsync(sdbAgent, token);
var toString = await sdbAgent.InvokeToStringAsync(new List<int>(){TypeId}, true, IsEnum, Id.Value, IsEnum ? BindingFlags.Default : BindingFlags.DeclaredOnly, token);
if (toString == null)
sdbAgent.logger.LogDebug($"Error while evaluating ToString method on typeId = {TypeId}");
else
Expand All @@ -162,7 +132,7 @@ public async Task<JObject> ToJObject(MonoSDBHelper sdbAgent, bool forDebuggerDis
description = displayString;
else
{
var toString = await InvokeToStringAsync(sdbAgent, token);
var toString = await sdbAgent.InvokeToStringAsync(new List<int>(){TypeId}, true, IsEnum, Id.Value, IsEnum ? BindingFlags.Default : BindingFlags.DeclaredOnly, token);
if (toString != null)
description = toString;
}
Expand Down