Skip to content
Prev Previous commit
Next Next commit
Reverted to @radical's version.
  • Loading branch information
ilonatommy committed Oct 13, 2022
commit ea381f80a9bc1eeaffe1f969480aae52c38d6e11
Original file line number Diff line number Diff line change
Expand Up @@ -9,27 +9,30 @@ namespace Microsoft.WebAssembly.Diagnostics;

internal sealed class InternalUseFieldName
{
public static string Hidden => "__hidden__";
public static string State => "__state__";
public static string Section => "__section__";
public static string Owner => "__owner__";
public static string IsStatic => "__isStatic__";
public static string IsNewSlot => "__isNewSlot__";
public static string IsBackingField => "__isBackingField__";
public static string ParentTypeId => "__parentTypeId__";
public static InternalUseFieldName Hidden = new(nameof(Hidden));
public static InternalUseFieldName State = new(nameof(State));
public static InternalUseFieldName Section = new(nameof(Section));
public static InternalUseFieldName Owner = new(nameof(Owner));
public static InternalUseFieldName IsStatic = new(nameof(IsStatic));
public static InternalUseFieldName IsNewSlot = new(nameof(IsNewSlot));
public static InternalUseFieldName IsBackingField = new(nameof(IsBackingField));
public static InternalUseFieldName ParentTypeId = new(nameof(ParentTypeId));

private static readonly HashSet<string> s_names = new()
{
Hidden,
State,
Section,
Owner,
IsStatic,
IsNewSlot,
IsBackingField,
ParentTypeId
Hidden.Name,
State.Name,
Section.Name,
Owner.Name,
IsStatic.Name,
IsNewSlot.Name,
IsBackingField.Name,
ParentTypeId.Name
};

private InternalUseFieldName(string fieldName) => Name = $"__{fieldName}__";

public static int Count => s_names.Count;
public static bool IsKnown(string name) => !string.IsNullOrEmpty(name) && s_names.Contains(name);
public string Name { get; init; }
}
48 changes: 23 additions & 25 deletions src/mono/wasm/debugger/BrowserDebugProxy/MemberObjectsExplorer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,17 +63,17 @@ private static async Task<JObject> ReadFieldValue(
// for backing fields, we are getting it from the properties
typePropertiesBrowsableInfo.TryGetValue(field.Name, out state);
}
fieldValue[InternalUseFieldName.State] = state?.ToString();
fieldValue[InternalUseFieldName.Section] = field.Attributes.HasFlag(FieldAttributes.Private)
fieldValue[InternalUseFieldName.State.Name] = state?.ToString();
fieldValue[InternalUseFieldName.Section.Name] = field.Attributes.HasFlag(FieldAttributes.Private)
? "private" : "result";

if (field.IsBackingField)
{
fieldValue[InternalUseFieldName.IsBackingField] = true;
fieldValue[InternalUseFieldName.ParentTypeId] = parentTypeId;
fieldValue[InternalUseFieldName.IsBackingField.Name] = true;
fieldValue[InternalUseFieldName.ParentTypeId.Name] = parentTypeId;
}
if (field.Attributes.HasFlag(FieldAttributes.Static))
fieldValue[InternalUseFieldName.IsStatic] = true;
fieldValue[InternalUseFieldName.IsStatic.Name] = true;

