@@ -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