diff --git a/src/plugins/value/utils/eva_annotations.ml b/src/plugins/value/utils/eva_annotations.ml index 767cf487636ff235b6e01cd46d9b498eb3c9c624..7424276f091edd55f04ec42b52f3cc91e49d1483 100644 --- a/src/plugins/value/utils/eva_annotations.ml +++ b/src/plugins/value/utils/eva_annotations.ml @@ -69,22 +69,20 @@ module Register (M : Annotation) = struct include M - let typing_ext ~typing_context ~loc args = + let ext_typing typing_context loc args = try export (parse ~typing_context args) with Parse_error -> typing_context.Logic_typing.error loc "Invalid %s directive" name - let printer_ext _pp fmt lp = + let ext_printing _pp fmt lp = print fmt (import lp) let () = - if is_loop_annot then begin - Logic_typing.register_code_annot_next_loop_extension name false typing_ext; - Cil_printer.register_loop_annot_extension name printer_ext - end else begin - Logic_typing.register_code_annot_next_stmt_extension name false typing_ext; - Cil_printer.register_code_annot_extension name printer_ext - end + let ext = { Acsl_extension.default with ext_typing ; ext_printing } in + if is_loop_annot then + Acsl_extension.register_code_annot_next_loop name ext + else + Acsl_extension.register_code_annot_next_stmt name ext let get stmt = let filter_add _emitter annot acc = diff --git a/src/plugins/value/utils/widen_hints_ext.ml b/src/plugins/value/utils/widen_hints_ext.ml index 743fc237c94b8db4fe15f4689cf34d6b9ec2da5c..b86b353196abd68a13be2d96727e6a8ff07f9b9c 100644 --- a/src/plugins/value/utils/widen_hints_ext.ml +++ b/src/plugins/value/utils/widen_hints_ext.ml @@ -137,30 +137,30 @@ let widen_hint_terms_of_terms terms = with Invalid_hint -> None -let () = Logic_typing.register_code_annot_next_both_extension "widen_hints" false - (fun ~typing_context ~loc args -> - let var_term, hint_terms = - terms_of_parsed_widen_hints typing_context loc args - in - let terms = var_term :: hint_terms in - Ext_terms terms - ) - -let () = Cil_printer.register_code_annot_extension "widen_hints" - (fun _pp fmt ext -> - match ext with - | Ext_id _ -> assert false - | Ext_preds _ -> assert false - | Ext_terms terms -> - match widen_hint_terms_of_terms terms with - | Some (hint_lval, hint_terms) -> - Format.fprintf fmt "%a%a, %a" - (Pretty_utils.pp_list ~sep:" " ~suf:":" Format.pp_print_string) - hint_lval.names pp_hvars hint_lval.vars - (Pretty_utils.pp_list ~sep:", " Printer.pp_term) hint_terms - | None -> - Format.fprintf fmt "<invalid widen_hints>" - ) +let ext_typing typing_context loc args = + let var_term, hint_terms = + terms_of_parsed_widen_hints typing_context loc args + in + let terms = var_term :: hint_terms in + Ext_terms terms + +let ext_printing _pp fmt ext = + match ext with + | Ext_id _ -> assert false + | Ext_preds _ -> assert false + | Ext_terms terms -> + match widen_hint_terms_of_terms terms with + | Some (hint_lval, hint_terms) -> + Format.fprintf fmt "%a%a, %a" + (Pretty_utils.pp_list ~sep:" " ~suf:":" Format.pp_print_string) + hint_lval.names pp_hvars hint_lval.vars + (Pretty_utils.pp_list ~sep:", " Printer.pp_term) hint_terms + | None -> + Format.fprintf fmt "<invalid widen_hints>" + +let () = + Acsl_extension.register_code_annot_next_both "widen_hints" + { Acsl_extension.default with ext_typing ; ext_printing } let get_widen_hints_annots stmt = Annotations.fold_code_annot diff --git a/src/plugins/wp/RegionAnnot.ml b/src/plugins/wp/RegionAnnot.ml index 5ada4f4dc9434380e19dfa9d69147f562c6ecb12..2287453b699bed94d09f9237006b11f84024434a 100644 --- a/src/plugins/wp/RegionAnnot.ml +++ b/src/plugins/wp/RegionAnnot.ml @@ -440,7 +440,7 @@ let rec parse_region env p = let path = parse_lpath env p in env.paths <- path :: env.paths -let typecheck ~typing_context ~loc:_loc ps = +let typecheck typing_context _loc ps = let env = { name = None ; declared = [] ; @@ -482,12 +482,12 @@ let specified = let register () = if Wp.Region.get () || Wp.Region_annot.get () || - List.exists specified (Wp.Model.get ()) + List.exists specified (Wp.Model.get ()) then - begin - Logic_typing.register_behavior_extension "region" true typecheck ; - Cil_printer.register_behavior_extension "region" pp_extension ; - end + Acsl_extension.register_behavior "region" + { Acsl_extension.default with ext_status=true; + ext_typing=typecheck; + ext_printing=pp_extension} let () = Cmdline.run_after_configuring_stage register diff --git a/src/plugins/wp/dyncall.ml b/src/plugins/wp/dyncall.ml index 8b0dedf82a8033484a5732a5f6ae3d59563ff7c9..83aeeb8578a2ce842d5fe99da91a609afdd03ef5 100644 --- a/src/plugins/wp/dyncall.ml +++ b/src/plugins/wp/dyncall.ml @@ -37,7 +37,7 @@ let find_call env loc f = with Not_found -> env.error loc "Unknown function '%s'" f -let typecheck ~typing_context ~loc ps = +let typecheck typing_context loc ps = ignore loc ; let fs = List.map @@ -261,8 +261,11 @@ let register = if (not !once) && Wp_parameters.DynCall.get () then begin once := true; - Logic_typing.register_code_annot_next_stmt_extension "calls" true typecheck; - Logic_typing.register_behavior_extension "instanceof" true typecheck ; + let ext = + { Acsl_extension.default with ext_status=true; ext_typing=typecheck } + in + Acsl_extension.register_code_annot_next_stmt "calls" ext; + Acsl_extension.register_behavior "instanceof" ext; end let () = Cmdline.run_after_configuring_stage register diff --git a/tests/spec/Extend.ml b/tests/spec/Extend.ml index af9696e583520f9dcabb3cbdf15118eeb53e1d7d..ce95063c1e0f6a60514768cf3799be280c399b5e 100644 --- a/tests/spec/Extend.ml +++ b/tests/spec/Extend.ml @@ -2,8 +2,7 @@ open Logic_ptree open Cil_types open Logic_typing -let type_foo ~typing_context ~loc l = - let _loc = loc in +let type_foo typing_context _loc l = let preds = List.map (typing_context.type_predicate @@ -24,8 +23,7 @@ module Bar_table = let size = 3 end) -let type_bar ~typing_context ~loc l = - let _loc = loc in +let type_bar typing_context _loc l = let i = Count.next() in let p = List.map @@ -61,7 +59,7 @@ let visit_bar vis ext = | Ext_terms _ | Ext_preds _ -> Kernel.fatal "bar extension should have ids as arguments" -let type_baz ~typing_context ~loc:_loc l = +let type_baz typing_context _loc l = let t = List.map (typing_context.type_term typing_context typing_context.pre_state) l @@ -88,7 +86,7 @@ let add_builtin () = let () = add_builtin () -let type_bla ~typing_context ~loc:_loc l = +let type_bla typing_context _loc l = let type_predicate ctxt env p = match p.lexpr_node with | PLapp("\\trace", [], [pred]) -> @@ -107,16 +105,26 @@ let type_bla ~typing_context ~loc:_loc l = Ext_preds l let () = - Logic_typing.register_behavior_extension "foo" false type_foo; - Logic_typing.register_behavior_extension "bar" false type_bar; - Logic_typing.register_behavior_extension "bla" false type_bla; - Cil_printer.register_behavior_extension "bar" print_bar; - Cil.register_behavior_extension "bar" visit_bar; - Logic_typing.register_code_annot_next_both_extension "baz" false type_baz; - Logic_typing.register_code_annot_next_loop_extension "lfoo" false type_foo; - Logic_typing.register_code_annot_extension "ca_foo" false type_foo; - Logic_typing.register_code_annot_next_stmt_extension "ns_foo" false type_foo; - Logic_typing.register_global_extension "global_foo" false type_foo + Acsl_extension.register_behavior "foo" + { Acsl_extension.default with ext_typing = type_foo } ; + Acsl_extension.register_code_annot_next_loop "lfoo" + { Acsl_extension.default with ext_typing = type_foo } ; + Acsl_extension.register_code_annot "ca_foo" + { Acsl_extension.default with ext_typing = type_foo } ; + Acsl_extension.register_code_annot_next_stmt "ns_foo" + { Acsl_extension.default with ext_typing = type_foo } ; + Acsl_extension.register_global "global_foo" + { Acsl_extension.default with ext_typing = type_foo } ; + Acsl_extension.register_behavior "bar" + { Acsl_extension.default with + ext_typing = type_bar ; + ext_printing = print_bar ; + ext_visit = visit_bar + } ; + Acsl_extension.register_behavior "bla" + { Acsl_extension.default with ext_typing = type_bla } ; + Acsl_extension.register_code_annot_next_both "baz" + { Acsl_extension.default with ext_typing = type_baz } let run () = Ast.compute (); diff --git a/tests/spec/extend_extern.ml b/tests/spec/extend_extern.ml index c60a714b9bf921abd03047c7e87337548365b108..09714efad25fa90d283e529c0ae1e3f7d6a9ea84 100644 --- a/tests/spec/extend_extern.ml +++ b/tests/spec/extend_extern.ml @@ -6,7 +6,7 @@ let load_theory = function raise Not_found | _ -> assert false -let typing ~typing_context ~loc lexprs = +let ext_typing typing_context loc lexprs = ignore loc ; let type_predicate = typing_context.type_predicate typing_context (Lenv.empty ()) @@ -17,7 +17,7 @@ let typing ~typing_context ~loc lexprs = let () = - Logic_typing.register_global_extension "why3" false typing + Acsl_extension.(register_global "why3" { default with ext_typing }) let main () = try