11use std:: { collections:: BTreeMap , num:: NonZeroU32 , sync:: Arc } ;
22
33use miden_assembly:: SourceManager ;
4- use miden_core:: Word ;
4+ use miden_core:: {
5+ Word ,
6+ events:: { EventId , EventName } ,
7+ } ;
58use miden_debug_types:: { Location , SourceFile , SourceSpan } ;
69use miden_processor:: {
7- FutureMaybeSend , Host , MastForestStore , MemMastForestStore , ProcessorState , TraceError ,
8- advice:: AdviceMutation , event:: EventError , mast:: MastForest , trace:: RowIndex ,
10+ ExecutionError , FutureMaybeSend , Host , MastForestStore , MemMastForestStore , ProcessorState ,
11+ TraceError , advice:: AdviceMutation ,
12+ event:: { EventError , EventHandler , EventHandlerRegistry } ,
13+ mast:: MastForest ,
14+ trace:: RowIndex ,
915} ;
1016
1117use super :: { TraceEvent , TraceHandler } ;
@@ -15,6 +21,7 @@ use super::{TraceEvent, TraceHandler};
1521/// events that record the entry or exit of a procedure call frame.
1622pub struct DebuggerHost < S : SourceManager + ?Sized > {
1723 store : MemMastForestStore ,
24+ event_handlers : EventHandlerRegistry ,
1825 tracing_callbacks : BTreeMap < u32 , Vec < Box < TraceHandler > > > ,
1926 on_assert_failed : Option < Box < TraceHandler > > ,
2027 source_manager : Arc < S > ,
2734 pub fn new ( source_manager : Arc < S > ) -> Self {
2835 Self {
2936 store : Default :: default ( ) ,
37+ event_handlers : EventHandlerRegistry :: default ( ) ,
3038 tracing_callbacks : Default :: default ( ) ,
3139 on_assert_failed : None ,
3240 source_manager,
6775 pub fn load_mast_forest ( & mut self , forest : Arc < MastForest > ) {
6876 self . store . insert ( forest) ;
6977 }
78+
79+ /// Registers an event handler for use during program execution.
80+ pub fn register_event_handler (
81+ & mut self ,
82+ event : EventName ,
83+ handler : Arc < dyn EventHandler > ,
84+ ) -> Result < ( ) , ExecutionError > {
85+ self . event_handlers . register ( event, handler)
86+ }
7087}
7188
7289impl < S > Host for DebuggerHost < S >
@@ -88,9 +105,21 @@ where
88105
89106 fn on_event (
90107 & mut self ,
91- _process : & ProcessorState < ' _ > ,
108+ process : & ProcessorState < ' _ > ,
92109 ) -> impl FutureMaybeSend < Result < Vec < AdviceMutation > , EventError > > {
93- std:: future:: ready ( Ok ( Vec :: new ( ) ) )
110+ let event_id = EventId :: from_felt ( process. get_stack_item ( 0 ) ) ;
111+ let result = match self . event_handlers . handle_event ( event_id, process) {
112+ Ok ( Some ( mutations) ) => Ok ( mutations) ,
113+ Ok ( None ) => {
114+ #[ derive( Debug , thiserror:: Error ) ]
115+ #[ error( "no event handler registered" ) ]
116+ struct UnhandledEvent ;
117+
118+ Err ( UnhandledEvent . into ( ) )
119+ } ,
120+ Err ( err) => Err ( err) ,
121+ } ;
122+ std:: future:: ready ( result)
94123 }
95124
96125 fn on_trace ( & mut self , process : & ProcessorState < ' _ > , trace_id : u32 ) -> Result < ( ) , TraceError > {
@@ -103,4 +132,8 @@ where
103132 }
104133 Ok ( ( ) )
105134 }
135+
136+ fn resolve_event ( & self , event_id : EventId ) -> Option < & EventName > {
137+ self . event_handlers . resolve_event ( event_id)
138+ }
106139}
0 commit comments