Skip to content

Commit cd5797b

Browse files
committed
feat: implement continuous command evaluation in debug process
1 parent 284cda2 commit cd5797b

1 file changed

Lines changed: 78 additions & 8 deletions

File tree

src/debug.php

Lines changed: 78 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1867,17 +1867,87 @@ function ddless_handle_breakpoint(
18671867

18681868
ddless_log("[ddless] Waiting for debug command...\n");
18691869

1870-
$responseData = ddless_wait_for_command();
1870+
while (true) {
1871+
$responseData = ddless_wait_for_command();
18711872

1872-
if ($responseData === null) {
1873-
ddless_log("[ddless] No response received, continuing execution\n");
1874-
ddless_cleanup_debug_files();
1875-
return;
1876-
}
1873+
if ($responseData === null) {
1874+
ddless_log("[ddless] No response received, continuing execution\n");
1875+
ddless_cleanup_debug_files();
1876+
return;
1877+
}
1878+
1879+
$command = strtolower($responseData['command'] ?? 'continue');
1880+
1881+
ddless_log("[ddless] Received command: {$command}\n");
1882+
1883+
if ($command === 'evaluate') {
1884+
$expression = $responseData['expression'] ?? '';
1885+
$requestId = $responseData['requestId'] ?? '';
1886+
$useStatements = $responseData['useStatements'] ?? [];
1887+
1888+
if ($expression === '') {
1889+
$evalPayload = [
1890+
'type' => 'evaluate_result',
1891+
'sessionId' => $sessionId,
1892+
'requestId' => $requestId,
1893+
'success' => false,
1894+
'result' => null,
1895+
'error' => 'Empty expression',
1896+
'duration_ms' => 0,
1897+
];
1898+
ddless_write_breakpoint_state($evalPayload);
1899+
continue;
1900+
}
18771901

1878-
$command = strtolower($responseData['command'] ?? 'continue');
1902+
$startTime = microtime(true);
18791903

1880-
ddless_log("[ddless] Received command: {$command}\n");
1904+
try {
1905+
$previousTimeLimit = ini_get('max_execution_time');
1906+
set_time_limit(15); // Prevent infinite loops
1907+
1908+
ob_start();
1909+
$result = ddless_eval_in_context($expression, $rawVariables, $rawBacktrace, false);
1910+
$output = ob_get_clean();
1911+
1912+
set_time_limit((int) $previousTimeLimit);
1913+
1914+
$normalized = ddless_normalize_value($result, 0);
1915+
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
1916+
1917+
$evalPayload = [
1918+
'type' => 'evaluate_result',
1919+
'sessionId' => $sessionId,
1920+
'requestId' => $requestId,
1921+
'success' => true,
1922+
'result' => $normalized,
1923+
'output' => $output ?: null,
1924+
'error' => null,
1925+
'duration_ms' => $durationMs,
1926+
];
1927+
} catch (\Throwable $e) {
1928+
ob_end_clean();
1929+
set_time_limit((int) ($previousTimeLimit ?? 0));
1930+
1931+
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
1932+
1933+
$evalPayload = [
1934+
'type' => 'evaluate_result',
1935+
'sessionId' => $sessionId,
1936+
'requestId' => $requestId,
1937+
'success' => false,
1938+
'result' => null,
1939+
'error' => $e->getMessage(),
1940+
'duration_ms' => $durationMs,
1941+
];
1942+
}
1943+
1944+
ddless_write_breakpoint_state($evalPayload);
1945+
ddless_log("[ddless] Evaluate result written, waiting for next command...\n");
1946+
continue;
1947+
}
1948+
1949+
break;
1950+
}
18811951

18821952
$resetAllStepModes = function() {
18831953
$GLOBALS['__DDLESS_STEP_IN_MODE__'] = false;

0 commit comments

Comments
 (0)