11use std:: any:: Any ;
22use std:: collections:: HashMap ;
3+ use std:: sync:: Arc ;
34use std:: vec;
45
56use cairo_lang_runner:: { Arg , CairoHintProcessor } ;
@@ -82,8 +83,8 @@ pub fn load_program_hint(
8283 ap_tracking,
8384 ) ?;
8485
85- let task: Task = exec_scopes. get ( vars:: TASK ) ?;
86- let program = get_program_from_task ( & task) ?;
86+ let task: & Arc < Task > = exec_scopes. get_ref ( vars:: TASK ) ?;
87+ let program = get_program_from_task ( task) ?;
8788
8889 let program_header_ptr = get_ptr_from_var_name ( "program_header" , vm, ids_data, ap_tracking) ?;
8990
@@ -125,7 +126,8 @@ pub fn append_fact_topologies(
125126 ids_data : & HashMap < String , HintReference > ,
126127 ap_tracking : & ApTracking ,
127128) -> Result < ( ) , HintError > {
128- let task: Task = exec_scopes. get ( vars:: TASK ) ?;
129+ // Get Arc<Task> here (cheap clone) since we need mutable access to exec_scopes for fact_topologies.
130+ let task: Arc < Task > = exec_scopes. get ( vars:: TASK ) ?;
129131 let output_runner_data: Option < OutputBuiltinState > =
130132 exec_scopes. get ( vars:: OUTPUT_RUNNER_DATA ) ?;
131133 let fact_topologies: & mut Vec < FactTopology > = exec_scopes. get_mut_ref ( vars:: FACT_TOPOLOGIES ) ?;
@@ -162,8 +164,8 @@ pub fn validate_hash(
162164 ids_data : & HashMap < String , HintReference > ,
163165 ap_tracking : & ApTracking ,
164166) -> Result < ( ) , HintError > {
165- let task: Task = exec_scopes. get ( vars:: TASK ) ?;
166- let program = get_program_from_task ( & task) ?;
167+ let task: & Arc < Task > = exec_scopes. get_ref ( vars:: TASK ) ?;
168+ let program = get_program_from_task ( task) ?;
167169
168170 let output_ptr = get_ptr_from_var_name ( "output_ptr" , vm, ids_data, ap_tracking) ?;
169171 let program_hash_ptr = ( output_ptr + 1 ) ?;
@@ -301,11 +303,11 @@ pub fn write_return_builtins_hint(
301303 ids_data : & HashMap < String , HintReference > ,
302304 ap_tracking : & ApTracking ,
303305) -> Result < ( ) , HintError > {
304- let task: Task = exec_scopes. get ( vars:: TASK ) ?;
306+ let task: & Arc < Task > = exec_scopes. get_ref ( vars:: TASK ) ?;
305307 let n_builtins: usize = exec_scopes. get ( vars:: N_BUILTINS ) ?;
306308
307309 // builtins = task.get_program().builtins
308- let program = get_program_from_task ( & task) ?;
310+ let program = get_program_from_task ( task) ?;
309311 let builtins = & program. builtins ;
310312
311313 // write_return_builtins(
@@ -325,7 +327,7 @@ pub fn write_return_builtins_hint(
325327 builtins,
326328 used_builtins_addr,
327329 pre_execution_builtins_addr,
328- & task,
330+ task,
329331 ) ?;
330332
331333 // vm_enter_scope({'n_selected_builtins': n_builtins})
@@ -398,7 +400,8 @@ pub fn setup_subtask_for_execution(
398400 ids_data : & HashMap < String , HintReference > ,
399401 ap_tracking : & ApTracking ,
400402) -> Result < HintExtension , HintError > {
401- let task: Task = exec_scopes. get ( vars:: TASK ) ?;
403+ // Get Arc<Task> (cheap clone) since we need mutable access to exec_scopes throughout this function.
404+ let task: Arc < Task > = exec_scopes. get ( vars:: TASK ) ?;
402405
403406 let n_builtins = get_program_from_task ( & task) ?. builtins . len ( ) ;
404407 exec_scopes. insert_value ( vars:: N_BUILTINS , n_builtins) ;
@@ -408,7 +411,7 @@ pub fn setup_subtask_for_execution(
408411 let mut hint_extension = HintExtension :: default ( ) ;
409412
410413 let subtask_cairo1_hint_processor: Option < CairoHintProcessor > ;
411- match & task {
414+ match & * task {
412415 Task :: Cairo0Program ( cairo0_executable) => {
413416 if let Some ( program_input) = cairo0_executable. program_input . as_ref ( ) {
414417 new_task_locals. insert ( PROGRAM_INPUT . to_string ( ) , any_box ! [ program_input. clone( ) ] ) ;
@@ -530,8 +533,8 @@ pub fn bootloader_validate_hash(
530533 return Ok ( ( ) ) ;
531534 }
532535
533- let task: Task = exec_scopes. get ( vars:: TASK ) ?;
534- let program = get_program_from_task ( & task) ?;
536+ let task: & Arc < Task > = exec_scopes. get_ref ( vars:: TASK ) ?;
537+ let program = get_program_from_task ( task) ?;
535538 let output_ptr = get_ptr_from_var_name ( "output_ptr" , vm, ids_data, ap_tracking) ?;
536539 let program_hash_ptr = ( output_ptr + 1 ) ?;
537540 let program_hash = vm. get_integer ( program_hash_ptr) ?. into_owned ( ) ;
@@ -598,10 +601,10 @@ mod tests {
598601 /// pointers in the ids_data point to it.
599602 #[ rstest]
600603 fn test_allocation_in_load_program_hint ( fibonacci : Program ) {
601- let fibonacci_task = Task :: Cairo0Program ( Cairo0Executable {
604+ let fibonacci_task = Arc :: new ( Task :: Cairo0Program ( Cairo0Executable {
602605 program : fibonacci. clone ( ) ,
603606 program_input : None ,
604- } ) ;
607+ } ) ) ;
605608 let (
606609 mut vm,
607610 ids_data,
@@ -674,10 +677,10 @@ mod tests {
674677 /// memory is checked in program_loader.rs tests.
675678 #[ rstest]
676679 fn test_load_program ( fibonacci : Program ) {
677- let fibonacci_task = Task :: Cairo0Program ( Cairo0Executable {
680+ let fibonacci_task = Arc :: new ( Task :: Cairo0Program ( Cairo0Executable {
678681 program : fibonacci. clone ( ) ,
679682 program_input : None ,
680- } ) ;
683+ } ) ) ;
681684
682685 let (
683686 mut vm,
@@ -718,10 +721,10 @@ mod tests {
718721 /// extension, and that the output runner data is set correctly.
719722 #[ rstest]
720723 fn test_call_task ( fibonacci : Program ) {
721- let fibonacci_task = Task :: Cairo0Program ( Cairo0Executable {
724+ let fibonacci_task = Arc :: new ( Task :: Cairo0Program ( Cairo0Executable {
722725 program : fibonacci. clone ( ) ,
723726 program_input : None ,
724- } ) ;
727+ } ) ) ;
725728 let (
726729 mut vm,
727730 ids_data,
@@ -757,12 +760,12 @@ mod tests {
757760 vm. builtin_runners
758761 . push ( BuiltinRunner :: Output ( output_builtin) ) ;
759762
760- let task = Task :: Cairo0Program ( Cairo0Executable {
763+ let task = Arc :: new ( Task :: Cairo0Program ( Cairo0Executable {
761764 program : fibonacci. clone ( ) ,
762765 program_input : None ,
763- } ) ;
766+ } ) ) ;
764767
765- exec_scopes. insert_box ( vars:: TASK , Box :: new ( task) ) ;
768+ exec_scopes. insert_value ( vars:: TASK , task) ;
766769
767770 let hint_data =
768771 HintProcessorData :: new_default ( String :: from ( EXECUTE_TASK_CALL_TASK ) , ids_data) ;
@@ -825,7 +828,7 @@ mod tests {
825828 /// the VM, to a similar state as in the execute_task function in execute_task.cairo.
826829 #[ rstest]
827830 fn test_call_cairo_pie_task ( fibonacci_pie : CairoPie ) {
828- let fibonacci_pie_task = Task :: Pie ( fibonacci_pie. clone ( ) ) ;
831+ let fibonacci_pie_task = Arc :: new ( Task :: Pie ( fibonacci_pie. clone ( ) ) ) ;
829832 let (
830833 mut vm,
831834 ids_data,
@@ -874,7 +877,7 @@ mod tests {
874877 vm. builtin_runners
875878 . push ( BuiltinRunner :: Output ( output_builtin) ) ;
876879
877- let task = Task :: Pie ( fibonacci_pie. clone ( ) ) ;
880+ let task = Arc :: new ( Task :: Pie ( fibonacci_pie. clone ( ) ) ) ;
878881 exec_scopes. insert_value ( vars:: TASK , task) ;
879882 let bootloader_program = get_simple_bootloader_program ( ) ;
880883 exec_scopes. insert_value ( vars:: PROGRAM_DATA_BASE , program_header_ptr. clone ( ) ) ;
@@ -974,7 +977,7 @@ mod tests {
974977 let mut exec_scopes = ExecutionScopes :: new ( ) ;
975978
976979 exec_scopes. insert_value ( vars:: OUTPUT_RUNNER_DATA , Some ( output_builtin_state. clone ( ) ) ) ;
977- exec_scopes. insert_value ( vars:: TASK , fibonacci_task) ;
980+ exec_scopes. insert_value ( vars:: TASK , Arc :: new ( fibonacci_task) ) ;
978981 exec_scopes. insert_value ( vars:: FACT_TOPOLOGIES , Vec :: < FactTopology > :: new ( ) ) ;
979982
980983 append_fact_topologies ( & mut vm, & mut exec_scopes, & ids_data, & ap_tracking)
@@ -1057,7 +1060,7 @@ mod tests {
10571060 let mut exec_scopes = ExecutionScopes :: new ( ) ;
10581061 let n_builtins = builtin_usage_program. builtins_len ( ) ;
10591062 exec_scopes. insert_value ( vars:: N_BUILTINS , n_builtins) ;
1060- exec_scopes. insert_value ( vars:: TASK , task) ;
1063+ exec_scopes. insert_value ( vars:: TASK , Arc :: new ( task) ) ;
10611064
10621065 write_return_builtins_hint ( & mut vm, & mut exec_scopes, & ids_data, & ap_tracking)
10631066 . expect ( "Hint failed unexpectedly" ) ;
0 commit comments