11use std:: any:: Any ;
22use std:: collections:: HashMap ;
3+ use std:: rc:: Rc ;
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: & Rc < 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,7 @@ 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+ let task: Rc < Task > = exec_scopes. get ( vars:: TASK ) ?;
129130 let output_runner_data: Option < OutputBuiltinState > =
130131 exec_scopes. get ( vars:: OUTPUT_RUNNER_DATA ) ?;
131132 let fact_topologies: & mut Vec < FactTopology > = exec_scopes. get_mut_ref ( vars:: FACT_TOPOLOGIES ) ?;
@@ -162,8 +163,8 @@ pub fn validate_hash(
162163 ids_data : & HashMap < String , HintReference > ,
163164 ap_tracking : & ApTracking ,
164165) -> Result < ( ) , HintError > {
165- let task: Task = exec_scopes. get ( vars:: TASK ) ?;
166- let program = get_program_from_task ( & task) ?;
166+ let task: & Rc < Task > = exec_scopes. get_ref ( vars:: TASK ) ?;
167+ let program = get_program_from_task ( task) ?;
167168
168169 let output_ptr = get_ptr_from_var_name ( "output_ptr" , vm, ids_data, ap_tracking) ?;
169170 let program_hash_ptr = ( output_ptr + 1 ) ?;
@@ -301,11 +302,11 @@ pub fn write_return_builtins_hint(
301302 ids_data : & HashMap < String , HintReference > ,
302303 ap_tracking : & ApTracking ,
303304) -> Result < ( ) , HintError > {
304- let task: Task = exec_scopes. get ( vars:: TASK ) ?;
305+ let task: & Rc < Task > = exec_scopes. get_ref ( vars:: TASK ) ?;
305306 let n_builtins: usize = exec_scopes. get ( vars:: N_BUILTINS ) ?;
306307
307308 // builtins = task.get_program().builtins
308- let program = get_program_from_task ( & task) ?;
309+ let program = get_program_from_task ( task) ?;
309310 let builtins = & program. builtins ;
310311
311312 // write_return_builtins(
@@ -325,7 +326,7 @@ pub fn write_return_builtins_hint(
325326 builtins,
326327 used_builtins_addr,
327328 pre_execution_builtins_addr,
328- & task,
329+ task,
329330 ) ?;
330331
331332 // vm_enter_scope({'n_selected_builtins': n_builtins})
@@ -398,7 +399,7 @@ pub fn setup_subtask_for_execution(
398399 ids_data : & HashMap < String , HintReference > ,
399400 ap_tracking : & ApTracking ,
400401) -> Result < HintExtension , HintError > {
401- let task: Task = exec_scopes. get ( vars:: TASK ) ?;
402+ let task: Rc < Task > = exec_scopes. get ( vars:: TASK ) ?;
402403
403404 let n_builtins = get_program_from_task ( & task) ?. builtins . len ( ) ;
404405 exec_scopes. insert_value ( vars:: N_BUILTINS , n_builtins) ;
@@ -408,7 +409,7 @@ pub fn setup_subtask_for_execution(
408409 let mut hint_extension = HintExtension :: default ( ) ;
409410
410411 let subtask_cairo1_hint_processor: Option < CairoHintProcessor < ' _ > > ;
411- match & task {
412+ match & * task {
412413 Task :: Cairo0Program ( cairo0_executable) => {
413414 if let Some ( program_input) = cairo0_executable. program_input . as_ref ( ) {
414415 new_task_locals. insert ( PROGRAM_INPUT . to_string ( ) , any_box ! [ program_input. clone( ) ] ) ;
@@ -530,8 +531,8 @@ pub fn bootloader_validate_hash(
530531 return Ok ( ( ) ) ;
531532 }
532533
533- let task: Task = exec_scopes. get ( vars:: TASK ) ?;
534- let program = get_program_from_task ( & task) ?;
534+ let task: & Rc < Task > = exec_scopes. get_ref ( vars:: TASK ) ?;
535+ let program = get_program_from_task ( task) ?;
535536 let output_ptr = get_ptr_from_var_name ( "output_ptr" , vm, ids_data, ap_tracking) ?;
536537 let program_hash_ptr = ( output_ptr + 1 ) ?;
537538 let program_hash = vm. get_integer ( program_hash_ptr) ?. into_owned ( ) ;
@@ -598,10 +599,10 @@ mod tests {
598599 /// pointers in the ids_data point to it.
599600 #[ rstest]
600601 fn test_allocation_in_load_program_hint ( fibonacci : Program ) {
601- let fibonacci_task = Task :: Cairo0Program ( Cairo0Executable {
602+ let fibonacci_task = Rc :: new ( Task :: Cairo0Program ( Cairo0Executable {
602603 program : fibonacci. clone ( ) ,
603604 program_input : None ,
604- } ) ;
605+ } ) ) ;
605606 let (
606607 mut vm,
607608 ids_data,
@@ -674,10 +675,10 @@ mod tests {
674675 /// memory is checked in program_loader.rs tests.
675676 #[ rstest]
676677 fn test_load_program ( fibonacci : Program ) {
677- let fibonacci_task = Task :: Cairo0Program ( Cairo0Executable {
678+ let fibonacci_task = Rc :: new ( Task :: Cairo0Program ( Cairo0Executable {
678679 program : fibonacci. clone ( ) ,
679680 program_input : None ,
680- } ) ;
681+ } ) ) ;
681682
682683 let (
683684 mut vm,
@@ -718,10 +719,10 @@ mod tests {
718719 /// extension, and that the output runner data is set correctly.
719720 #[ rstest]
720721 fn test_call_task ( fibonacci : Program ) {
721- let fibonacci_task = Task :: Cairo0Program ( Cairo0Executable {
722+ let fibonacci_task = Rc :: new ( Task :: Cairo0Program ( Cairo0Executable {
722723 program : fibonacci. clone ( ) ,
723724 program_input : None ,
724- } ) ;
725+ } ) ) ;
725726 let (
726727 mut vm,
727728 ids_data,
@@ -757,12 +758,12 @@ mod tests {
757758 vm. builtin_runners
758759 . push ( BuiltinRunner :: Output ( output_builtin) ) ;
759760
760- let task = Task :: Cairo0Program ( Cairo0Executable {
761+ let task = Rc :: new ( Task :: Cairo0Program ( Cairo0Executable {
761762 program : fibonacci. clone ( ) ,
762763 program_input : None ,
763- } ) ;
764+ } ) ) ;
764765
765- exec_scopes. insert_box ( vars:: TASK , Box :: new ( task) ) ;
766+ exec_scopes. insert_value ( vars:: TASK , task) ;
766767
767768 let hint_data =
768769 HintProcessorData :: new_default ( String :: from ( EXECUTE_TASK_CALL_TASK ) , ids_data) ;
@@ -825,7 +826,7 @@ mod tests {
825826 /// the VM, to a similar state as in the execute_task function in execute_task.cairo.
826827 #[ rstest]
827828 fn test_call_cairo_pie_task ( fibonacci_pie : CairoPie ) {
828- let fibonacci_pie_task = Task :: Pie ( fibonacci_pie. clone ( ) ) ;
829+ let fibonacci_pie_task = Rc :: new ( Task :: Pie ( fibonacci_pie. clone ( ) ) ) ;
829830 let (
830831 mut vm,
831832 ids_data,
@@ -874,7 +875,7 @@ mod tests {
874875 vm. builtin_runners
875876 . push ( BuiltinRunner :: Output ( output_builtin) ) ;
876877
877- let task = Task :: Pie ( fibonacci_pie. clone ( ) ) ;
878+ let task = Rc :: new ( Task :: Pie ( fibonacci_pie. clone ( ) ) ) ;
878879 exec_scopes. insert_value ( vars:: TASK , task) ;
879880 let bootloader_program = get_simple_bootloader_program ( ) ;
880881 exec_scopes. insert_value ( vars:: PROGRAM_DATA_BASE , program_header_ptr) ;
@@ -974,7 +975,7 @@ mod tests {
974975 let mut exec_scopes = ExecutionScopes :: new ( ) ;
975976
976977 exec_scopes. insert_value ( vars:: OUTPUT_RUNNER_DATA , Some ( output_builtin_state. clone ( ) ) ) ;
977- exec_scopes. insert_value ( vars:: TASK , fibonacci_task) ;
978+ exec_scopes. insert_value ( vars:: TASK , Rc :: new ( fibonacci_task) ) ;
978979 exec_scopes. insert_value ( vars:: FACT_TOPOLOGIES , Vec :: < FactTopology > :: new ( ) ) ;
979980
980981 append_fact_topologies ( & mut vm, & mut exec_scopes, & ids_data, & ap_tracking)
@@ -1057,7 +1058,7 @@ mod tests {
10571058 let mut exec_scopes = ExecutionScopes :: new ( ) ;
10581059 let n_builtins = builtin_usage_program. builtins_len ( ) ;
10591060 exec_scopes. insert_value ( vars:: N_BUILTINS , n_builtins) ;
1060- exec_scopes. insert_value ( vars:: TASK , task) ;
1061+ exec_scopes. insert_value ( vars:: TASK , Rc :: new ( task) ) ;
10611062
10621063 write_return_builtins_hint ( & mut vm, & mut exec_scopes, & ids_data, & ap_tracking)
10631064 . expect ( "Hint failed unexpectedly" ) ;
0 commit comments