SIGN IN SIGN UP

Return evaluate result in DAP response body instead of writing to stdout (#2027)

When a DAP client sends an `evaluate` request with `context: "repl"` and no
`frameId`, debugpy forces the expression through the exec code path. Previously,
if the expression could be compiled as an eval (e.g. `2 + 2`),
`evaluate_expression` would compute the result but write it to `sys.stdout` and
return `None`. The caller in `internal_evaluate_expression_json` would then send
back `result=""` in the response body. Clients that read the response
body would get nothing, while the actual value was emitted as a DAP output event.

This changes `evaluate_expression` to return the computed result from the
eval-within-exec path instead of printing it. The caller now captures that
return value and includes it in the response body. Pure exec statements (e.g.
`x = 42`) continue to return `None` and produce `result=""` as before.

VS Code is unaffected because it always provides a `frameId`, which routes
through the normal eval path where results already go into the response body.
P
Philip DePetro committed
12bd4fef7ea5c35248d9f175f5b0218b970fa64c
Parent: 8bd57a7
Committed by GitHub <noreply@github.com> on 5/27/2026, 7:01:07 PM