Skip to content

Commit eacf72e

Browse files
committed
Add debugger state
1 parent d4c1828 commit eacf72e

File tree

3 files changed

+68
-48
lines changed

3 files changed

+68
-48
lines changed

src/debugger.rs

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,55 @@
1-
use anyhow::{Result, bail};
1+
use anyhow::Result;
22
use cairo_vm::vm::vm_core::VirtualMachine;
33
use dap::events::ExitedEventBody;
44
use dap::prelude::Event::{Exited, Terminated};
5-
use tracing::{debug, error};
5+
use tracing::error;
66

77
use crate::connection::Connection;
8-
use crate::debugger::handler::{HandleResult, NextAction};
8+
use crate::debugger::state::State;
99

1010
mod handler;
11+
mod state;
1112
mod vm;
1213

1314
pub struct CairoDebugger {
1415
connection: Connection,
16+
state: State,
1517
}
1618

1719
impl CairoDebugger {
1820
pub fn connect_and_initialize() -> Result<Self> {
1921
let connection = Connection::new()?;
20-
let debugger = Self { connection };
22+
let mut debugger = Self { connection, state: State::new() };
2123
debugger.initialize()?;
2224

2325
Ok(debugger)
2426
}
2527

26-
fn initialize(&self) -> Result<()> {
27-
loop {
28+
fn initialize(&mut self) -> Result<()> {
29+
while !self.state.is_configuration_done() {
2830
// TODO(#35)
2931
let request = self.connection.next_request()?;
30-
if let HandleResult::Trigger(NextAction::FinishInit) = self.handle_request(request)? {
31-
debug!("Initialization finished");
32-
break;
33-
}
32+
self.handle_request(request)?;
3433
}
3534

3635
Ok(())
3736
}
3837

39-
fn sync_with_vm(&self, _vm: &VirtualMachine) -> Result<()> {
40-
while let Some(request) = self.connection.try_next_request()?
41-
&& let HandleResult::Trigger(NextAction::Stop) = self.handle_request(request)?
42-
{
43-
self.process_until_resume()?;
38+
fn sync_with_vm(&mut self, _vm: &VirtualMachine) -> Result<()> {
39+
while let Some(request) = self.connection.try_next_request()? {
40+
self.handle_request(request)?;
41+
if self.state.is_execution_stopped() {
42+
self.process_until_resume()?;
43+
}
4444
}
4545

4646
Ok(())
4747
}
4848

49-
fn process_until_resume(&self) -> Result<()> {
50-
loop {
49+
fn process_until_resume(&mut self) -> Result<()> {
50+
while self.state.is_execution_stopped() {
5151
let request = self.connection.next_request()?;
52-
match self.handle_request(request)? {
53-
HandleResult::Trigger(NextAction::Resume) => break,
54-
HandleResult::Trigger(NextAction::FinishInit) => {
55-
bail!("Unexpected request received during execution");
56-
}
57-
HandleResult::Handled | HandleResult::Trigger(NextAction::Stop) => {}
58-
}
52+
self.handle_request(request)?;
5953
}
6054

6155
Ok(())

src/debugger/handler.rs

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,8 @@ use tracing::trace;
1010

1111
use crate::CairoDebugger;
1212

13-
pub enum HandleResult {
14-
Handled,
15-
Trigger(NextAction),
16-
}
17-
18-
pub enum NextAction {
19-
Resume,
20-
Stop,
21-
FinishInit,
22-
}
23-
2413
impl CairoDebugger {
25-
pub fn handle_request(&self, request: Request) -> Result<HandleResult> {
14+
pub fn handle_request(&mut self, request: Request) -> Result<()> {
2615
match &request.command {
2716
// We have not yet decided if we want to support these.
2817
Command::BreakpointLocations(_)
@@ -89,20 +78,21 @@ impl CairoDebugger {
8978
}),
9079
)?;
9180
self.connection.send_event(Event::Initialized)?;
92-
Ok(HandleResult::Handled)
81+
Ok(())
9382
}
9483
Command::Launch(_) => {
9584
self.connection.send_success(request, ResponseBody::Launch)?;
96-
Ok(HandleResult::Handled)
85+
Ok(())
9786
}
9887
Command::ConfigurationDone => {
9988
// Start running the Cairo program here.
100-
trace!("Configuration done");
89+
self.state.set_configuration_done();
10190
self.connection.send_success(request, ResponseBody::ConfigurationDone)?;
102-
Ok(HandleResult::Trigger(NextAction::FinishInit))
91+
Ok(())
10392
}
10493

10594
Command::Pause(_) => {
95+
self.state.stop_execution();
10696
self.connection.send_event(Event::Stopped(StoppedEventBody {
10797
reason: StoppedEventReason::Pause,
10898
thread_id: Some(0),
@@ -113,14 +103,15 @@ impl CairoDebugger {
113103
hit_breakpoint_ids: None,
114104
}))?;
115105
self.connection.send_success(request, ResponseBody::Pause)?;
116-
Ok(HandleResult::Trigger(NextAction::Stop))
106+
Ok(())
117107
}
118108
Command::Continue(_) => {
109+
self.state.resume_execution();
119110
self.connection.send_success(
120111
request,
121112
ResponseBody::Continue(ContinueResponse { all_threads_continued: Some(true) }),
122113
)?;
123-
Ok(HandleResult::Trigger(NextAction::Resume))
114+
Ok(())
124115
}
125116

126117
Command::SetBreakpoints(args) => {
@@ -142,7 +133,7 @@ impl CairoDebugger {
142133
breakpoints: response_bps,
143134
}),
144135
)?;
145-
Ok(HandleResult::Handled)
136+
Ok(())
146137
}
147138

148139
Command::Threads => {
@@ -153,7 +144,7 @@ impl CairoDebugger {
153144
threads: vec![Thread { id: 0, name: "".to_string() }],
154145
}),
155146
)?;
156-
Ok(HandleResult::Handled)
147+
Ok(())
157148
}
158149
Command::StackTrace(_) => {
159150
self.connection.send_success(
@@ -172,15 +163,15 @@ impl CairoDebugger {
172163
total_frames: Some(1),
173164
}),
174165
)?;
175-
Ok(HandleResult::Handled)
166+
Ok(())
176167
}
177168
Command::Scopes(_) => {
178169
// Return no scopes.
179170
self.connection.send_success(
180171
request,
181172
ResponseBody::Scopes(ScopesResponse { scopes: vec![] }),
182173
)?;
183-
Ok(HandleResult::Handled)
174+
Ok(())
184175
}
185176
Command::Variables(_) => {
186177
self.connection.send_success(
@@ -190,7 +181,7 @@ impl CairoDebugger {
190181
variables: vec![],
191182
}),
192183
)?;
193-
Ok(HandleResult::Handled)
184+
Ok(())
194185
}
195186

196187
Command::Next(_) => {
@@ -220,7 +211,7 @@ impl CairoDebugger {
220211
memory_reference: None,
221212
}),
222213
)?;
223-
Ok(HandleResult::Handled)
214+
Ok(())
224215
}
225216

226217
Command::Disconnect(_) => {

src/debugger/state.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
use tracing::trace;
2+
3+
pub struct State {
4+
configuration_done: bool,
5+
execution_stopped: bool,
6+
}
7+
8+
impl State {
9+
pub fn new() -> Self {
10+
Self { configuration_done: false, execution_stopped: false }
11+
}
12+
13+
pub fn is_configuration_done(&self) -> bool {
14+
self.configuration_done
15+
}
16+
17+
pub fn set_configuration_done(&mut self) {
18+
trace!("Configuration done");
19+
self.configuration_done = true;
20+
}
21+
22+
pub fn is_execution_stopped(&self) -> bool {
23+
self.execution_stopped
24+
}
25+
26+
pub fn stop_execution(&mut self) {
27+
trace!("Execution stopped");
28+
self.execution_stopped = true;
29+
}
30+
31+
pub fn resume_execution(&mut self) {
32+
trace!("Execution resumed");
33+
self.execution_stopped = false;
34+
}
35+
}

0 commit comments

Comments
 (0)