@@ -816,82 +816,116 @@ let rec generate_stmt (dgfip_flags : Dgfip_options.flags) (p : Mir.program)
816816 let print = fresh_c_local " print" in
817817 let print_def = print ^ " _def" in
818818 let print_val = print ^ " _val" in
819- pr " @;@[<v 2>{" ;
820- pr " @;char %s;@;double %s;@;int %s;" print_def print_val print;
821- List. iter
822- (fun (arg : Com.Var.t Com.print_arg Pos.marked ) ->
823- match Pos. unmark arg with
824- | PrintString s ->
825- pr " @;print_string(%s, %s, \" %s\" );" print_std pr_ctx
826- (str_escape s)
827- | PrintAccess (info , m_a ) -> (
828- let pr_sp m_sp_opt v_opt =
829- let vsd_id =
830- match v_opt with
831- | Some v -> VID. gen_var_space_id m_sp_opt v
832- | None -> " irdata->var_space"
833- in
834- let vsd = Pp. spr " irdata->var_spaces[%s]" vsd_id in
835- pr " @;@[<v 2>if (%s.is_default == 0) {" vsd;
836- pr " @;print_string(%s, %s, %s.name);" print_std pr_ctx vsd;
837- pr " @;print_string(%s, %s, \" .\" );" print_std pr_ctx;
838- pr " @]@;}@;"
839- in
840- match Pos. unmark m_a with
841- | VarAccess (m_sp_opt , v ) ->
842- pr_sp m_sp_opt (Some v);
843- let ptr = VID. gen_info_ptr v in
844- let fld =
845- match info with Com. Name -> " name" | Com. Alias -> " alias"
819+ (* The [print] var only is needed in a few cases. *)
820+ let print_var_is_needed = ref false in
821+ (* Iterating on the arguments and saving the associated printers in a
822+ list to check as we build it if we will need the print_var; in which
823+ case, we set the previous reference to true. *)
824+ let printers =
825+ List. map
826+ (fun (arg : Com.Var.t Com.print_arg Pos.marked ) ->
827+ match Pos. unmark arg with
828+ | PrintString s ->
829+ fun () ->
830+ pr " @;print_string(%s, %s, \" %s\" );" print_std pr_ctx
831+ (str_escape s)
832+ | PrintAccess (info , m_a ) -> (
833+ let pr_sp m_sp_opt v_opt =
834+ let vsd_id =
835+ match v_opt with
836+ | Some v -> VID. gen_var_space_id m_sp_opt v
837+ | None -> " irdata->var_space"
846838 in
847- pr " @;print_string(%s, %s, %s->%s);" print_std pr_ctx ptr fld
848- | TabAccess (m_sp_opt , v , m_idx ) ->
849- pr_sp m_sp_opt (Some v);
850- pr " @;@[<v 2>{" ;
851- pr " T_varinfo *info;" ;
852- let idx_tab = Com.Var. loc_tab_idx v in
839+ let vsd = Pp. spr " irdata->var_spaces[%s]" vsd_id in
840+ pr " @;@[<v 2>if (%s.is_default == 0) {" vsd;
841+ pr " @;print_string(%s, %s, %s.name);" print_std pr_ctx vsd;
842+ pr " @;print_string(%s, %s, \" .\" );" print_std pr_ctx;
843+ pr " @]@;}@;"
844+ in
845+ match Pos. unmark m_a with
846+ | VarAccess (m_sp_opt , v ) ->
847+ fun () ->
848+ pr_sp m_sp_opt (Some v);
849+ let ptr = VID. gen_info_ptr v in
850+ let fld =
851+ match info with
852+ | Com. Name -> " name"
853+ | Com. Alias -> " alias"
854+ in
855+ pr " @;print_string(%s, %s, %s->%s);" print_std pr_ctx ptr
856+ fld
857+ | TabAccess (m_sp_opt , v , m_idx ) ->
858+ fun () ->
859+ pr_sp m_sp_opt (Some v);
860+ pr " @;@[<v 2>{" ;
861+ pr " T_varinfo *info;" ;
862+ let idx_tab = Com.Var. loc_tab_idx v in
863+ generate_expr_with_res_in p dgfip_flags oc print_def
864+ print_val m_idx;
865+ pr " info = lis_tabaccess_varinfo(irdata, %d, %s, %s);"
866+ idx_tab print_def print_val;
867+ let fld =
868+ match info with
869+ | Com. Name -> " name"
870+ | Com. Alias -> " alias"
871+ in
872+ pr
873+ " @;\
874+ print_string(%s, %s, (info == NULL ? \"\" : \
875+ info->%s));"
876+ print_std pr_ctx fld;
877+ pr " @]@;}"
878+ | FieldAccess (m_sp_opt , e , f , _ ) ->
879+ let fld =
880+ match info with
881+ | Com. Name -> " name"
882+ | Com. Alias -> " alias"
883+ in
884+ let ef =
885+ StrMap. find (Pos. unmark f) p.program_event_fields
886+ in
887+ print_var_is_needed := ef.is_var;
888+ fun () ->
889+ pr_sp m_sp_opt None ;
890+ if ef.is_var then (
891+ generate_expr_with_res_in p dgfip_flags oc print_def
892+ print_val e;
893+ pr " @;%s = (int)%s;" print print_val;
894+ pr
895+ " @;\
896+ @[<v 2>if (%s && 0 <= %s && %s < irdata->nb_events) \
897+ {"
898+ print_def print print;
899+ pr
900+ " @;\
901+ print_string(%s, %s, \
902+ irdata->events[%s]->field_%s_var->%s);"
903+ print_std pr_ctx print (Pos. unmark f) fld;
904+ pr " @]@;}" ))
905+ | PrintIndent e ->
906+ fun () ->
853907 generate_expr_with_res_in p dgfip_flags oc print_def print_val
854- m_idx;
855- pr " info = lis_tabaccess_varinfo(irdata, %d, %s, %s);" idx_tab
856- print_def print_val;
857- let fld =
858- match info with Com. Name -> " name" | Com. Alias -> " alias"
859- in
860- pr " @;print_string(%s, %s, (info == NULL ? \"\" : info->%s));"
861- print_std pr_ctx fld;
908+ e;
909+ pr " @;@[<v 2>if (%s) {" print_def;
910+ pr " @;set_print_indent(%s, %s, %s);" print_std pr_ctx
911+ print_val;
862912 pr " @]@;}"
863- | FieldAccess (m_sp_opt , e , f , _ ) ->
864- pr_sp m_sp_opt None ;
865- let fld =
866- match info with Com. Name -> " name" | Com. Alias -> " alias"
867- in
868- let ef = StrMap. find (Pos. unmark f) p.program_event_fields in
869- if ef.is_var then (
870- generate_expr_with_res_in p dgfip_flags oc print_def
871- print_val e;
872- pr " @;%s = (int)%s;" print print_val;
873- pr " @;@[<v 2>if (%s && 0 <= %s && %s < irdata->nb_events) {"
874- print_def print print;
875- pr
876- " @;\
877- print_string(%s, %s, \
878- irdata->events[%s]->field_%s_var->%s);"
879- print_std pr_ctx print (Pos. unmark f) fld;
880- pr " @]@;}" ))
881- | PrintIndent e ->
882- generate_expr_with_res_in p dgfip_flags oc print_def print_val e;
883- pr " @;@[<v 2>if (%s) {" print_def;
884- pr " @;set_print_indent(%s, %s, %s);" print_std pr_ctx print_val;
885- pr " @]@;}"
886- | PrintExpr (e , min , max ) ->
887- generate_expr_with_res_in p dgfip_flags oc print_def print_val e;
888- pr " @;@[<v 2>if (%s) {" print_def;
889- pr " @;print_double(%s, %s, %s, %d, %d);" print_std pr_ctx
890- print_val min max;
891- pr " @]@;@[<v 2>} else {" ;
892- pr " @;print_string(%s, %s, \" indefini\" );" print_std pr_ctx;
893- pr " @]@;}" )
894- args;
913+ | PrintExpr (e , min , max ) ->
914+ fun () ->
915+ generate_expr_with_res_in p dgfip_flags oc print_def print_val
916+ e;
917+ pr " @;@[<v 2>if (%s) {" print_def;
918+ pr " @;print_double(%s, %s, %s, %d, %d);" print_std pr_ctx
919+ print_val min max;
920+ pr " @]@;@[<v 2>} else {" ;
921+ pr " @;print_string(%s, %s, \" indefini\" );" print_std pr_ctx;
922+ pr " @]@;}" )
923+ args
924+ in
925+ pr " @;@[<v 2>{" ;
926+ pr " @;char %s;@;double %s;" print_def print_val;
927+ if ! print_var_is_needed then pr " @;int %s;" print;
928+ List. iter (fun f -> f () ) printers;
895929 pr " @]@;}"
896930 | ComputeTarget (Pos. Mark (tn , _ ), targs , m_sp_opt ) ->
897931 let target = StrMap. find tn p.program_targets in
@@ -1430,7 +1464,7 @@ let generate_function_tmp_decls (oc : Format.formatter) (tf : Mir.target) =
14301464 let nb_args = List. length tf.target_args in
14311465 pr " @;@[<v 2>{" ;
14321466 pr " @;int i;" ;
1433- pr " @;T_varinfo *info;" ;
1467+ (* pr "@;T_varinfo *info;"; *)
14341468 pr " @;irdata->tmps[irdata->tmps_org].def = 0;" ;
14351469 pr " @;irdata->tmps[irdata->tmps_org].val = 0.0;" ;
14361470 pr " @;irdata->tmps[irdata->tmps_org].info = NULL;" ;
0 commit comments