From 7750b9a8d69228ee281fdda89cd9afee8cf98113 Mon Sep 17 00:00:00 2001 From: dudik Date: Wed, 19 Nov 2025 14:36:13 +0100 Subject: [PATCH 1/2] Convert return expression when expression type is assignable to T but different (e.g., value type -> object) --- .../Debugger/Expressions/ProbeExpressionParser.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tracer/src/Datadog.Trace/Debugger/Expressions/ProbeExpressionParser.cs b/tracer/src/Datadog.Trace/Debugger/Expressions/ProbeExpressionParser.cs index 7ba6694b31d2..e935599f8cea 100644 --- a/tracer/src/Datadog.Trace/Debugger/Expressions/ProbeExpressionParser.cs +++ b/tracer/src/Datadog.Trace/Debugger/Expressions/ProbeExpressionParser.cs @@ -441,7 +441,15 @@ private Expression HandleReturnType(Expression finalExpr, List object), + // we need an explicit conversion. + return Expression.Convert(finalExpr, typeof(T)); } if (typeof(T).IsNumeric() From 854987a213b37dcd8dcdff28c75735871226433b Mon Sep 17 00:00:00 2001 From: dudik Date: Wed, 19 Nov 2025 14:58:50 +0100 Subject: [PATCH 2/2] add test that reproduce the issue --- .../DebuggerExpressionLanguageTests.cs | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tracer/test/Datadog.Trace.Tests/Debugger/DebuggerExpressionLanguageTests.cs b/tracer/test/Datadog.Trace.Tests/Debugger/DebuggerExpressionLanguageTests.cs index 13af04659172..c41299dc44b8 100644 --- a/tracer/test/Datadog.Trace.Tests/Debugger/DebuggerExpressionLanguageTests.cs +++ b/tracer/test/Datadog.Trace.Tests/Debugger/DebuggerExpressionLanguageTests.cs @@ -111,6 +111,32 @@ public async Task TestMetrics(string expressionTestFilePath) await Test(expressionTestFilePath); } + [Fact] + public void ProbeExpressionParser_ObjectReturnType_AllowsValueTypeResults() + { + // Arrange + var scopeMembers = CreateScopeMembers(); + const string json = """ + { + "ref": "@duration" + } + """; + + // Act + var compiled = ProbeExpressionParser.ParseExpression(json, scopeMembers); + var result = compiled.Delegate( + scopeMembers.InvocationTarget, + scopeMembers.Return, + scopeMembers.Duration, + scopeMembers.Exception, + scopeMembers.Members); + + // Assert + Assert.NotNull(result); + Assert.IsType(result); + Assert.True(compiled.Errors == null || compiled.Errors.Length == 0); + } + private async Task Test(string expressionTestFilePath) { // Arrange