aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--frontend/trans.icl122
1 files changed, 121 insertions, 1 deletions
diff --git a/frontend/trans.icl b/frontend/trans.icl
index 3a48a04..7ddb451 100644
--- a/frontend/trans.icl
+++ b/frontend/trans.icl
@@ -2093,7 +2093,9 @@ transformFunctionApplication fun_def instances cc=:{cc_size, cc_args, cc_linear_
# ok_non_rec_consumer = non_rec_consumer && safe_args
# (producers, new_args, ti)
= determineProducers is_applied_to_macro_fun consumer_is_curried ok_non_rec_consumer fun_def.fun_type cc_linear_bits cc_args app_args 0 (createArray cc_size PR_Empty) ro ti
- | containsProducer cc_size producers
+ # (arity_changed,new_args,extra_args,producers,cc_args,cc_linear_bits,fun_def,ti)
+ = determineCurriedProducersInExtraArgs new_args extra_args is_applied_to_macro_fun producers cc_args cc_linear_bits fun_def ro ti
+ | containsProducer cc_size producers || arity_changed
# (is_new, fun_def_ptr, instances, ti_fun_heap) = tryToFindInstance producers instances ti.ti_fun_heap
| is_new
# ti = update_instance_info app_symb.symb_kind instances { ti & ti_fun_heap = ti_fun_heap }
@@ -2158,6 +2160,124 @@ is_cons_or_decons_of_UList_or_UTSList glob_object glob_module imported_funs
:== let type = imported_funs.[glob_module].[glob_object].ft_type;
in type.st_arity>0 && not (isEmpty type.st_context);
+determineCurriedProducersInExtraArgs new_args [] is_applied_to_macro_fun producers cc_args cc_linear_bits fun_def ro ti
+ = (False,new_args,[],producers,cc_args,cc_linear_bits,fun_def,ti)
+determineCurriedProducersInExtraArgs new_args extra_args is_applied_to_macro_fun producers cc_args cc_linear_bits fun_def ro ti
+ | not (SwitchExtraCurriedFusion ro.ro_transform_fusion is_applied_to_macro_fun)
+ = (False,new_args,extra_args,producers,cc_args,cc_linear_bits,fun_def,ti)
+ # n_extra_args = length extra_args
+ # {fun_type = Yes symbol_type=:{st_args,st_result,st_arity}} = fun_def
+ # (ok,new_args_types,new_result_type) = get_new_args_types_from_result_type st_result n_extra_args
+ | not ok
+ = (False,new_args,extra_args,producers,cc_args,cc_linear_bits,fun_def,ti)
+ # symbol_type = {symbol_type & st_result=new_result_type,st_args=st_args++new_args_types,st_arity=st_arity+n_extra_args}
+ # fun_def = {fun_def & fun_type=Yes symbol_type}
+ # (form_args,act_args,var_heap) = create_new_args n_extra_args ti.ti_var_heap
+ # ti = {ti & ti_var_heap=var_heap}
+ # (fun_body,ti) = add_args_to_fun_body form_args act_args fun_def.fun_body ro ti
+ # fun_def = {fun_def & fun_body=fun_body}
+ # new_producers = arrayPlusList producers [PR_Empty \\ i<-[0..n_extra_args-1]]
+ # new_cc_args = cc_args ++ [CPassive \\ i<-[0..n_extra_args-1]]
+ # new_cc_linear_bits = cc_linear_bits ++ [True \\ i<-[0..n_extra_args-1]]
+ = (True,new_args++extra_args,[],new_producers,new_cc_args,new_cc_linear_bits,fun_def,ti)
+where
+ get_new_args_types_from_result_type type 0
+ = (True,[],type)
+ get_new_args_types_from_result_type {at_type=a-->b} n
+ # (ok,args_types,result_type) = get_new_args_types_from_result_type b (n-1)
+ = (ok,[a:args_types],result_type)
+ get_new_args_types_from_result_type type _
+ = (False,[],type)
+
+ create_new_args n_new_args var_heap
+ | n_new_args==0
+ = ([], [], var_heap)
+ # new_name = { id_name = "_a", id_info = nilPtr }
+ (info_ptr, var_heap) = newPtr VI_Empty var_heap
+ form_var = { fv_name = new_name, fv_info_ptr = info_ptr, fv_count = 0, fv_def_level = NotALevel }
+ act_var = { var_name = new_name, var_info_ptr = info_ptr, var_expr_ptr = nilPtr }
+ (form_vars,act_vars,var_heap)
+ = create_new_args (n_new_args-1) var_heap
+ = ([form_var : form_vars],[Var act_var : act_vars],var_heap)
+
+ add_args_to_fun_body form_args act_args (TransformedBody {tb_args,tb_rhs}) ro ti
+ # tb_args = tb_args ++ form_args
+ # (tb_rhs,ti) = add_arguments tb_rhs act_args ro ti
+ = (TransformedBody {tb_args=tb_args,tb_rhs=tb_rhs},ti)
+
+ add_arguments (App app=:{app_symb,app_args}) extra_args ro ti
+ # (form_arity,fun_defs,fun_heap) = get_arity app_symb ro ti.ti_fun_defs ti.ti_fun_heap
+ # ti = {ti & ti_fun_defs=fun_defs,ti_fun_heap=fun_heap}
+ # ar_diff = form_arity - length app_args
+ | length extra_args <= ar_diff
+ = (App {app & app_args = app_args ++ extra_args }, ti)
+ = (App {app & app_args = app_args ++ take ar_diff extra_args } @ drop ar_diff extra_args, ti)
+ add_arguments (Case kees=:{case_guards,case_default}) extra_args ro ti
+ # (case_default, ti) = add_arguments_opt case_default extra_args ro ti
+ # (case_guards, ti) = add_arguments_guards case_guards extra_args ro ti
+ = (Case {kees & case_guards = case_guards, case_default = case_default}, ti)
+ add_arguments (Let lad=:{let_expr}) extra_args ro ti
+ # (let_expr, ti) = add_arguments let_expr extra_args ro ti
+ = (Let {lad & let_expr = let_expr}, ti)
+ add_arguments (expr1 @ expr2) extra_args ro ti
+ = (expr1 @ (expr2++extra_args),ti)
+ add_arguments expr extra_args ro ti
+ = (expr @ extra_args,ti)
+
+ add_arguments_opt No extra_args ro ti = (No,ti)
+ add_arguments_opt (Yes expr) extra_args ro ti
+ # (expr, ti) = add_arguments expr extra_args ro ti
+ = (Yes expr,ti)
+
+ add_arguments_guards (AlgebraicPatterns gindex apats) extra_args ro ti
+ # (apats, ti) = add_arguments_apats apats extra_args ro ti
+ = (AlgebraicPatterns gindex apats, ti)
+ add_arguments_guards (BasicPatterns btype bpats) extra_args ro ti
+ # (bpats, ti) = add_arguments_bpats bpats extra_args ro ti
+ = (BasicPatterns btype bpats, ti)
+ add_arguments_guards (DynamicPatterns dpats) extra_args ro ti
+ # (dpats, ti) = add_arguments_dpats dpats extra_args ro ti
+ = (DynamicPatterns dpats, ti)
+ add_arguments_guards (OverloadedListPatterns type decons_expr apats) extra_args ro ti
+ # (apats, ti) = add_arguments_apats apats extra_args ro ti
+ = (OverloadedListPatterns type decons_expr apats, ti)
+ add_arguments_guards NoPattern extra_args ro ti
+ = (NoPattern, ti)
+
+ add_arguments_apats [] extra_args ro ti = ([],ti)
+ add_arguments_apats [ap=:{ap_expr}:aps] extra_args ro ti
+ # (ap_expr, ti) = add_arguments ap_expr extra_args ro ti
+ # (aps, ti) = add_arguments_apats aps extra_args ro ti
+ = ([{ap & ap_expr = ap_expr}:aps],ti)
+
+ add_arguments_bpats [] extra_args ro ti = ([],ti)
+ add_arguments_bpats [bp=:{bp_expr}:bps] extra_args ro ti
+ # (bp_expr, ti) = add_arguments bp_expr extra_args ro ti
+ # (bps, ti) = add_arguments_bpats bps extra_args ro ti
+ = ([{bp & bp_expr = bp_expr}:bps],ti)
+
+ add_arguments_dpats [] extra_args ro ti = ([],ti)
+ add_arguments_dpats [dp=:{dp_rhs}:dps] extra_args ro ti
+ # (dp_rhs, ti) = add_arguments dp_rhs extra_args ro ti
+ # (dps, ti) = add_arguments_dpats dps extra_args ro ti
+ = ([{dp & dp_rhs = dp_rhs}:dps],ti)
+
+ get_arity {symb_kind=SK_Function {glob_module, glob_object}} ro fun_defs fun_heap
+ | glob_module == ro.ro_main_dcl_module_n
+ # (fun_arity, fun_defs) = fun_defs![glob_object].fun_arity
+ = (fun_arity, fun_defs, fun_heap)
+ # {ft_arity,ft_type} = ro.ro_imported_funs.[glob_module].[glob_object]
+ = (ft_arity + length ft_type.st_context, fun_defs, fun_heap)
+ get_arity {symb_kind=SK_LocalMacroFunction glob_object} ro fun_defs fun_heap
+ # (fun_arity, fun_defs) = fun_defs![glob_object].fun_arity
+ = (fun_arity, fun_defs, fun_heap)
+ get_arity {symb_kind=SK_GeneratedFunction fun_ptr _} ro fun_defs fun_heap
+ # (FI_Function {gf_fun_def={fun_arity}}, fun_heap) = readPtr fun_ptr fun_heap
+ = (fun_arity, fun_defs, fun_heap)
+ get_arity {symb_kind=SK_Constructor {glob_module, glob_object}} ro fun_defs fun_heap
+ # arity = ro.ro_common_defs.[glob_module].com_cons_defs.[glob_object].cons_type.st_arity
+ = (arity, fun_defs, fun_heap)
+
//@ is_trivial_body
:: *MatchState =