Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file ppx_bench.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314openPpxlibopenAst_builder.Defaulttypemaybe_drop=|Keep|Deadcode|Removeletdrop_benches=refKeeplet()=Driver.add_arg"-bench-drop"(Unit(fun()->drop_benches:=Remove))~doc:" Drop inline benchmarks";Driver.add_arg"-bench-drop-with-deadcode"(Unit(fun()->drop_benches:=Deadcode))~doc:" Drop inline benchmarks by wrapping them inside deadcode to prevent unused \
variable warnings.";;let()=Driver.Cookies.add_simple_handler"inline-bench"Ast_pattern.(pexp_ident(lident__'))~f:(function|None->()|Someid->(matchid.txtwith|"drop"->drop_benches:=Remove|"drop_with_deadcode"->drop_benches:=Deadcode|s->Location.raise_errorf~loc:id.loc"invalid 'inline-bench' cookie (%s), expected one of: drop, \
drop_with_deadcode"s));;letmaybe_droploccode=match!drop_bencheswith|Keep->[%strlet()=[%ecode]]|Deadcode->[%strlet()=iffalsethen[%ecode]else()]|Remove->Attribute.explicitly_drop#expressioncode;[%str];;letdescr(loc:Location.t)?(inner_loc=loc)()=letfilename=loc.loc_start.pos_fnameinletline=loc.loc_start.pos_lnuminletstart_pos=loc.loc_start.pos_cnum-loc.loc_start.pos_bolinletend_pos=inner_loc.Location.loc_end.pos_cnum-loc.loc_start.pos_bolinestring~locfilename,eint~locline,eint~locstart_pos,eint~locend_pos;;letapply_to_descr_benchtype_conv_pathlidloc?inner_loce_opt?name_suffixnamemore_arg=letfilename,line,start_pos,end_pos=descrloc?inner_loc()inlets=matche_optwith|None->""|Somee->Pprintast.string_of_expressioneinletdescr=estring~locsinletname=letbase_name=estring~locnameinmatchname_suffixwith|None->base_name|Somename_suffix->[%expr[%ebase_name]^[%ename_suffix]]inlettype_conv_path=estring~loctype_conv_pathinmaybe_droploc[%exprifPpx_bench_lib.Benchmark_accumulator.add_environment_varthen[%eevar~loc("Ppx_bench_lib.Benchmark_accumulator."^lid)]~name:[%ename]~code:[%edescr]~type_conv_path:[%etype_conv_path]~filename:[%efilename]~line:[%eline]~startpos:[%estart_pos]~endpos:[%eend_pos][%emore_arg]];;typebench_kind=|Bench|Bench_funtypearg_kind=|Indexedof(string*expression)|Parameterisedof(string*expression)letthunk_benchkinde=matchkindwith|Bench_fun->e|Bench->letloc={e.pexp_locwithloc_ghost=true}in[%exprfun()->[%ee]];;letenabled()=matchPpx_inline_test_libname.get()with|None->false|Some_->true;;letassert_enabledloc=ifnot(enabled())thenLocation.raise_errorf~loc"ppx_bench: extension is disabled as no -inline-test-lib was given";;letexpand_bench_exp~loc~pathkindindexnamee=letloc={locwithloc_ghost=true}inassert_enabledloc;matchindexwith|None->(* Here and in the other cases below, because functions given to pa_bench can return
any 'a, we add a dead call to ignore so we can get a warning if the user code
mistakenly gives a partial application. *)apply_to_descr_benchpath"add_bench"loc(Somee)name[%exprletf`init=[%ethunk_benchkinde]iniffalsethenPpx_bench_lib.Export.ignore(f`init())else();Ppx_bench_lib.Benchmark_accumulator.Entry.Regular_thunkf]|Some(Indexed(var_name,args))->apply_to_descr_benchpath"add_bench"loc(Somee)name[%exprletarg_values=[%eargs]andf[%ppvar~locvar_name]=[%ethunk_benchkinde]iniffalsethenPpx_bench_lib.Export.ignore(f0())else();Ppx_bench_lib.Benchmark_accumulator.Entry.Parameterised_thunk{Ppx_bench_lib.Benchmark_accumulator.Entry.arg_name=[%eestring~locvar_name];Ppx_bench_lib.Benchmark_accumulator.Entry.params=(* We use Stdlib.* because this might run without any opens. *)Stdlib.List.map(funi->Stdlib.string_of_inti,i)arg_values[@warning"-3"];Ppx_bench_lib.Benchmark_accumulator.Entry.thunk=f}]|Some(Parameterised(var_name,args))->apply_to_descr_benchpath"add_bench"loc(Somee)name[%exprletparams=[%eargs]andf[%ppvar~locvar_name]=[%ethunk_benchkinde]iniffalsethenPpx_bench_lib.Export.ignore(f(List.hd_exnparams|>snd)())else();Ppx_bench_lib.Benchmark_accumulator.Entry.Parameterised_thunk{Ppx_bench_lib.Benchmark_accumulator.Entry.arg_name=[%eestring~locvar_name];Ppx_bench_lib.Benchmark_accumulator.Entry.params;Ppx_bench_lib.Benchmark_accumulator.Entry.thunk=f}];;letexpand_bench_module~loc~pathname_suffixnamem=letloc={locwithloc_ghost=true}inassert_enabledloc;apply_to_descr_benchpath"add_bench_module"loc~inner_loc:m.pmod_locNone?name_suffixname(pexp_fun~locNolabelNone(punit~loc)(pexp_letmodule~loc(Located.mk~loc(Some"M"))m(eunit~loc)));;moduleE=structletindexed=Attribute.declare"bench.indexed"Attribute.Context.patternAst_pattern.(single_expr_payload(pexp_apply(pexp_ident(lident(string"=")))(no_label(pexp_ident(lident__))^::no_label__^::nil)))(funvarvalues->Indexed(var,values));;letparameterised=Attribute.declare"bench.params"Attribute.Context.patternAst_pattern.(single_expr_payload(pexp_apply(pexp_ident(lident(string"=")))(no_label(pexp_ident(lident__))^::no_label__^::nil)))(funvarvalues->Parameterised(var,values));;letname_suffix=Attribute.declare"bench.name_suffix"Attribute.Context.patternAst_pattern.(single_expr_payload__)(funa->a);;letsimple=letopenAst_patterninpstr(pstr_valuenonrecursive(value_binding~pat:(alt(Attribute.patternindexed(pstring__))(Attribute.patternparameterised(pstring__)))~expr:__~constraint_:none^::nil)^::nil);;letbench=Extension.declare_inline"bench"Extension.Context.structure_itemsimple(expand_bench_expBench);;letbench_fun=Extension.declare_inline"bench_fun"Extension.Context.structure_itemsimple(expand_bench_expBench_fun);;letbench_module=Extension.declare_inline"bench_module"Extension.Context.structure_itemAst_pattern.(pstr(pstr_valuenonrecursive(value_binding~constraint_:drop~pat:(Attribute.patternname_suffix(pstring__))~expr:(pexp_pack__)^::nil)^::nil))expand_bench_module;;letall=[bench;bench_fun;bench_module]endlet()=Driver.register_transformation"bench"~extensions:E.all~enclose_impl:(funloc->matchloc,Ppx_inline_test_libname.get()with|None,_|_,None->[],[]|Someloc,Some(libname,_)->letloc={locwithloc_ghost=true}in(* See comment in benchmark_accumulator.ml *)letheader=letloc={locwithloc_end=loc.loc_start}inmaybe_droploc[%exprPpx_bench_lib.Benchmark_accumulator.Current_libname.set[%eestring~loclibname]]andfooter=letloc={locwithloc_start=loc.loc_end}inmaybe_droploc[%exprPpx_bench_lib.Benchmark_accumulator.Current_libname.unset()]inheader,footer);;