if (getObjectOptions.HasFlag(GetObjectCommandOptions.WithSetter))
{
Expand Down Expand Up @@ -241,7 +241,7 @@ public static async Task<JArray> ExpandFieldValues(
if (typeInfo.Info.IsNonUserCode && getCommandOptions.HasFlag(GetObjectCommandOptions.JustMyCode) && field.Attributes.HasFlag(FieldAttributes.Private))
continue;

if (!Enum.TryParse(fieldValue[InternalUseFieldName.State].Value<string>(), out DebuggerBrowsableState fieldState)
if (!Enum.TryParse(fieldValue[InternalUseFieldName.State.Name].Value<string>(), out DebuggerBrowsableState fieldState)
|| fieldState == DebuggerBrowsableState.Collapsed)
{
fieldValues.Add(fieldValue);
Expand Down Expand Up @@ -287,8 +287,6 @@ public static async Task<JArray> GetExpandedMemberValues(
{
if (state is DebuggerBrowsableState.RootHidden)
{
if (namePrefix == "valueTypeEnumRootHidden")
Console.WriteLine($"namePrefix = {namePrefix}; typeName = {typeName}");
if (MonoSDBHelper.IsPrimitiveType(typeName))
return GetHiddenElement();

Expand All @@ -304,7 +302,7 @@ public static async Task<JArray> GetExpandedMemberValues(
JArray GetHiddenElement()
{
var emptyHidden = JObject.FromObject(new { name = namePrefix });
emptyHidden.Add(InternalUseFieldName.Hidden, true);
emptyHidden.Add(InternalUseFieldName.Hidden.Name, true);
return new JArray(emptyHidden);
}
}
Expand Down Expand Up @@ -366,14 +364,14 @@ public static async Task<Dictionary<string, JObject>> ExpandPropertyValues(
continue;
}

bool isExistingMemberABackingField = existingMember[InternalUseFieldName.IsBackingField]?.Value<bool>() == true;
bool isExistingMemberABackingField = existingMember[InternalUseFieldName.IsBackingField.Name]?.Value<bool>() == true;
if (isOwn && !isExistingMemberABackingField)
{
// repeated propname on the same type! cannot happen
throw new Exception($"Internal Error: should not happen. propName: {propName}. Existing all members: {string.Join(",", allMembers.Keys)}");
}

bool isExistingMemberABackingFieldOwnedByThisType = isExistingMemberABackingField && existingMember[InternalUseFieldName.Owner]?.Value<string>() == typeName;
bool isExistingMemberABackingFieldOwnedByThisType = isExistingMemberABackingField && existingMember[InternalUseFieldName.Owner.Name]?.Value<string>() == typeName;
if (isExistingMemberABackingField && (isOwn || isExistingMemberABackingFieldOwnedByThisType))
{
// this is the property corresponding to the backing field in *this* type
Expand All @@ -387,8 +385,8 @@ public static async Task<Dictionary<string, JObject>> ExpandPropertyValues(
{
// this has `new` keyword if it is newSlot but direct child was not a newSlot:
var child = allMembers.FirstOrDefault(
kvp => (kvp.Key == propName || kvp.Key.StartsWith($"{propName} (")) && kvp.Value[InternalUseFieldName.ParentTypeId]?.Value<int>() == typeId).Value;
bool wasOverriddenByDerivedType = child != null && child[InternalUseFieldName.IsNewSlot]?.Value<bool>() != true;
kvp => (kvp.Key == propName || kvp.Key.StartsWith($"{propName} (")) && kvp.Value[InternalUseFieldName.ParentTypeId.Name]?.Value<int>() == typeId).Value;
bool wasOverriddenByDerivedType = child != null && child[InternalUseFieldName.IsNewSlot.Name]?.Value<bool>() != true;
if (wasOverriddenByDerivedType)
{
/*
Expand All @@ -414,7 +412,7 @@ public static async Task<Dictionary<string, JObject>> ExpandPropertyValues(
*/

JObject backingFieldForHiddenProp = allMembers.GetValueOrDefault(overriddenOrHiddenPropName);
if (backingFieldForHiddenProp is null || backingFieldForHiddenProp[InternalUseFieldName.IsBackingField]?.Value<bool>() != true)
if (backingFieldForHiddenProp is null || backingFieldForHiddenProp[InternalUseFieldName.IsBackingField.Name]?.Value<bool>() != true)
{
// hiding with a non-auto property, so nothing to adjust
// add the new property
Expand All @@ -429,12 +427,12 @@ public static async Task<Dictionary<string, JObject>> ExpandPropertyValues(

async Task UpdateBackingFieldWithPropertyAttributes(JObject backingField, string autoPropName, MethodAttributes getterMemberAccessAttrs, DebuggerBrowsableState? state)
{
backingField[InternalUseFieldName.Section] = getterMemberAccessAttrs switch
backingField[InternalUseFieldName.Section.Name] = getterMemberAccessAttrs switch
{
MethodAttributes.Private => "private",
_ => "result"
};
backingField[InternalUseFieldName.State] = state?.ToString();
backingField[InternalUseFieldName.State.Name] = state?.ToString();

if (state is null)
return;
Expand Down Expand Up @@ -477,16 +475,16 @@ async Task AddProperty(
}

propRet["isOwn"] = isOwn;
propRet[InternalUseFieldName.Section] = getterAttrs switch
propRet[InternalUseFieldName.Section.Name] = getterAttrs switch
{
MethodAttributes.Private => "private",
_ => "result"
};
propRet[InternalUseFieldName.State] = state?.ToString();
propRet[InternalUseFieldName.State.Name] = state?.ToString();
if (parentTypeId != -1)
{
propRet[InternalUseFieldName.ParentTypeId] = parentTypeId;
propRet[InternalUseFieldName.IsNewSlot] = isNewSlot;
propRet[InternalUseFieldName.ParentTypeId.Name] = parentTypeId;
propRet[InternalUseFieldName.IsNewSlot.Name] = isNewSlot;
}

string namePrefix = GetNamePrefixForValues(propNameWithSufix, typeName, isOwn, state);
Expand Down Expand Up @@ -591,7 +589,7 @@ public static async Task<GetMembersResult> GetObjectMemberValues(
if (getCommandType.HasFlag(GetObjectCommandOptions.AccessorPropertiesOnly))
{
foreach (var f in allFields)
f[InternalUseFieldName.Hidden] = true;
f[InternalUseFieldName.Hidden.Name] = true;
}
AddOnlyNewFieldValuesByNameTo(allFields, allMembers, typeName, isOwn);
}
Expand Down Expand Up @@ -637,8 +635,8 @@ static void AddOnlyNewFieldValuesByNameTo(JArray namedValues, IDictionary<string
if (valuesDict.TryAdd(name, item as JObject))
{
// new member
if (item[InternalUseFieldName.IsBackingField]?.Value<bool>() == true)
item[InternalUseFieldName.Owner] = typeName;
if (item[InternalUseFieldName.IsBackingField.Name]?.Value<bool>() == true)
item[InternalUseFieldName.Owner.Name] = typeName;
continue;
}

Expand Down Expand Up @@ -726,10 +724,10 @@ public static GetMembersResult FromValues(JArray values, bool splitMembersByAcce

private void Split(JToken member)
{
if (member[InternalUseFieldName.Hidden]?.Value<bool>() == true)
if (member[InternalUseFieldName.Hidden.Name]?.Value<bool>() == true)
return;

if (member[InternalUseFieldName.Section]?.Value<string>() is not string section)
if (member[InternalUseFieldName.Section.Name]?.Value<string>() is not string section)
{
Result.Add(member);
return;
Expand Down
8 changes: 4 additions & 4 deletions src/mono/wasm/debugger/BrowserDebugProxy/ValueTypeClass.cs
Original file line number Diff line number Diff line change
Expand Up @@ -98,15 +98,15 @@ JObject GetFieldWithMetadata(FieldTypeClass field, JObject fieldValue, bool isSt
if (isStatic)
fieldValue["name"] = field.Name;
FieldAttributes attr = field.Attributes & FieldAttributes.FieldAccessMask;
fieldValue[InternalUseFieldName.Section] = attr == FieldAttributes.Private ? "private" : "result";
fieldValue[InternalUseFieldName.Section.Name] = attr == FieldAttributes.Private ? "private" : "result";

if (field.IsBackingField)
{
fieldValue[InternalUseFieldName.IsBackingField] = true;
fieldValue[InternalUseFieldName.IsBackingField.Name] = true;
return fieldValue;
}
typeFieldsBrowsableInfo.TryGetValue(field.Name, out DebuggerBrowsableState? state);
fieldValue[InternalUseFieldName.State] = state?.ToString();
fieldValue[InternalUseFieldName.State.Name] = state?.ToString();
return fieldValue;
}
}
Expand Down Expand Up @@ -244,7 +244,7 @@ public async Task ExpandedFieldValues(MonoSDBHelper sdbHelper, bool includeStati
JArray visibleFields = new();
foreach (JObject field in fields)
{
if (!Enum.TryParse(field[InternalUseFieldName.State]?.Value<string>(), out DebuggerBrowsableState state))
if (!Enum.TryParse(field[InternalUseFieldName.State.Name]?.Value<string>(), out DebuggerBrowsableState state))
{
visibleFields.Add(field);
continue;
Expand Down