Skip to content

Commit cdf7bcf

Browse files
authored
Fix set value. Implement Runtime.evaluate. (#62142)
1 parent 663e7b4 commit cdf7bcf

File tree

4 files changed

+57
-2
lines changed

4 files changed

+57
-2
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ internal static async Task<JObject> CompileAndRunTheExpression(string expression
329329
expression = expression.Trim();
330330
if (!expression.StartsWith('('))
331331
{
332-
expression = "(" + expression + ")";
332+
expression = "(" + expression + "\n)";
333333
}
334334
SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(expression + @";", cancellationToken: token);
335335

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,17 @@ protected override async Task<bool> AcceptCommand(MessageId id, string method, J
401401
{
402402
return await Step(id, StepKind.Over, token);
403403
}
404-
404+
case "Runtime.evaluate":
405+
{
406+
if (context.CallStack != null)
407+
{
408+
Frame scope = context.CallStack.First<Frame>();
409+
return await OnEvaluateOnCallFrame(id,
410+
scope.Id,
411+
args?["expression"]?.Value<string>(), token);
412+
}
413+
break;
414+
}
405415
case "Debugger.evaluateOnCallFrame":
406416
{
407417
if (!DotnetObjectId.TryParse(args?["callFrameId"], out DotnetObjectId objectId))

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -841,6 +841,37 @@ internal async Task<JToken> GetProperties(string id, JToken fn_args = null, bool
841841
return (null, res);
842842
}
843843

844+
internal async Task RuntimeEvaluateAndCheck(params (string expression, JObject expected)[] args)
845+
{
846+
foreach (var arg in args)
847+
{
848+
var (eval_val, _) = await RuntimeEvaluate(arg.expression);
849+
try
850+
{
851+
await CheckValue(eval_val, arg.expected, arg.expression);
852+
}
853+
catch
854+
{
855+
Console.WriteLine($"CheckValue failed for {arg.expression}. Expected: {arg.expected}, vs {eval_val}");
856+
throw;
857+
}
858+
}
859+
}
860+
internal async Task<(JToken, Result)> RuntimeEvaluate(string expression, bool expect_ok = true)
861+
{
862+
var evaluate_req = JObject.FromObject(new
863+
{
864+
expression = expression
865+
});
866+
867+
var res = await cli.SendCommand("Runtime.evaluate", evaluate_req, token);
868+
AssertEqual(expect_ok, res.IsOk, $"Runtime.evaluate ('{expression}') returned {res.IsOk} instead of {expect_ok}, with Result: {res}");
869+
if (res.IsOk)
870+
return (res.Value["result"], res);
871+
872+
return (null, res);
873+
}
874+
844875
internal async Task<(JToken, Result)> SetVariableValueOnCallFrame(JObject parms, bool expect_ok = true)
845876
{
846877
var res = await cli.SendCommand("Debugger.setVariableValue", parms, token);

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -840,6 +840,20 @@ await EvaluateOnCallFrameFail(id,
840840
(" str", "ReferenceError")
841841
);
842842
});
843+
844+
[Fact]
845+
public async Task EvaluateConstantValueUsingRuntimeEvaluate() => await CheckInspectLocalsAtBreakpointSite(
846+
"DebuggerTests.EvaluateTestsClass", "EvaluateLocals", 9, "EvaluateLocals",
847+
"window.setTimeout(function() { invoke_static_method ('[debugger-test] DebuggerTests.EvaluateTestsClass:EvaluateLocals'); })",
848+
wait_for_event_fn: async (pause_location) =>
849+
{
850+
var dt = new DateTime(2020, 1, 2, 3, 4, 5);
851+
await RuntimeEvaluateAndCheck(
852+
("15\n//comment as vs does\n", TNumber(15)),
853+
("15", TNumber(15)),
854+
("\"15\"\n//comment as vs does\n", TString("15")),
855+
("\"15\"", TString("15")));
856+
});
843857

844858
}
845859

0 commit comments

Comments
 (0)