Skip to content

Commit ec59f65

Browse files
authored
[wasm][debugger] Fix expression evaluation when it is a reference (#41135)
* [wasm][debugger] Fix expression evaluation when it is a reference .. preceded by spaces. Eg: `" foo.dateTime", or `" foo.count"` * Explanation of the fix: - these particular expressions end up in the code path where we get a SimpleMemberAccessExpression, and only one member access (like `a.b.c`) was found. - that code path had `return memberAccessValues[0]?["value"]?.Value<JObject>();` - which is incorrect, and we need to return `memberAccessValues[0]`, which is the value itself.
1 parent 9f75120 commit ec59f65

File tree

3 files changed

+30
-20
lines changed

3 files changed

+30
-20
lines changed

src/mono/wasm/debugger/BrowserDebugProxy/EvaluateExpression.cs

+3-2
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ private static async Task<IList<JObject>> ResolveIdentifiers(IEnumerable<Identif
213213

214214
internal static async Task<JObject> CompileAndRunTheExpression(string expression, MemberReferenceResolver resolver, CancellationToken token)
215215
{
216+
expression = expression.Trim();
216217
SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(@"
217218
using System;
218219
public class CompileAndRunTheExpression
@@ -245,10 +246,10 @@ public static object Evaluate()
245246

246247
var memberAccessValues = await ResolveMemberAccessExpressions(findVarNMethodCall.memberAccesses, resolver, token);
247248

248-
// this.dateTime
249+
// eg. "this.dateTime", " dateTime.TimeOfDay"
249250
if (expressionTree.Kind() == SyntaxKind.SimpleMemberAccessExpression && findVarNMethodCall.memberAccesses.Count == 1)
250251
{
251-
return memberAccessValues[0]?["value"]?.Value<JObject>();
252+
return memberAccessValues[0];
252253
}
253254

254255
var identifierValues = await ResolveIdentifiers(findVarNMethodCall.identifiers, resolver, token);

src/mono/wasm/debugger/BrowserDebugProxy/MonoProxy.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -700,7 +700,7 @@ async Task<bool> OnEvaluateOnCallFrame(MessageId msg_id, int scope_id, string ex
700700
}
701701
else
702702
{
703-
SendResponse(msg_id, Result.Err($"Unable to evaluate {expression}"), token);
703+
SendResponse(msg_id, Result.Err($"Unable to evaluate '{expression}'"), token);
704704
}
705705
}
706706
catch (ReturnAsErrorException ree)

src/mono/wasm/debugger/DebuggerTestSuite/EvaluateOnCallFrameTests.cs

+26-17
Original file line numberDiff line numberDiff line change
@@ -49,22 +49,26 @@ public async Task EvaluateTypeInstanceMembers(string prefix, int bias, string ty
4949
var dateTime = new DateTime(2010, 9, 8, 7, 6, 5 + bias);
5050
var DTProp = dateTime.AddMinutes(10);
5151

52-
await EvaluateOnCallFrameAndCheck(id,
53-
(prefix + "a", TNumber(4)),
54-
55-
// fields
56-
(prefix + "dateTime.TimeOfDay", TValueType("System.TimeSpan", dateTime.TimeOfDay.ToString())),
57-
(prefix + "dateTime", TDateTime(dateTime)),
58-
(prefix + "dateTime.TimeOfDay.Minutes", TNumber(dateTime.TimeOfDay.Minutes)),
59-
60-
// properties
61-
(prefix + "DTProp.TimeOfDay.Minutes", TNumber(DTProp.TimeOfDay.Minutes)),
62-
(prefix + "DTProp", TDateTime(DTProp)),
63-
(prefix + "DTProp.TimeOfDay", TValueType("System.TimeSpan", DTProp.TimeOfDay.ToString())),
64-
65-
(prefix + "IntProp", TNumber(9)),
66-
(prefix + "NullIfAIsNotZero", TObject("DebuggerTests.EvaluateTestsClassWithProperties", is_null: true))
67-
);
52+
foreach (var pad in new[] { String.Empty, " " })
53+
{
54+
var padded_prefix = pad + prefix;
55+
await EvaluateOnCallFrameAndCheck(id,
56+
($"{padded_prefix}a", TNumber(4)),
57+
58+
// fields
59+
($"{padded_prefix}dateTime.TimeOfDay", TValueType("System.TimeSpan", dateTime.TimeOfDay.ToString())),
60+
($"{padded_prefix}dateTime", TDateTime(dateTime)),
61+
($"{padded_prefix}dateTime.TimeOfDay.Minutes", TNumber(dateTime.TimeOfDay.Minutes)),
62+
63+
// properties
64+
($"{padded_prefix}DTProp.TimeOfDay.Minutes", TNumber(DTProp.TimeOfDay.Minutes)),
65+
($"{padded_prefix}DTProp", TDateTime(DTProp)),
66+
($"{padded_prefix}DTProp.TimeOfDay", TValueType("System.TimeSpan", DTProp.TimeOfDay.ToString())),
67+
68+
($"{padded_prefix}IntProp", TNumber(9)),
69+
($"{padded_prefix}NullIfAIsNotZero", TObject("DebuggerTests.EvaluateTestsClassWithProperties", is_null: true))
70+
);
71+
}
6872
});
6973

7074
[Theory]
@@ -104,12 +108,15 @@ public async Task EvaluateMethodLocals(string type, string method, string bp_fun
104108
var dt = new DateTime(2025, 3, 5, 7, 9, 11);
105109
await EvaluateOnCallFrameAndCheck(id,
106110
("d", TNumber(401)),
111+
(" d", TNumber(401)),
107112
("e", TNumber(402)),
108113
("f", TNumber(403)),
109114

110115
// property on a local
111116
("local_dt", TDateTime(dt)),
112-
("local_dt.Date", TDateTime(dt.Date)));
117+
(" local_dt", TDateTime(dt)),
118+
("local_dt.Date", TDateTime(dt.Date)),
119+
(" local_dt.Date", TDateTime(dt.Date)));
113120
});
114121

115122
[Fact]
@@ -212,8 +219,10 @@ await EvaluateOnCallFrameAndCheck(id,
212219
// "((dt))", TObject("foo")); //FIXME:
213220

214221
("this", TObject("DebuggerTests.EvaluateTestsClass.TestEvaluate")),
222+
(" this", TObject("DebuggerTests.EvaluateTestsClass.TestEvaluate")),
215223

216224
("5", TNumber(5)),
225+
(" 5", TNumber(5)),
217226
("d + e", TNumber(203)),
218227
("e + 10", TNumber(112)),
219228

0 commit comments

Comments
 (0)