aboutsummaryrefslogtreecommitdiff
path: root/frontend/convertcases.icl
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/convertcases.icl')
-rw-r--r--frontend/convertcases.icl1377
1 files changed, 689 insertions, 688 deletions
diff --git a/frontend/convertcases.icl b/frontend/convertcases.icl
index 83bde0f..8deb7df 100644
--- a/frontend/convertcases.icl
+++ b/frontend/convertcases.icl
@@ -10,483 +10,16 @@ exactZip [] []
exactZip [x:xs][y:ys]
= [(x,y) : exactZip xs ys]
-:: ConvertState =
- { cs_new_functions :: ![FunctionInfoPtr]
- , cs_fun_heap :: !.FunctionHeap
- , cs_var_heap :: !.VarHeap
- , cs_expr_heap :: !.ExpressionHeap
- , cs_next_fun_nr :: !Index
- }
-
-:: ConvertInfo =
- { ci_bound_vars :: ![(FreeVar, AType)]
- , ci_group_index :: !Index
- , ci_common_defs :: !{#CommonDefs}
- }
-
getIdent (Yes ident) fun_nr
= ident
getIdent No fun_nr
= { id_name = "_f" +++ toString fun_nr, id_info = nilPtr }
-
-class convertCases a :: !ConvertInfo !a !*ConvertState -> (!a, !*ConvertState)
-
-instance convertCases [a] | convertCases a
-where
- convertCases ci l cs = mapSt (convertCases ci) l cs
-
-instance convertCases (a,b) | convertCases a & convertCases b
-where
- convertCases ci t cs
- = app2St (convertCases ci, convertCases ci) t cs
-
-instance convertCases LetBind
-where
- convertCases ci bind=:{lb_src} cs
- # (lb_src, cs) = convertCases ci lb_src cs
- = ({ bind & lb_src = lb_src }, cs)
-
-instance convertCases (Bind a b) | convertCases a
-where
- convertCases ci bind=:{bind_src} cs
- # (bind_src, cs) = convertCases ci bind_src cs
- = ({ bind & bind_src = bind_src }, cs)
-
-instance convertCases Let
-where
- convertCases ci lad=:{let_strict_binds,let_lazy_binds,let_expr,let_info_ptr} cs=:{cs_expr_heap}
- # (let_info, cs_expr_heap) = readPtr let_info_ptr cs_expr_heap
- cs = { cs & cs_expr_heap = cs_expr_heap }
- = case let_info of
- EI_LetType let_type
- # ci = {ci & ci_bound_vars=addLetVars (let_strict_binds ++ let_lazy_binds) let_type ci.ci_bound_vars}
- # (let_strict_binds, cs) = convertCases ci let_strict_binds cs
- # (let_lazy_binds, cs) = convertCases ci let_lazy_binds cs
- # (let_expr, cs) = convertCases ci let_expr cs
- -> ({ lad & let_strict_binds = let_strict_binds, let_lazy_binds = let_lazy_binds, let_expr = let_expr }, cs)
- _
- -> abort "convertCases [Let] (convertcases 53)" // <<- let_info
-
addLetVars [{lb_dst} : binds] [bind_type : bind_types] bound_vars
= addLetVars binds bind_types [ (lb_dst, bind_type) : bound_vars ]
addLetVars [] _ bound_vars
= bound_vars
-instance convertCases Expression
-where
- convertCases ci (App app=:{app_args}) cs
- # (app_args, cs) = convertCases ci app_args cs
- = (App {app & app_args = app_args}, cs)
- convertCases ci (fun_expr @ exprs) cs
- # ((fun_expr, exprs), cs) = convertCases ci (fun_expr, exprs) cs
- = (fun_expr @ exprs, cs)
- convertCases ci (Let lad) cs
- # (lad, cs) = convertCases ci lad cs
- = (Let lad, cs)
- convertCases ci (MatchExpr opt_tuple constructor expr) cs
- # (expr, cs) = convertCases ci expr cs
- = (MatchExpr opt_tuple constructor expr, cs)
- convertCases ci (Selection is_unique expr selectors) cs
- # (expr, cs) = convertCases ci expr cs
- (selectors, cs) = convertCases ci selectors cs
- = (Selection is_unique expr selectors, cs)
- convertCases ci (Update expr1 selectors expr2) cs
- # (expr1, cs) = convertCases ci expr1 cs
- (selectors, cs) = convertCases ci selectors cs
- (expr2, cs) = convertCases ci expr2 cs
- = (Update expr1 selectors expr2, cs)
- convertCases ci (RecordUpdate cons_symbol expression expressions) cs
- # (expression, cs) = convertCases ci expression cs
- (expressions, cs) = convertCases ci expressions cs
- = (RecordUpdate cons_symbol expression expressions, cs)
- convertCases ci (TupleSelect tuple_symbol arg_nr expr) cs
- # (expr, cs) = convertCases ci expr cs
- = (TupleSelect tuple_symbol arg_nr expr, cs)
- convertCases ci (Case case_expr) cs
- = convertCasesInCaseExpression ci cHasNoDefault case_expr cs
- convertCases ci expr cs
- = (expr, cs)
-
-instance convertCases Selection
-where
- convertCases ci (DictionarySelection record selectors expr_ptr index_expr) cs
- # (index_expr, cs) = convertCases ci index_expr cs
- (selectors, cs) = convertCases ci selectors cs
- = (DictionarySelection record selectors expr_ptr index_expr, cs)
- convertCases ci (ArraySelection selector expr_ptr index_expr) cs
- # (index_expr, cs) = convertCases ci index_expr cs
- = (ArraySelection selector expr_ptr index_expr, cs)
- convertCases ci selector cs
- = (selector, cs)
-
-cHasNoDefault :== nilPtr
-
-convertDefaultToExpression default_ptr (EI_Default expr type prev_default) ci cs=:{cs_var_heap}
- # cs_var_heap = foldSt (\({fv_info_ptr}, type) -> writePtr fv_info_ptr (VI_BoundVar type)) ci.ci_bound_vars cs_var_heap
- (expression, {cp_free_vars, cp_var_heap, cp_local_vars}) = copy expr { cp_free_vars = [], cp_var_heap = cs_var_heap, cp_local_vars = [] }
- (act_args, free_typed_vars, cs_var_heap) = foldSt retrieveVariable cp_free_vars ([], [], cp_var_heap)
- (fun_symb, cs) = new_default_function free_typed_vars cp_local_vars expression type prev_default ci.ci_group_index ci.ci_common_defs { cs & cs_var_heap = cs_var_heap }
- = (App { app_symb = fun_symb, app_args = act_args, app_info_ptr = nilPtr },
- { cs & cs_expr_heap = cs.cs_expr_heap <:= (default_ptr, EI_DefaultFunction fun_symb act_args)})
-where
- new_default_function free_vars local_vars rhs_expr result_type prev_default group_index common_defs cs
- # (guarded_exprs, cs) = convertPatternExpression [] [free_vars] group_index common_defs prev_default rhs_expr cs
- fun_bodies = map build_pattern guarded_exprs
- arg_types = map (\(_,type) -> type) free_vars
- (fun_symb, (cs_next_fun_nr, cs_new_functions, cs_fun_heap))
- = newFunction No (BackendBody fun_bodies) local_vars arg_types result_type group_index
- (cs.cs_next_fun_nr, cs.cs_new_functions, cs.cs_fun_heap)
- = (fun_symb, { cs & cs_fun_heap = cs_fun_heap, cs_next_fun_nr = cs_next_fun_nr, cs_new_functions = cs_new_functions })
-
- build_pattern ([ right_patterns : _ ], bb_rhs)
- = { bb_args = right_patterns, bb_rhs = bb_rhs }
-
-convertDefaultToExpression default_ptr (EI_DefaultFunction fun_symb act_args) ci cs
- = (App { app_symb = fun_symb, app_args = act_args, app_info_ptr = nilPtr }, cs)
-
-combineDefaults default_ptr guards No ci cs=:{cs_expr_heap}
- | isNilPtr default_ptr
- = (No, cs)
- | case_is_partial guards ci.ci_common_defs
- # (default_info, cs_expr_heap) = readPtr default_ptr cs_expr_heap
- (default_expr, cs) = convertDefaultToExpression default_ptr default_info ci { cs & cs_expr_heap = cs_expr_heap }
- = (Yes default_expr, cs)
- = (No, cs)
-where
- case_is_partial (AlgebraicPatterns {glob_module, glob_object} patterns) common_defs
- # {td_rhs} = common_defs.[glob_module].com_type_defs.[glob_object]
- = length patterns < nr_of_alternatives td_rhs || has_partial_pattern patterns
- where
- nr_of_alternatives (AlgType conses)
- = length conses
- nr_of_alternatives _
- = 1
-
- has_partial_pattern []
- = False
- has_partial_pattern [{ap_expr} : patterns]
- = is_partial_expression ap_expr common_defs || has_partial_pattern patterns
- case_is_partial (BasicPatterns BT_Bool bool_patterns) common_defs
- = length bool_patterns < 2 || has_partial_basic_pattern bool_patterns
- where
- has_partial_basic_pattern []
- = False
- has_partial_basic_pattern [{bp_expr} : patterns]
- = is_partial_expression bp_expr common_defs || has_partial_basic_pattern patterns
- case_is_partial patterns common_defs
- = True
-
- is_partial_expression (Case {case_guards,case_default=No}) common_defs
- = case_is_partial case_guards common_defs
- is_partial_expression (Case {case_guards,case_default=Yes case_default}) common_defs
- = is_partial_expression case_default common_defs && case_is_partial case_guards common_defs
- is_partial_expression (Let {let_expr}) common_defs
- = is_partial_expression let_expr common_defs
- is_partial_expression _ _
- = False
-
-combineDefaults default_ptr guards this_default ci cs
- = (this_default, cs)
-
-
-:: TypedVariable =
- { tv_free_var :: !FreeVar
- , tv_type :: !AType
- }
-
-copyExpression :: ![TypedVariable] !Expression !*VarHeap -> (![Expression], ![TypedVariable], ![FreeVar], !Expression, !*VarHeap)
-copyExpression bound_vars expression var_heap
- # var_heap = foldSt (\{tv_free_var={fv_info_ptr},tv_type} -> writePtr fv_info_ptr (VI_BoundVar tv_type)) bound_vars var_heap
- (expression, {cp_free_vars, cp_var_heap, cp_local_vars}) = copy expression { cp_free_vars = [], cp_var_heap = var_heap, cp_local_vars = [] }
- (bound_vars, free_typed_vars, var_heap) = foldSt retrieve_variable cp_free_vars ([], [], cp_var_heap)
- = (bound_vars, free_typed_vars, cp_local_vars, expression, var_heap)
-where
- retrieve_variable (var_info_ptr, type) (bound_vars, free_typed_vars, var_heap)
- # (VI_FreeVar name new_ptr count type, var_heap) = readPtr var_info_ptr var_heap
- = ( [Var { var_name = name, var_info_ptr = var_info_ptr, var_expr_ptr = nilPtr} : bound_vars],
- [{tv_free_var = { fv_def_level = NotALevel, fv_name = name, fv_info_ptr = new_ptr, fv_count = count }, tv_type = type} : free_typed_vars], var_heap)
-
-retrieveVariable (var_info_ptr, type) (bound_vars, free_typed_vars, var_heap)
- # (VI_FreeVar name new_ptr count type, var_heap) = readPtr var_info_ptr var_heap
- = ( [Var { var_name = name, var_info_ptr = var_info_ptr, var_expr_ptr = nilPtr} : bound_vars],
- [({ fv_def_level = NotALevel, fv_name = name, fv_info_ptr = new_ptr, fv_count = count }, type) : free_typed_vars], var_heap)
-
-convertCasesInCaseExpression ci default_ptr { case_expr, case_guards, case_default, case_ident, case_info_ptr} cs
- # (case_default, cs) = combineDefaults default_ptr case_guards case_default ci cs
- (case_expr, cs) = convertCases ci case_expr cs
- (EI_CaseTypeAndRefCounts case_type ref_counts, cs_expr_heap) = readPtr case_info_ptr cs.cs_expr_heap
- (act_vars, form_vars, opt_free_var, local_vars, (case_guards, case_default), cs_var_heap)
- = copy_case_expression ci.ci_bound_vars (get_variable case_expr case_type.ct_pattern_type) (case_guards,case_default) cs.cs_var_heap
- (fun_symb, cs) = new_case_function case_ident case_guards case_default case_type opt_free_var form_vars local_vars
- ci.ci_group_index ci.ci_common_defs default_ptr { cs & cs_var_heap = cs_var_heap, cs_expr_heap = cs_expr_heap }
- = (App { app_symb = fun_symb, app_args = [ case_expr : act_vars ], app_info_ptr = nilPtr }, cs)
-where
- get_variable (Var var) pattern_type
- = Yes (var, pattern_type)
- get_variable _ _
- = No
-
- copy_case_expression bound_vars opt_variable guards_and_default var_heap
- # var_heap = foldSt (\({fv_name,fv_info_ptr},type) -> writePtr fv_info_ptr (VI_BoundVar type)) bound_vars var_heap
- (opt_copied_var, var_heap) = copy_variable opt_variable var_heap
- (expression, {cp_free_vars, cp_var_heap, cp_local_vars}) = copy guards_and_default { cp_free_vars = [], cp_var_heap = var_heap, cp_local_vars = [] }
- (bound_vars, free_typed_vars, var_heap) = foldSt retrieveVariable cp_free_vars ([], [], cp_var_heap)
- (opt_free_var, var_heap) = toOptionalFreeVar opt_copied_var var_heap
- = (bound_vars, free_typed_vars, opt_free_var, cp_local_vars, expression, var_heap)
-
- copy_variable (Yes (var=:{var_name,var_info_ptr}, var_type)) var_heap
- # (new_info, var_heap) = newPtr VI_Empty var_heap
- = (Yes (var_info_ptr, var_type), var_heap <:= (var_info_ptr, VI_FreeVar var_name new_info 0 var_type))
- copy_variable No var_heap
- = (No, var_heap)
-
- new_case_function opt_id patterns case_default {ct_result_type,ct_pattern_type,ct_cons_types} opt_var free_vars local_vars
- group_index common_defs prev_default cs=:{cs_expr_heap}
- # (default_ptr, cs_expr_heap) = makePtrToDefault case_default ct_result_type prev_default cs_expr_heap
- (fun_bodies, cs) = convertPatterns patterns ct_cons_types opt_var [] free_vars default_ptr group_index common_defs { cs & cs_expr_heap = cs_expr_heap }
- (fun_bodies, cs) = convertDefault default_ptr opt_var [] free_vars group_index common_defs (fun_bodies, cs)
- (fun_symb, (cs_next_fun_nr, cs_new_functions, cs_fun_heap))
- = newFunction opt_id (BackendBody fun_bodies) local_vars [ct_pattern_type : [ type \\ (_, type) <- free_vars]] ct_result_type group_index
- (cs.cs_next_fun_nr, cs.cs_new_functions, cs.cs_fun_heap)
- = (fun_symb, { cs & cs_fun_heap = cs_fun_heap, cs_next_fun_nr = cs_next_fun_nr, cs_new_functions = cs_new_functions })
-
-
-
-makePtrToDefault (Yes default_expr) type prev_default_ptr expr_heap
- = newPtr (EI_Default default_expr type prev_default_ptr) expr_heap
-makePtrToDefault No type prev_default_ptr expr_heap
- = (cHasNoDefault, expr_heap)
-
-
-convertDefault default_ptr opt_var left_vars right_vars group_index common_defs (fun_bodies, cs)
- | isNilPtr default_ptr
- = (fun_bodies, cs)
- # (default_info, cs_expr_heap) = readPtr default_ptr cs.cs_expr_heap
- = convert_default default_info opt_var left_vars right_vars group_index common_defs (fun_bodies, { cs & cs_expr_heap = cs_expr_heap})
-where
- convert_default (EI_Default default_expr type prev_default) opt_var left_vars right_vars group_index common_defs (fun_bodies, cs)
- # (bb_rhs, cs) = convertRootExpression {ci_bound_vars=left_vars ++ consOptional opt_var right_vars, ci_group_index=group_index, ci_common_defs=common_defs} prev_default default_expr cs
- bb_args = build_args opt_var left_vars right_vars
- = (fun_bodies ++ [{ bb_args = bb_args, bb_rhs = bb_rhs }], cs)
- convert_default (EI_DefaultFunction fun_symb act_args) opt_var left_vars right_vars group_index common_defs (fun_bodies, cs)
- # bb_args = build_args opt_var left_vars right_vars
- bb_rhs = App { app_symb = fun_symb, app_args = act_args, app_info_ptr = nilPtr }
- = (fun_bodies ++ [{ bb_args = bb_args, bb_rhs = bb_rhs }], cs)
-
- build_args (Yes (var,type)) left_vars right_vars
- = mapAppend typed_free_var_to_pattern left_vars [FP_Variable var : map typed_free_var_to_pattern right_vars]
- build_args No left_vars right_vars
- = mapAppend typed_free_var_to_pattern left_vars [FP_Empty : map typed_free_var_to_pattern right_vars]
-
- typed_free_var_to_pattern (free_var, type) = FP_Variable free_var
-
-
-newFunction :: !(Optional Ident) !FunctionBody ![FreeVar] ![AType] !AType !Int !(!Int, ![FunctionInfoPtr],!*FunctionHeap)
- -> (! SymbIdent, !(!Int, ![FunctionInfoPtr],!*FunctionHeap))
-newFunction opt_id fun_bodies local_vars arg_types result_type group_index (cs_next_fun_nr, cs_new_functions, cs_fun_heap)
- # (fun_def_ptr, cs_fun_heap) = newPtr FI_Empty cs_fun_heap
- fun_id = getIdent opt_id cs_next_fun_nr
- arity = length arg_types
- fun_type =
- { st_vars = []
- , st_args = arg_types
- , st_arity = arity
- , st_result = result_type
- , st_context = []
- , st_attr_vars = []
- , st_attr_env = []
- }
-
- fun_def =
- { fun_symb = fun_id
- , fun_arity = arity
- , fun_priority = NoPrio
- , fun_body = fun_bodies
- , fun_type = Yes fun_type
- , fun_pos = NoPos
- , fun_index = NoIndex
- , fun_kind = FK_ImpFunction cNameNotLocationDependent
- , fun_lifted = 0
- , fun_info = { EmptyFunInfo & fi_group_index = group_index, fi_local_vars = local_vars }
- }
- = ({ symb_name = fun_id, symb_kind = SK_GeneratedFunction fun_def_ptr cs_next_fun_nr, symb_arity = arity },
- (inc cs_next_fun_nr, [fun_def_ptr : cs_new_functions],
- cs_fun_heap <:= (fun_def_ptr, FI_Function { gf_fun_def = fun_def, gf_instance_info = II_Empty,
- gf_fun_index = cs_next_fun_nr, gf_cons_args = {cc_size=0, cc_args = [], cc_linear_bits = []} })))
-
-
-consOptional (Yes x) xs = [x : xs]
-consOptional No xs = xs
-
-getOptionalFreeVar (Yes (free_var,_)) = Yes free_var
-getOptionalFreeVar No = No
-
-optionalToListofLists (Yes x)
- = [[x]]
-optionalToListofLists No
- = []
-
-hasOption (Yes _) = True
-hasOption No = False
-
-convertPatterns :: CasePatterns [[AType]] (Optional (FreeVar,AType)) [.(FreeVar,AType)] [(FreeVar,AType)] (Ptr ExprInfo) Index {#CommonDefs} *ConvertState -> *(!.[BackendBody],!*ConvertState);
-convertPatterns (AlgebraicPatterns algtype patterns) cons_types opt_var left_vars right_vars default_ptr group_index common_defs cs
- # (guarded_exprs_list, cs) = mapSt (convert_algebraic_guard_into_function_pattern opt_var left_vars right_vars
- group_index common_defs default_ptr) (exactZip patterns cons_types) cs
- = (flatten guarded_exprs_list, cs)
-where
- convert_algebraic_guard_into_function_pattern opt_var left_vars right_vars group_index common_defs default_ptr ({ap_symbol, ap_vars, ap_expr}, cons_arg_types) cs
- # pattern_vars = exactZip ap_vars cons_arg_types
- (guarded_exprs, cs)
- = convertPatternExpression (consOptional opt_var left_vars) [pattern_vars, right_vars] group_index common_defs default_ptr ap_expr cs
- = (map (complete_pattern left_vars ap_symbol (getOptionalFreeVar opt_var)) guarded_exprs, cs)
- where
- complete_pattern left_vars cons_symbol optional_var ([ pattern_args, right_patterns : _ ], bb_rhs)
- # bb_args = mapAppend selectFreeVar left_vars [FP_Algebraic cons_symbol pattern_args optional_var : right_patterns ]
- = { bb_args = bb_args, bb_rhs = bb_rhs }
-convertPatterns (BasicPatterns bastype patterns) cons_types opt_var left_vars right_vars default_ptr group_index common_defs cs
- # (guarded_exprs_list, cs) = mapSt (convert_basic_guard_into_function_pattern opt_var left_vars right_vars
- group_index common_defs default_ptr) patterns cs
- = (flatten guarded_exprs_list, cs)
-where
- convert_basic_guard_into_function_pattern opt_var left_vars right_vars group_index common_defs default_ptr {bp_value, bp_expr} cs
- # (guarded_exprs, cs)
- = convertPatternExpression (consOptional opt_var left_vars) [right_vars] group_index common_defs default_ptr bp_expr cs
- = (map (complete_pattern left_vars bp_value (getOptionalFreeVar opt_var)) guarded_exprs, cs)
- where
- complete_pattern left_vars value optional_var ([ right_patterns : _ ], bb_rhs)
- # bb_args = mapAppend selectFreeVar left_vars [FP_Basic value optional_var : right_patterns ]
- = { bb_args = bb_args, bb_rhs = bb_rhs }
-
-convertPatternExpression :: ![(FreeVar,AType)] ![[(FreeVar,AType)]] !Index !{#CommonDefs} !ExprInfoPtr !Expression !*ConvertState
- -> *(![([[FunctionPattern]], !Expression)], !*ConvertState)
-convertPatternExpression left_vars right_vars group_index common_defs default_ptr
- case_expr=:(Case {case_expr = Var var=:{var_info_ptr}, case_guards, case_default, case_info_ptr}) cs
- | list_contains_variable var_info_ptr right_vars
- = case case_guards of
- BasicPatterns type basic_patterns
- # split_result = split_list_of_vars var_info_ptr [] right_vars
- (default_patterns, cs) = convert_default left_vars split_result group_index common_defs case_default cs
- (guarded_exprs, cs) = mapSt (convert_basic_guard_into_function_pattern left_vars split_result group_index common_defs) basic_patterns cs
- -> (flatten guarded_exprs ++ default_patterns, cs)
- AlgebraicPatterns type algebraic_patterns
- # (EI_CaseTypeAndRefCounts {ct_cons_types} _, cs_expr_heap) = readPtr case_info_ptr cs.cs_expr_heap
- split_result = split_list_of_vars var_info_ptr [] right_vars
- (default_patterns, cs) = convert_default left_vars split_result group_index common_defs case_default { cs & cs_expr_heap = cs_expr_heap }
- (guarded_exprs, cs) = mapSt (convert_algebraic_guard_into_function_pattern left_vars split_result group_index common_defs case_info_ptr)
- (exactZip algebraic_patterns ct_cons_types) cs
- -> (flatten guarded_exprs ++ default_patterns, cs)
- _
- -> convertToRhsExpression left_vars right_vars group_index common_defs default_ptr case_expr cs
- = convertToRhsExpression left_vars right_vars group_index common_defs default_ptr case_expr cs
-where
- list_contains_variable var_info_ptr []
- = False
- list_contains_variable var_info_ptr [ right_vars : list_of_right_vars ]
- = contains_variable var_info_ptr right_vars || list_contains_variable var_info_ptr list_of_right_vars
- where
- contains_variable var_info_ptr []
- = False
- contains_variable var_info_ptr [ ({fv_info_ptr},_) : right_vars ]
- = var_info_ptr == fv_info_ptr || contains_variable var_info_ptr right_vars
-
- convert_default left_vars ((fv,fv_type), list_of_left, list_of_right) group_index common_defs (Yes default_expr) cs
- # (guarded_exprs, cs)
- = convertPatternExpression (left_vars ++ [ (fv,fv_type) : flatten list_of_left ]) list_of_right group_index common_defs default_ptr default_expr cs
- = (map (complete_pattern list_of_left fv) guarded_exprs, cs)
- where
- complete_pattern list_of_left this_var (list_of_patterns, expr)
- = (complete_patterns list_of_left (FP_Variable this_var) list_of_patterns, expr)
- convert_default left_vars ((fv,fv_type), list_of_left, list_of_right) group_index common_defs No cs
- = ([], cs)
-
- convert_basic_guard_into_function_pattern left_vars ((fv,fv_type), list_of_left, list_of_right) group_index common_defs {bp_value, bp_expr} cs
- # (guarded_exprs, cs)
- = convertPatternExpression (left_vars ++ [ (fv,fv_type) : flatten list_of_left ]) list_of_right group_index common_defs default_ptr bp_expr cs
- = (map (complete_pattern list_of_left bp_value (Yes fv)) guarded_exprs, cs)
- where
- complete_pattern list_of_left value opt_var (list_of_patterns, expr)
- = (complete_patterns list_of_left (FP_Basic value opt_var) list_of_patterns, expr)
-
- convert_algebraic_guard_into_function_pattern left_vars ((fv,fv_type), list_of_left, list_of_right) group_index common_defs case_info_ptr
- ({ap_symbol, ap_vars, ap_expr}, arg_types) cs=:{cs_expr_heap}
- # (guarded_exprs, cs)
- = convertPatternExpression (left_vars ++ [ (fv,fv_type) : flatten list_of_left ]) [ exactZip ap_vars arg_types : list_of_right ]
- group_index common_defs default_ptr ap_expr { cs & cs_expr_heap = cs_expr_heap }
- = (map (complete_pattern list_of_left ap_symbol (Yes fv)) guarded_exprs, cs)
- where
- complete_pattern :: ![[(FreeVar,a)]] !(Global DefinedSymbol) !(Optional !FreeVar) !([[FunctionPattern]], !b) -> (![[FunctionPattern]], !b)
- complete_pattern list_of_left cons_symbol opt_var ([ patterns : list_of_patterns], expr)
- = (complete_patterns list_of_left (FP_Algebraic cons_symbol patterns opt_var) list_of_patterns, expr)
-
- split_list_of_vars var_info_ptr list_of_left [ vars : list_of_vars ]
- # (fv, left, list_of_left, list_of_right) = split_vars var_info_ptr [] list_of_left vars list_of_vars
- = (fv, [left : list_of_left], list_of_right)
- where
- split_vars var_info_ptr left list_of_left [] list_of_vars
- # (fv, list_of_left, list_of_right) = split_list_of_vars var_info_ptr list_of_left list_of_vars
- = (fv, left, list_of_left, list_of_right)
-
- split_vars var_info_ptr left list_of_left [ this_var=:(fv,_) : vars ] list_of_vars
- | var_info_ptr == fv.fv_info_ptr
- = (this_var, left, list_of_left, [ vars : list_of_vars ])
- = split_vars var_info_ptr [this_var : left] list_of_left vars list_of_vars
-
- complete_patterns [ left_args ] current_pattern [ right_args : list_of_right_args ]
- = [ add_free_vars left_args [current_pattern : right_args] : list_of_right_args ]
- complete_patterns [ left_args : list_of_left_args ] current_pattern list_of_right_args
- = [ add_free_vars left_args [] : complete_patterns list_of_left_args current_pattern list_of_right_args ]
-
- add_free_vars [(fv, _) : left_vars] right_vars
- = add_free_vars left_vars [ FP_Variable fv : right_vars ]
- add_free_vars [] right_vars
- = right_vars
-
-convertPatternExpression left_vars right_vars group_index common_defs default_ptr expr cs
- = convertToRhsExpression left_vars right_vars group_index common_defs default_ptr expr cs
-
-convertToRhsExpression left_vars right_vars group_index common_defs default_ptr expr cs
- # (bb_rhs, cs) = convertRootExpression {ci_bound_vars=left_vars ++ flatten right_vars, ci_group_index=group_index, ci_common_defs=common_defs} default_ptr expr cs
- = ([(map (map selectFreeVar) right_vars, bb_rhs)], cs)
-
-selectFreeVar (fv,_) = FP_Variable fv
-
-toFreeVar (var_info_ptr, _) var_heap
- #! var_info = sreadPtr var_info_ptr var_heap
- # (VI_FreeVar name new_ptr count type) = var_info
- = (FP_Variable { fv_def_level = NotALevel, fv_name = name, fv_info_ptr = new_ptr, fv_count = count}, var_heap)
-
-toOptionalFreeVar (Yes (var_info_ptr, type)) var_heap
- #! var_info = sreadPtr var_info_ptr var_heap
- = case var_info of
- VI_FreeVar name new_ptr count type
- -> (Yes ({ fv_def_level = NotALevel, fv_name = name, fv_info_ptr = new_ptr, fv_count = count}, type), var_heap)
- _
- -> (No, var_heap)
-toOptionalFreeVar No var_heap
- = (No, var_heap)
-
-addNewFunctionsToGroups :: !{#.CommonDefs} FunctionHeap ![FunctionInfoPtr] !Int !*{! Group} !*{#{# CheckedTypeDef}} !ImportedFunctions !*TypeHeaps !*VarHeap
- -> (!*{! Group}, ![FunDef], !*{#{# CheckedTypeDef}}, !ImportedConstructors, !*TypeHeaps, !*VarHeap)
-addNewFunctionsToGroups common_defs fun_heap new_functions main_dcl_module_n groups imported_types imported_conses type_heaps var_heap
- = foldSt (add_new_function_to_group fun_heap common_defs) new_functions (groups, [], imported_types, imported_conses, type_heaps, var_heap)
-where
-
- add_new_function_to_group :: !FunctionHeap !{# CommonDefs} !FunctionInfoPtr
- !(!*{! Group}, ![FunDef], !*{#{# CheckedTypeDef}}, !ImportedConstructors, !*TypeHeaps, !*VarHeap)
- -> (!*{! Group}, ![FunDef], !*{#{# CheckedTypeDef}}, !ImportedConstructors, !*TypeHeaps, !*VarHeap)
- add_new_function_to_group fun_heap common_defs fun_ptr (groups, fun_defs, imported_types, imported_conses, type_heaps, var_heap)
- # (FI_Function {gf_fun_def,gf_fun_index}) = sreadPtr fun_ptr fun_heap
- {fun_type = Yes ft, fun_info = {fi_group_index, fi_properties}} = gf_fun_def
- (Yes ft) = gf_fun_def.fun_type
- (ft, imported_types, imported_conses, type_heaps, var_heap)
- = convertSymbolType (fi_properties bitand FI_HasTypeSpec == 0) common_defs ft main_dcl_module_n
- imported_types imported_conses type_heaps var_heap
- # (group, groups) = groups![fi_group_index]
- = ({ groups & [fi_group_index] = { group & group_members = [gf_fun_index : group.group_members]} },
- [ { gf_fun_def & fun_type = Yes ft }: fun_defs], imported_types, imported_conses, type_heaps, var_heap)
-
convertCasesOfFunctions :: !*{! Group} !Int !{# {# FunType} } !{# CommonDefs} !*{#FunDef} !*{#{# CheckedTypeDef}}
!ImportedConstructors !*VarHeap !*TypeHeaps !*ExpressionHeap
-> (!ImportedFunctions, !*{! Group}, !*{#FunDef}, !*{#{# CheckedTypeDef}}, !ImportedConstructors, !*VarHeap, !*TypeHeaps, !*ExpressionHeap)
@@ -509,7 +42,6 @@ where
= convert_groups (inc group_nr) groups dcl_functions common_defs
(foldSt (convert_function group_nr dcl_functions common_defs) group.group_members fun_defs_and_ci)
-
convert_function group_index dcl_functions common_defs fun (fun_defs, collected_imports, cs)
# (fun_def, fun_defs) = fun_defs![fun]
# {fun_body,fun_type} = fun_def
@@ -551,201 +83,6 @@ where
split (SK_Constructor cons_symb) (collected_functions, collected_conses)
= (collected_functions, [ cons_symb : collected_conses])
-convertRootExpression ci default_ptr (Let lad=:{let_strict_binds,let_lazy_binds,let_expr,let_info_ptr}) cs=:{cs_expr_heap}
- # (EI_LetType let_type, cs_expr_heap) = readPtr let_info_ptr cs_expr_heap
- bound_vars = addLetVars (let_strict_binds ++ let_lazy_binds) let_type ci.ci_bound_vars
- ci = {ci & ci_bound_vars=bound_vars}
- (let_strict_binds, cs) = convertCases ci let_strict_binds { cs & cs_expr_heap = cs_expr_heap }
- (let_lazy_binds, cs) = convertCases ci let_lazy_binds cs
- (let_expr, cs) = convertRootExpression ci default_ptr let_expr cs
- = (Let { lad & let_strict_binds = let_strict_binds, let_lazy_binds = let_lazy_binds, let_expr = let_expr }, cs)
-convertRootExpression ci default_ptr (Case kees=:{case_expr, case_guards, case_default, case_info_ptr}) cs
- = case case_guards of
- BasicPatterns BT_Bool patterns
- -> convert_boolean_case_into_guard ci default_ptr case_expr patterns case_default case_info_ptr cs
- _
- -> convertCasesInCaseExpression ci default_ptr kees cs
-
-where
-
-// convert_boolean_case_into_guard bound_vars group_index common_defs default_ptr guard [ alt : alts ] case_default case_info_ptr cs
- convert_boolean_case_into_guard ci has_default guard [ alt=:{bp_value=BVB sign_of_then_part,bp_expr} : alts ] case_default case_info_ptr cs
- # (guard, cs) = convertRootExpression ci cHasNoDefault guard cs
- # (EI_CaseTypeAndRefCounts case_type _, cs_expr_heap) = readPtr case_info_ptr cs.cs_expr_heap
- # (default_ptr, cs_expr_heap) = makePtrToDefault case_default case_type.ct_result_type has_default cs_expr_heap
- # (then_part, cs) = convertRootExpression ci default_ptr bp_expr {cs &cs_expr_heap=cs_expr_heap}
- # (opt_else_part, cs) = convert_to_else_part ci default_ptr sign_of_then_part alts case_default cs
-// = (Conditional { if_cond = { con_positive = sign_of_then_part, con_expression = guard }, if_then = then_part, if_else = opt_else_part }, cs)
- = (build_conditional sign_of_then_part guard then_part opt_else_part, cs)
- where
- build_conditional True guard then_expr opt_else_expr
- = Conditional { if_cond = guard, if_then = then_expr, if_else = opt_else_expr }
- build_conditional false guard then_expr (Yes else_expr)
- = Conditional { if_cond = guard, if_then = else_expr, if_else = Yes then_expr }
- build_conditional false guard then_expr No
- = Conditional { if_cond = Conditional { if_cond = guard, if_then = BasicExpr (BVB False) BT_Bool, if_else = Yes (BasicExpr (BVB True) BT_Bool) },
- if_then = then_expr, if_else = No }
-
- convert_to_else_part ci default_ptr sign_of_then_part [ alt=:{bp_value=BVB sign_of_else_part,bp_expr} : alts ] case_default cs
- # (else_part, cs) = convertRootExpression ci default_ptr bp_expr cs
- | sign_of_then_part == sign_of_else_part
- = convert_to_else_part ci default_ptr sign_of_then_part alts case_default cs
- = (Yes else_part, cs)
- convert_to_else_part ci default_ptr sign_of_then_part [ ] (Yes else_part) cs
- # (else_part, cs) = convertRootExpression ci has_default else_part cs
- = (Yes else_part, cs)
- convert_to_else_part ci default_ptr sign_of_then_part [ ] No cs
- = (No, cs)
-
-convertRootExpression ci _ expr cs
- = convertCases ci expr cs
-
-:: CopyInfo =
- { cp_free_vars :: ![(VarInfoPtr,AType)]
- , cp_local_vars :: ![FreeVar]
- , cp_var_heap :: !.VarHeap
- }
-
-class copy e :: !e !*CopyInfo -> (!e, !*CopyInfo)
-
-instance copy BoundVar
-where
- copy var=:{var_name,var_info_ptr} cp_info=:{cp_var_heap}
- # (var_info, cp_var_heap) = readPtr var_info_ptr cp_var_heap
- cp_info = { cp_info & cp_var_heap = cp_var_heap }
- = case var_info of
- VI_FreeVar name new_info_ptr count type
- -> ({ var & var_info_ptr = new_info_ptr },
- { cp_info & cp_var_heap = cp_info.cp_var_heap <:= (var_info_ptr, VI_FreeVar name new_info_ptr (inc count) type)})
- VI_LocalVar
- -> (var, cp_info)
- VI_BoundVar type
- # (new_info_ptr, cp_var_heap) = newPtr VI_Empty cp_info.cp_var_heap
- -> ({ var & var_info_ptr = new_info_ptr },
- { cp_info & cp_free_vars = [ (var_info_ptr, type) : cp_info.cp_free_vars ],
- cp_var_heap = cp_var_heap <:= (var_info_ptr, VI_FreeVar var_name new_info_ptr 1 type) })
- _
- -> abort "copy [BoundVar] (convertcases)" // <<- (var_info ---> (var_name, ptrToInt var_info_ptr))
-
-instance copy Expression
-where
- copy (Var var) cp_info
- # (var, cp_info) = copy var cp_info
- = (Var var, cp_info)
- copy (App app=:{app_args}) cp_info
- # (app_args, cp_info) = copy app_args cp_info
- = (App {app & app_args = app_args}, cp_info)
- copy (fun_expr @ exprs) cp_info
- # ((fun_expr, exprs), cp_info) = copy (fun_expr, exprs) cp_info
- = (fun_expr @ exprs, cp_info)
- copy (Let lad=:{let_strict_binds,let_lazy_binds, let_expr}) cp_info=:{cp_var_heap, cp_local_vars}
- # (cp_local_vars, cp_var_heap) = foldSt bind_let_var let_strict_binds (cp_local_vars, cp_var_heap)
- # (cp_local_vars, cp_var_heap) = foldSt bind_let_var let_lazy_binds (cp_local_vars, cp_var_heap)
- # (let_strict_binds, cp_info) = copy let_strict_binds {cp_info & cp_var_heap = cp_var_heap, cp_local_vars = cp_local_vars }
- # (let_lazy_binds, cp_info) = copy let_lazy_binds cp_info
- # (let_expr, cp_info) = copy let_expr cp_info
- = (Let {lad & let_strict_binds = let_strict_binds, let_lazy_binds = let_lazy_binds, let_expr = let_expr }, cp_info)
- where
- bind_let_var {lb_dst} (local_vars, var_heap)
- = ([lb_dst : local_vars], var_heap <:= (lb_dst.fv_info_ptr, VI_LocalVar))
- copy (Case case_expr) cp_info
- # (case_expr, cp_info) = copy case_expr cp_info
- = (Case case_expr, cp_info)
- copy expr=:(BasicExpr _ _) cp_info
- = (expr, cp_info)
- copy (MatchExpr opt_tuple constructor expr) cp_info
- # (expr, cp_info) = copy expr cp_info
- = (MatchExpr opt_tuple constructor expr, cp_info)
- copy (Selection is_unique expr selectors) cp_info
- # (expr, cp_info) = copy expr cp_info
- (selectors, cp_info) = copy selectors cp_info
- = (Selection is_unique expr selectors, cp_info)
- copy (Update expr1 selectors expr2) cp_info
- # (expr1, cp_info) = copy expr1 cp_info
- (selectors, cp_info) = copy selectors cp_info
- (expr2, cp_info) = copy expr2 cp_info
- = (Update expr1 selectors expr2, cp_info)
- copy (RecordUpdate cons_symbol expression expressions) cp_info
- # (expression, cp_info) = copy expression cp_info
- (expressions, cp_info) = copy expressions cp_info
- = (RecordUpdate cons_symbol expression expressions, cp_info)
- copy (TupleSelect tuple_symbol arg_nr expr) cp_info
- # (expr, cp_info) = copy expr cp_info
- = (TupleSelect tuple_symbol arg_nr expr, cp_info)
- copy EE cp_info
- = (EE, cp_info)
- copy (NoBind ptr) cp_info
- = (NoBind ptr, cp_info)
- copy expr cp_info
- = abort ("copy (Expression) does not match" ---> expr)
-
-instance copy (Optional a) | copy a
-where
- copy (Yes expr) cp_info
- # (expr, cp_info) = copy expr cp_info
- = (Yes expr, cp_info)
- copy No cp_info
- = (No, cp_info)
-
-instance copy Selection
-where
- copy (DictionarySelection record selectors expr_ptr index_expr) cp_info
- # (index_expr, cp_info) = copy index_expr cp_info
- (selectors, cp_info) = copy selectors cp_info
- (record, cp_info) = copy record cp_info
- = (DictionarySelection record selectors expr_ptr index_expr, cp_info)
- copy (ArraySelection selector expr_ptr index_expr) cp_info
- # (index_expr, cp_info) = copy index_expr cp_info
- = (ArraySelection selector expr_ptr index_expr, cp_info)
- copy selector cp_info
- = (selector, cp_info)
-
-instance copy Case
-where
- copy this_case=:{case_expr, case_guards, case_default} cp_info
- # ((case_expr,(case_guards,case_default)), cp_info) = copy (case_expr,(case_guards,case_default)) cp_info
- = ({ this_case & case_expr = case_expr, case_guards = case_guards, case_default = case_default}, cp_info)
-
-instance copy CasePatterns
-where
- copy (AlgebraicPatterns type patterns) cp_info
- # (patterns, cp_info) = copy patterns cp_info
- = (AlgebraicPatterns type patterns, cp_info)
- copy (BasicPatterns type patterns) cp_info
- # (patterns, cp_info) = copy patterns cp_info
- = (BasicPatterns type patterns, cp_info)
-
-instance copy AlgebraicPattern
-where
- copy pattern=:{ap_vars,ap_expr} cp_info=:{cp_var_heap}
- # (ap_expr, cp_info) = copy ap_expr { cp_info & cp_var_heap = foldSt (\{fv_info_ptr} -> writePtr fv_info_ptr VI_LocalVar) ap_vars cp_var_heap}
- = ({ pattern & ap_expr = ap_expr }, cp_info)
-
-instance copy BasicPattern
-where
- copy pattern=:{bp_expr} cp_info
- # (bp_expr, cp_info) = copy bp_expr cp_info
- = ({ pattern & bp_expr = bp_expr }, cp_info)
-
-instance copy [a] | copy a
-where
- copy l cp_info = mapSt copy l cp_info
-
-instance copy (a,b) | copy a & copy b
-where
- copy t cp_info = app2St (copy, copy) t cp_info
-
-instance copy LetBind
-where
- copy bind=:{lb_src} cp_info
- # (lb_src, cp_info) = copy lb_src cp_info
- = ({ bind & lb_src = lb_src }, cp_info)
-
-instance copy (Bind a b) | copy a
-where
- copy bind=:{bind_src} cp_info
- # (bind_src, cp_info) = copy bind_src cp_info
- = ({ bind & bind_src = bind_src }, cp_info)
/*
@@ -763,7 +100,16 @@ where
, rc_expr_heap :: !.ExpressionHeap
, rc_main_dcl_module_n :: !Int
}
-
+
+checkImportedSymbol symb_kind symb_type_ptr (collected_imports, var_heap)
+ #! type_info = sreadPtr symb_type_ptr var_heap
+ = case type_info of
+ VI_Used
+ -> (collected_imports, var_heap)
+ _
+ -> ([symb_kind : collected_imports ], var_heap <:= (symb_type_ptr, VI_Used))
+
+
weightedRefCountOfVariable depth var_info_ptr lvi=:{lvi_count,lvi_var,lvi_depth,lvi_previous,lvi_new} ref_count new_vars
| lvi_depth < depth
@@ -915,17 +261,6 @@ weightedRefCountOfCase dcl_functions common_defs depth this_case=:{case_expr, ca
= { rc_info & rc_var_heap = rc_var_heap, rc_free_vars = rc_free_vars }
// ---> ("weightedRefCountOfCase 2", ptrToInt case_info_ptr, case_expr)
-checkRecordSelector common_defs {glob_module, glob_object={ds_index}} rc_info=:{rc_imports,rc_var_heap}
- | glob_module <> rc_info.rc_main_dcl_module_n
- # {com_selector_defs,com_cons_defs,com_type_defs} = common_defs.[glob_module]
- {sd_type_index} = com_selector_defs.[ds_index]
- {td_rhs = RecordType {rt_constructor={ds_index=cons_index}, rt_fields}} = com_type_defs.[sd_type_index]
- {cons_type_ptr} = com_cons_defs.[cons_index]
- (rc_imports, rc_var_heap) = checkImportedSymbol (SK_Constructor {glob_module = glob_module, glob_object = cons_index})
- cons_type_ptr (rc_imports, rc_var_heap)
- = { rc_info & rc_imports = rc_imports, rc_var_heap = rc_var_heap }
- = rc_info
-
instance weightedRefCount Selection
where
weightedRefCount dcl_functions common_defs depth (ArraySelection {glob_module,glob_object={ds_index}} _ index_expr) rc_info
@@ -968,7 +303,6 @@ where
-> (collected_vars, var_heap)
= ([ {cv_variable = var_ptr, cv_count = lvi_count} : collected_vars ], var_heap)
-
/*
Here we examine the appplication to see whether an imported function has been used. If so, the 'ft_type_ptr' is examined. Initially
this pointer contains VI_Empty. After the first occurrence the pointer will be set to 'VI_Used'.
@@ -982,6 +316,18 @@ checkImportOfDclFunction dcl_functions common_defs mod_index fun_index rc_info=:
(rc_imports, rc_var_heap) = checkImportedSymbol (SK_Function {glob_module=mod_index,glob_object=fun_index}) ft_type_ptr (rc_imports, rc_var_heap)
= { rc_info & rc_imports = rc_imports, rc_var_heap = rc_var_heap }
= rc_info
+checkRecordSelector common_defs {glob_module, glob_object={ds_index}} rc_info=:{rc_imports,rc_var_heap}
+ | glob_module <> rc_info.rc_main_dcl_module_n
+ # {com_selector_defs,com_cons_defs,com_type_defs} = common_defs.[glob_module]
+ {sd_type_index} = com_selector_defs.[ds_index]
+ {td_rhs = RecordType {rt_constructor={ds_index=cons_index}, rt_fields}} = com_type_defs.[sd_type_index]
+ {cons_type_ptr} = com_cons_defs.[cons_index]
+ (rc_imports, rc_var_heap) = checkImportedSymbol (SK_Constructor {glob_module = glob_module, glob_object = cons_index})
+ cons_type_ptr (rc_imports, rc_var_heap)
+ = { rc_info & rc_imports = rc_imports, rc_var_heap = rc_var_heap }
+ = rc_info
+
+
instance weightedRefCount App
where
@@ -1024,25 +370,19 @@ where
weightedRefCount dcl_functions common_defs depth bind=:{bind_src} rc_info
= weightedRefCount dcl_functions common_defs depth bind_src rc_info
-checkImportedSymbol symb_kind symb_type_ptr (collected_imports, var_heap)
- #! type_info = sreadPtr symb_type_ptr var_heap
- = case type_info of
- VI_Used
- -> (collected_imports, var_heap)
- _
- -> ([symb_kind : collected_imports ], var_heap <:= (symb_type_ptr, VI_Used))
-:: DistributeInfo =
- { di_lets :: ![VarInfoPtr]
- , di_var_heap :: !.VarHeap
- , di_expr_heap :: !.ExpressionHeap
- }
/*
distributeLets tries to move shared expressions as close as possible to the location at which they are used.
Case-expressions may require unsharing if the shared expression is used in different alternatives. Of course
only if the expression is neither used in the pattern nor in a surrounding expression.
*/
+:: DistributeInfo =
+ { di_lets :: ![VarInfoPtr]
+ , di_var_heap :: !.VarHeap
+ , di_expr_heap :: !.ExpressionHeap
+ }
+
class distributeLets e :: !Int !e !*DistributeInfo -> (!e, !*DistributeInfo)
@@ -1300,7 +640,668 @@ where
distributeLets depth bind=:{bind_src} cp_info
# (bind_src, cp_info) = distributeLets depth bind_src cp_info
= ({ bind & bind_src = bind_src }, cp_info)
+
+newFunction :: !(Optional Ident) !FunctionBody ![FreeVar] ![AType] !AType !Int !(!Int, ![FunctionInfoPtr],!*FunctionHeap)
+ -> (! SymbIdent, !(!Int, ![FunctionInfoPtr],!*FunctionHeap))
+newFunction opt_id fun_bodies local_vars arg_types result_type group_index (cs_next_fun_nr, cs_new_functions, cs_fun_heap)
+ # (fun_def_ptr, cs_fun_heap) = newPtr FI_Empty cs_fun_heap
+ fun_id = getIdent opt_id cs_next_fun_nr
+ arity = length arg_types
+ fun_type =
+ { st_vars = []
+ , st_args = arg_types
+ , st_arity = arity
+ , st_result = result_type
+ , st_context = []
+ , st_attr_vars = []
+ , st_attr_env = []
+ }
+
+ fun_def =
+ { fun_symb = fun_id
+ , fun_arity = arity
+ , fun_priority = NoPrio
+ , fun_body = fun_bodies
+ , fun_type = Yes fun_type
+ , fun_pos = NoPos
+ , fun_index = NoIndex
+ , fun_kind = FK_ImpFunction cNameNotLocationDependent
+ , fun_lifted = 0
+ , fun_info = { EmptyFunInfo & fi_group_index = group_index, fi_local_vars = local_vars }
+ }
+ = ({ symb_name = fun_id, symb_kind = SK_GeneratedFunction fun_def_ptr cs_next_fun_nr, symb_arity = arity },
+ (inc cs_next_fun_nr, [fun_def_ptr : cs_new_functions],
+ cs_fun_heap <:= (fun_def_ptr, FI_Function { gf_fun_def = fun_def, gf_instance_info = II_Empty,
+ gf_fun_index = cs_next_fun_nr, gf_cons_args = {cc_size=0, cc_args = [], cc_linear_bits = []} })))
+
+addNewFunctionsToGroups :: !{#.CommonDefs} FunctionHeap ![FunctionInfoPtr] !Int !*{! Group} !*{#{# CheckedTypeDef}} !ImportedFunctions !*TypeHeaps !*VarHeap
+ -> (!*{! Group}, ![FunDef], !*{#{# CheckedTypeDef}}, !ImportedConstructors, !*TypeHeaps, !*VarHeap)
+addNewFunctionsToGroups common_defs fun_heap new_functions main_dcl_module_n groups imported_types imported_conses type_heaps var_heap
+ = foldSt (add_new_function_to_group fun_heap common_defs) new_functions (groups, [], imported_types, imported_conses, type_heaps, var_heap)
+where
+
+ add_new_function_to_group :: !FunctionHeap !{# CommonDefs} !FunctionInfoPtr
+ !(!*{! Group}, ![FunDef], !*{#{# CheckedTypeDef}}, !ImportedConstructors, !*TypeHeaps, !*VarHeap)
+ -> (!*{! Group}, ![FunDef], !*{#{# CheckedTypeDef}}, !ImportedConstructors, !*TypeHeaps, !*VarHeap)
+ add_new_function_to_group fun_heap common_defs fun_ptr (groups, fun_defs, imported_types, imported_conses, type_heaps, var_heap)
+ # (FI_Function {gf_fun_def,gf_fun_index}) = sreadPtr fun_ptr fun_heap
+ {fun_type = Yes ft, fun_info = {fi_group_index, fi_properties}} = gf_fun_def
+ (Yes ft) = gf_fun_def.fun_type
+ (ft, imported_types, imported_conses, type_heaps, var_heap)
+ = convertSymbolType (fi_properties bitand FI_HasTypeSpec == 0) common_defs ft main_dcl_module_n
+ imported_types imported_conses type_heaps var_heap
+ # (group, groups) = groups![fi_group_index]
+ = ({ groups & [fi_group_index] = { group & group_members = [gf_fun_index : group.group_members]} },
+ [ { gf_fun_def & fun_type = Yes ft }: fun_defs], imported_types, imported_conses, type_heaps, var_heap)
+
+
+:: ConvertInfo =
+ { ci_bound_vars :: ![(FreeVar, AType)]
+ , ci_group_index :: !Index
+ , ci_common_defs :: !{#CommonDefs}
+ }
+
+:: ConvertState =
+ { cs_new_functions :: ![FunctionInfoPtr]
+ , cs_fun_heap :: !.FunctionHeap
+ , cs_var_heap :: !.VarHeap
+ , cs_expr_heap :: !.ExpressionHeap
+ , cs_next_fun_nr :: !Index
+ }
+
+
+
+convertRootExpression ci default_ptr (Let lad=:{let_strict_binds,let_lazy_binds,let_expr,let_info_ptr}) cs=:{cs_expr_heap}
+ # (EI_LetType let_type, cs_expr_heap) = readPtr let_info_ptr cs_expr_heap
+ bound_vars = addLetVars (let_strict_binds ++ let_lazy_binds) let_type ci.ci_bound_vars
+ ci = {ci & ci_bound_vars=bound_vars}
+ (let_strict_binds, cs) = convertCases ci let_strict_binds { cs & cs_expr_heap = cs_expr_heap }
+ (let_lazy_binds, cs) = convertCases ci let_lazy_binds cs
+ (let_expr, cs) = convertRootExpression ci default_ptr let_expr cs
+ = (Let { lad & let_strict_binds = let_strict_binds, let_lazy_binds = let_lazy_binds, let_expr = let_expr }, cs)
+convertRootExpression ci default_ptr (Case kees=:{case_expr, case_guards, case_default, case_info_ptr}) cs
+ = case case_guards of
+ BasicPatterns BT_Bool patterns
+ -> convert_boolean_case_into_guard ci default_ptr case_expr patterns case_default case_info_ptr cs
+ _
+ -> convertCasesInCaseExpression ci default_ptr kees cs
+
+where
+
+// convert_boolean_case_into_guard bound_vars group_index common_defs default_ptr guard [ alt : alts ] case_default case_info_ptr cs
+ convert_boolean_case_into_guard ci has_default guard [ alt=:{bp_value=BVB sign_of_then_part,bp_expr} : alts ] case_default case_info_ptr cs
+ # (guard, cs) = convertRootExpression ci cHasNoDefault guard cs
+ # (EI_CaseTypeAndRefCounts case_type _, cs_expr_heap) = readPtr case_info_ptr cs.cs_expr_heap
+ # (default_ptr, cs_expr_heap) = makePtrToDefault case_default case_type.ct_result_type has_default cs_expr_heap
+ # (then_part, cs) = convertRootExpression ci default_ptr bp_expr {cs &cs_expr_heap=cs_expr_heap}
+ # (opt_else_part, cs) = convert_to_else_part ci default_ptr sign_of_then_part alts case_default cs
+// = (Conditional { if_cond = { con_positive = sign_of_then_part, con_expression = guard }, if_then = then_part, if_else = opt_else_part }, cs)
+ = (build_conditional sign_of_then_part guard then_part opt_else_part, cs)
+ where
+ build_conditional True guard then_expr opt_else_expr
+ = Conditional { if_cond = guard, if_then = then_expr, if_else = opt_else_expr }
+ build_conditional false guard then_expr (Yes else_expr)
+ = Conditional { if_cond = guard, if_then = else_expr, if_else = Yes then_expr }
+ build_conditional false guard then_expr No
+ = Conditional { if_cond = Conditional { if_cond = guard, if_then = BasicExpr (BVB False) BT_Bool, if_else = Yes (BasicExpr (BVB True) BT_Bool) },
+ if_then = then_expr, if_else = No }
+
+ convert_to_else_part ci default_ptr sign_of_then_part [ alt=:{bp_value=BVB sign_of_else_part,bp_expr} : alts ] case_default cs
+ # (else_part, cs) = convertRootExpression ci default_ptr bp_expr cs
+ | sign_of_then_part == sign_of_else_part
+ = convert_to_else_part ci default_ptr sign_of_then_part alts case_default cs
+ = (Yes else_part, cs)
+ convert_to_else_part ci default_ptr sign_of_then_part [ ] (Yes else_part) cs
+ # (else_part, cs) = convertRootExpression ci has_default else_part cs
+ = (Yes else_part, cs)
+ convert_to_else_part ci default_ptr sign_of_then_part [ ] No cs
+ = (No, cs)
+
+convertRootExpression ci _ expr cs
+ = convertCases ci expr cs
+
+class convertCases a :: !ConvertInfo !a !*ConvertState -> (!a, !*ConvertState)
+
+instance convertCases [a] | convertCases a
+where
+ convertCases ci l cs = mapSt (convertCases ci) l cs
+
+instance convertCases (a,b) | convertCases a & convertCases b
+where
+ convertCases ci t cs
+ = app2St (convertCases ci, convertCases ci) t cs
+
+instance convertCases LetBind
+where
+ convertCases ci bind=:{lb_src} cs
+ # (lb_src, cs) = convertCases ci lb_src cs
+ = ({ bind & lb_src = lb_src }, cs)
+
+instance convertCases (Bind a b) | convertCases a
+where
+ convertCases ci bind=:{bind_src} cs
+ # (bind_src, cs) = convertCases ci bind_src cs
+ = ({ bind & bind_src = bind_src }, cs)
+
+instance convertCases Let
+where
+ convertCases ci lad=:{let_strict_binds,let_lazy_binds,let_expr,let_info_ptr} cs=:{cs_expr_heap}
+ # (let_info, cs_expr_heap) = readPtr let_info_ptr cs_expr_heap
+ cs = { cs & cs_expr_heap = cs_expr_heap }
+ = case let_info of
+ EI_LetType let_type
+ # ci = {ci & ci_bound_vars=addLetVars (let_strict_binds ++ let_lazy_binds) let_type ci.ci_bound_vars}
+ # (let_strict_binds, cs) = convertCases ci let_strict_binds cs
+ # (let_lazy_binds, cs) = convertCases ci let_lazy_binds cs
+ # (let_expr, cs) = convertCases ci let_expr cs
+ -> ({ lad & let_strict_binds = let_strict_binds, let_lazy_binds = let_lazy_binds, let_expr = let_expr }, cs)
+ _
+ -> abort "convertCases [Let] (convertcases 53)" // <<- let_info
+
+instance convertCases Expression
+where
+ convertCases ci (App app=:{app_args}) cs
+ # (app_args, cs) = convertCases ci app_args cs
+ = (App {app & app_args = app_args}, cs)
+ convertCases ci (fun_expr @ exprs) cs
+ # ((fun_expr, exprs), cs) = convertCases ci (fun_expr, exprs) cs
+ = (fun_expr @ exprs, cs)
+ convertCases ci (Let lad) cs
+ # (lad, cs) = convertCases ci lad cs
+ = (Let lad, cs)
+ convertCases ci (MatchExpr opt_tuple constructor expr) cs
+ # (expr, cs) = convertCases ci expr cs
+ = (MatchExpr opt_tuple constructor expr, cs)
+ convertCases ci (Selection is_unique expr selectors) cs
+ # (expr, cs) = convertCases ci expr cs
+ (selectors, cs) = convertCases ci selectors cs
+ = (Selection is_unique expr selectors, cs)
+ convertCases ci (Update expr1 selectors expr2) cs
+ # (expr1, cs) = convertCases ci expr1 cs
+ (selectors, cs) = convertCases ci selectors cs
+ (expr2, cs) = convertCases ci expr2 cs
+ = (Update expr1 selectors expr2, cs)
+ convertCases ci (RecordUpdate cons_symbol expression expressions) cs
+ # (expression, cs) = convertCases ci expression cs
+ (expressions, cs) = convertCases ci expressions cs
+ = (RecordUpdate cons_symbol expression expressions, cs)
+ convertCases ci (TupleSelect tuple_symbol arg_nr expr) cs
+ # (expr, cs) = convertCases ci expr cs
+ = (TupleSelect tuple_symbol arg_nr expr, cs)
+ convertCases ci (Case case_expr) cs
+ = convertCasesInCaseExpression ci cHasNoDefault case_expr cs
+ convertCases ci expr cs
+ = (expr, cs)
+
+instance convertCases Selection
+where
+ convertCases ci (DictionarySelection record selectors expr_ptr index_expr) cs
+ # (index_expr, cs) = convertCases ci index_expr cs
+ (selectors, cs) = convertCases ci selectors cs
+ = (DictionarySelection record selectors expr_ptr index_expr, cs)
+ convertCases ci (ArraySelection selector expr_ptr index_expr) cs
+ # (index_expr, cs) = convertCases ci index_expr cs
+ = (ArraySelection selector expr_ptr index_expr, cs)
+ convertCases ci selector cs
+ = (selector, cs)
+
+cHasNoDefault :== nilPtr
+
+convertDefaultToExpression default_ptr (EI_Default expr type prev_default) ci cs=:{cs_var_heap}
+ # cs_var_heap = foldSt (\({fv_info_ptr}, type) -> writePtr fv_info_ptr (VI_BoundVar type)) ci.ci_bound_vars cs_var_heap
+ (expression, {cp_free_vars, cp_var_heap, cp_local_vars}) = copy expr { cp_free_vars = [], cp_var_heap = cs_var_heap, cp_local_vars = [] }
+ (act_args, free_typed_vars, cs_var_heap) = foldSt retrieveVariable cp_free_vars ([], [], cp_var_heap)
+ (fun_symb, cs) = new_default_function free_typed_vars cp_local_vars expression type prev_default ci.ci_group_index ci.ci_common_defs { cs & cs_var_heap = cs_var_heap }
+ = (App { app_symb = fun_symb, app_args = act_args, app_info_ptr = nilPtr },
+ { cs & cs_expr_heap = cs.cs_expr_heap <:= (default_ptr, EI_DefaultFunction fun_symb act_args)})
+where
+ new_default_function free_vars local_vars rhs_expr result_type prev_default group_index common_defs cs
+ # (guarded_exprs, cs) = convertPatternExpression [] [free_vars] group_index common_defs prev_default rhs_expr cs
+ fun_bodies = map build_pattern guarded_exprs
+ arg_types = map (\(_,type) -> type) free_vars
+ (fun_symb, (cs_next_fun_nr, cs_new_functions, cs_fun_heap))
+ = newFunction No (BackendBody fun_bodies) local_vars arg_types result_type group_index
+ (cs.cs_next_fun_nr, cs.cs_new_functions, cs.cs_fun_heap)
+ = (fun_symb, { cs & cs_fun_heap = cs_fun_heap, cs_next_fun_nr = cs_next_fun_nr, cs_new_functions = cs_new_functions })
+
+ build_pattern ([ right_patterns : _ ], bb_rhs)
+ = { bb_args = right_patterns, bb_rhs = bb_rhs }
+
+convertDefaultToExpression default_ptr (EI_DefaultFunction fun_symb act_args) ci cs
+ = (App { app_symb = fun_symb, app_args = act_args, app_info_ptr = nilPtr }, cs)
+
+combineDefaults default_ptr guards No ci cs=:{cs_expr_heap}
+ | isNilPtr default_ptr
+ = (No, cs)
+ | case_is_partial guards ci.ci_common_defs
+ # (default_info, cs_expr_heap) = readPtr default_ptr cs_expr_heap
+ (default_expr, cs) = convertDefaultToExpression default_ptr default_info ci { cs & cs_expr_heap = cs_expr_heap }
+ = (Yes default_expr, cs)
+ = (No, cs)
+where
+ case_is_partial (AlgebraicPatterns {glob_module, glob_object} patterns) common_defs
+ # {td_rhs} = common_defs.[glob_module].com_type_defs.[glob_object]
+ = length patterns < nr_of_alternatives td_rhs || has_partial_pattern patterns
+ where
+ nr_of_alternatives (AlgType conses)
+ = length conses
+ nr_of_alternatives _
+ = 1
+
+ has_partial_pattern []
+ = False
+ has_partial_pattern [{ap_expr} : patterns]
+ = is_partial_expression ap_expr common_defs || has_partial_pattern patterns
+ case_is_partial (BasicPatterns BT_Bool bool_patterns) common_defs
+ = length bool_patterns < 2 || has_partial_basic_pattern bool_patterns
+ where
+ has_partial_basic_pattern []
+ = False
+ has_partial_basic_pattern [{bp_expr} : patterns]
+ = is_partial_expression bp_expr common_defs || has_partial_basic_pattern patterns
+ case_is_partial patterns common_defs
+ = True
+
+ is_partial_expression (Case {case_guards,case_default=No}) common_defs
+ = case_is_partial case_guards common_defs
+ is_partial_expression (Case {case_guards,case_default=Yes case_default}) common_defs
+ = is_partial_expression case_default common_defs && case_is_partial case_guards common_defs
+ is_partial_expression (Let {let_expr}) common_defs
+ = is_partial_expression let_expr common_defs
+ is_partial_expression _ _
+ = False
+
+combineDefaults default_ptr guards this_default ci cs
+ = (this_default, cs)
+
+
+convertCasesInCaseExpression ci default_ptr { case_expr, case_guards, case_default, case_ident, case_info_ptr} cs
+ # (case_default, cs) = combineDefaults default_ptr case_guards case_default ci cs
+ (case_expr, cs) = convertCases ci case_expr cs
+ (EI_CaseTypeAndRefCounts case_type ref_counts, cs_expr_heap) = readPtr case_info_ptr cs.cs_expr_heap
+ (act_vars, form_vars, opt_free_var, local_vars, (case_guards, case_default), cs_var_heap)
+ = copy_case_expression ci.ci_bound_vars (get_variable case_expr case_type.ct_pattern_type) (case_guards,case_default) cs.cs_var_heap
+ (fun_symb, cs) = new_case_function case_ident case_guards case_default case_type opt_free_var form_vars local_vars
+ ci.ci_group_index ci.ci_common_defs default_ptr { cs & cs_var_heap = cs_var_heap, cs_expr_heap = cs_expr_heap }
+ = (App { app_symb = fun_symb, app_args = [ case_expr : act_vars ], app_info_ptr = nilPtr }, cs)
+where
+ get_variable (Var var) pattern_type
+ = Yes (var, pattern_type)
+ get_variable _ _
+ = No
+
+ copy_case_expression bound_vars opt_variable guards_and_default var_heap
+ # var_heap = foldSt (\({fv_name,fv_info_ptr},type) -> writePtr fv_info_ptr (VI_BoundVar type)) bound_vars var_heap
+ (opt_copied_var, var_heap) = copy_variable opt_variable var_heap
+ (expression, {cp_free_vars, cp_var_heap, cp_local_vars}) = copy guards_and_default { cp_free_vars = [], cp_var_heap = var_heap, cp_local_vars = [] }
+ (bound_vars, free_typed_vars, var_heap) = foldSt retrieveVariable cp_free_vars ([], [], cp_var_heap)
+ (opt_free_var, var_heap) = toOptionalFreeVar opt_copied_var var_heap
+ = (bound_vars, free_typed_vars, opt_free_var, cp_local_vars, expression, var_heap)
+
+ copy_variable (Yes (var=:{var_name,var_info_ptr}, var_type)) var_heap
+ # (new_info, var_heap) = newPtr VI_Empty var_heap
+ = (Yes (var_info_ptr, var_type), var_heap <:= (var_info_ptr, VI_FreeVar var_name new_info 0 var_type))
+ copy_variable No var_heap
+ = (No, var_heap)
+
+ new_case_function opt_id patterns case_default {ct_result_type,ct_pattern_type,ct_cons_types} opt_var free_vars local_vars
+ group_index common_defs prev_default cs=:{cs_expr_heap}
+ # (default_ptr, cs_expr_heap) = makePtrToDefault case_default ct_result_type prev_default cs_expr_heap
+ (fun_bodies, cs) = convertPatterns patterns ct_cons_types opt_var [] free_vars default_ptr group_index common_defs { cs & cs_expr_heap = cs_expr_heap }
+ (fun_bodies, cs) = convertDefault default_ptr opt_var [] free_vars group_index common_defs (fun_bodies, cs)
+ (fun_symb, (cs_next_fun_nr, cs_new_functions, cs_fun_heap))
+ = newFunction opt_id (BackendBody fun_bodies) local_vars [ct_pattern_type : [ type \\ (_, type) <- free_vars]] ct_result_type group_index
+ (cs.cs_next_fun_nr, cs.cs_new_functions, cs.cs_fun_heap)
+ = (fun_symb, { cs & cs_fun_heap = cs_fun_heap, cs_next_fun_nr = cs_next_fun_nr, cs_new_functions = cs_new_functions })
+
+makePtrToDefault (Yes default_expr) type prev_default_ptr expr_heap
+ = newPtr (EI_Default default_expr type prev_default_ptr) expr_heap
+makePtrToDefault No type prev_default_ptr expr_heap
+ = (cHasNoDefault, expr_heap)
+
+convertDefault default_ptr opt_var left_vars right_vars group_index common_defs (fun_bodies, cs)
+ | isNilPtr default_ptr
+ = (fun_bodies, cs)
+ # (default_info, cs_expr_heap) = readPtr default_ptr cs.cs_expr_heap
+ = convert_default default_info opt_var left_vars right_vars group_index common_defs (fun_bodies, { cs & cs_expr_heap = cs_expr_heap})
+where
+ convert_default (EI_Default default_expr type prev_default) opt_var left_vars right_vars group_index common_defs (fun_bodies, cs)
+ # (bb_rhs, cs) = convertRootExpression {ci_bound_vars=left_vars ++ consOptional opt_var right_vars, ci_group_index=group_index, ci_common_defs=common_defs} prev_default default_expr cs
+ bb_args = build_args opt_var left_vars right_vars
+ = (fun_bodies ++ [{ bb_args = bb_args, bb_rhs = bb_rhs }], cs)
+ convert_default (EI_DefaultFunction fun_symb act_args) opt_var left_vars right_vars group_index common_defs (fun_bodies, cs)
+ # bb_args = build_args opt_var left_vars right_vars
+ bb_rhs = App { app_symb = fun_symb, app_args = act_args, app_info_ptr = nilPtr }
+ = (fun_bodies ++ [{ bb_args = bb_args, bb_rhs = bb_rhs }], cs)
+
+ build_args (Yes (var,type)) left_vars right_vars
+ = mapAppend typed_free_var_to_pattern left_vars [FP_Variable var : map typed_free_var_to_pattern right_vars]
+ build_args No left_vars right_vars
+ = mapAppend typed_free_var_to_pattern left_vars [FP_Empty : map typed_free_var_to_pattern right_vars]
+
+ typed_free_var_to_pattern (free_var, type) = FP_Variable free_var
+
+
+consOptional (Yes x) xs = [x : xs]
+consOptional No xs = xs
+
+getOptionalFreeVar (Yes (free_var,_)) = Yes free_var
+getOptionalFreeVar No = No
+
+optionalToListofLists (Yes x)
+ = [[x]]
+optionalToListofLists No
+ = []
+
+hasOption (Yes _) = True
+hasOption No = False
+
+convertPatterns :: CasePatterns [[AType]] (Optional (FreeVar,AType)) [.(FreeVar,AType)] [(FreeVar,AType)] (Ptr ExprInfo) Index {#CommonDefs} *ConvertState -> *(!.[BackendBody],!*ConvertState);
+convertPatterns (AlgebraicPatterns algtype patterns) cons_types opt_var left_vars right_vars default_ptr group_index common_defs cs
+ # (guarded_exprs_list, cs) = mapSt (convert_algebraic_guard_into_function_pattern opt_var left_vars right_vars
+ group_index common_defs default_ptr) (exactZip patterns cons_types) cs
+ = (flatten guarded_exprs_list, cs)
+where
+ convert_algebraic_guard_into_function_pattern opt_var left_vars right_vars group_index common_defs default_ptr ({ap_symbol, ap_vars, ap_expr}, cons_arg_types) cs
+ # pattern_vars = exactZip ap_vars cons_arg_types
+ (guarded_exprs, cs)
+ = convertPatternExpression (consOptional opt_var left_vars) [pattern_vars, right_vars] group_index common_defs default_ptr ap_expr cs
+ = (map (complete_pattern left_vars ap_symbol (getOptionalFreeVar opt_var)) guarded_exprs, cs)
+ where
+ complete_pattern left_vars cons_symbol optional_var ([ pattern_args, right_patterns : _ ], bb_rhs)
+ # bb_args = mapAppend selectFreeVar left_vars [FP_Algebraic cons_symbol pattern_args optional_var : right_patterns ]
+ = { bb_args = bb_args, bb_rhs = bb_rhs }
+convertPatterns (BasicPatterns bastype patterns) cons_types opt_var left_vars right_vars default_ptr group_index common_defs cs
+ # (guarded_exprs_list, cs) = mapSt (convert_basic_guard_into_function_pattern opt_var left_vars right_vars
+ group_index common_defs default_ptr) patterns cs
+ = (flatten guarded_exprs_list, cs)
+where
+ convert_basic_guard_into_function_pattern opt_var left_vars right_vars group_index common_defs default_ptr {bp_value, bp_expr} cs
+ # (guarded_exprs, cs)
+ = convertPatternExpression (consOptional opt_var left_vars) [right_vars] group_index common_defs default_ptr bp_expr cs
+ = (map (complete_pattern left_vars bp_value (getOptionalFreeVar opt_var)) guarded_exprs, cs)
+ where
+ complete_pattern left_vars value optional_var ([ right_patterns : _ ], bb_rhs)
+ # bb_args = mapAppend selectFreeVar left_vars [FP_Basic value optional_var : right_patterns ]
+ = { bb_args = bb_args, bb_rhs = bb_rhs }
+
+convertPatternExpression :: ![(FreeVar,AType)] ![[(FreeVar,AType)]] !Index !{#CommonDefs} !ExprInfoPtr !Expression !*ConvertState
+ -> *(![([[FunctionPattern]], !Expression)], !*ConvertState)
+convertPatternExpression left_vars right_vars group_index common_defs default_ptr
+ case_expr=:(Case {case_expr = Var var=:{var_info_ptr}, case_guards, case_default, case_info_ptr}) cs
+ | list_contains_variable var_info_ptr right_vars
+ = case case_guards of
+ BasicPatterns type basic_patterns
+ # split_result = split_list_of_vars var_info_ptr [] right_vars
+ (default_patterns, cs) = convert_default left_vars split_result group_index common_defs case_default cs
+ (guarded_exprs, cs) = mapSt (convert_basic_guard_into_function_pattern left_vars split_result group_index common_defs) basic_patterns cs
+ -> (flatten guarded_exprs ++ default_patterns, cs)
+ AlgebraicPatterns type algebraic_patterns
+ # (EI_CaseTypeAndRefCounts {ct_cons_types} _, cs_expr_heap) = readPtr case_info_ptr cs.cs_expr_heap
+ split_result = split_list_of_vars var_info_ptr [] right_vars
+ (default_patterns, cs) = convert_default left_vars split_result group_index common_defs case_default { cs & cs_expr_heap = cs_expr_heap }
+ (guarded_exprs, cs) = mapSt (convert_algebraic_guard_into_function_pattern left_vars split_result group_index common_defs case_info_ptr)
+ (exactZip algebraic_patterns ct_cons_types) cs
+ -> (flatten guarded_exprs ++ default_patterns, cs)
+ _
+ -> convertToRhsExpression left_vars right_vars group_index common_defs default_ptr case_expr cs
+ = convertToRhsExpression left_vars right_vars group_index common_defs default_ptr case_expr cs
+where
+ list_contains_variable var_info_ptr []
+ = False
+ list_contains_variable var_info_ptr [ right_vars : list_of_right_vars ]
+ = contains_variable var_info_ptr right_vars || list_contains_variable var_info_ptr list_of_right_vars
+ where
+ contains_variable var_info_ptr []
+ = False
+ contains_variable var_info_ptr [ ({fv_info_ptr},_) : right_vars ]
+ = var_info_ptr == fv_info_ptr || contains_variable var_info_ptr right_vars
+
+ convert_default left_vars ((fv,fv_type), list_of_left, list_of_right) group_index common_defs (Yes default_expr) cs
+ # (guarded_exprs, cs)
+ = convertPatternExpression (left_vars ++ [ (fv,fv_type) : flatten list_of_left ]) list_of_right group_index common_defs default_ptr default_expr cs
+ = (map (complete_pattern list_of_left fv) guarded_exprs, cs)
+ where
+ complete_pattern list_of_left this_var (list_of_patterns, expr)
+ = (complete_patterns list_of_left (FP_Variable this_var) list_of_patterns, expr)
+ convert_default left_vars ((fv,fv_type), list_of_left, list_of_right) group_index common_defs No cs
+ = ([], cs)
+
+ convert_basic_guard_into_function_pattern left_vars ((fv,fv_type), list_of_left, list_of_right) group_index common_defs {bp_value, bp_expr} cs
+ # (guarded_exprs, cs)
+ = convertPatternExpression (left_vars ++ [ (fv,fv_type) : flatten list_of_left ]) list_of_right group_index common_defs default_ptr bp_expr cs
+ = (map (complete_pattern list_of_left bp_value (Yes fv)) guarded_exprs, cs)
+ where
+ complete_pattern list_of_left value opt_var (list_of_patterns, expr)
+ = (complete_patterns list_of_left (FP_Basic value opt_var) list_of_patterns, expr)
+
+ convert_algebraic_guard_into_function_pattern left_vars ((fv,fv_type), list_of_left, list_of_right) group_index common_defs case_info_ptr
+ ({ap_symbol, ap_vars, ap_expr}, arg_types) cs=:{cs_expr_heap}
+ # (guarded_exprs, cs)
+ = convertPatternExpression (left_vars ++ [ (fv,fv_type) : flatten list_of_left ]) [ exactZip ap_vars arg_types : list_of_right ]
+ group_index common_defs default_ptr ap_expr { cs & cs_expr_heap = cs_expr_heap }
+ = (map (complete_pattern list_of_left ap_symbol (Yes fv)) guarded_exprs, cs)
+ where
+ complete_pattern :: ![[(FreeVar,a)]] !(Global DefinedSymbol) !(Optional !FreeVar) !([[FunctionPattern]], !b) -> (![[FunctionPattern]], !b)
+ complete_pattern list_of_left cons_symbol opt_var ([ patterns : list_of_patterns], expr)
+ = (complete_patterns list_of_left (FP_Algebraic cons_symbol patterns opt_var) list_of_patterns, expr)
+
+ split_list_of_vars var_info_ptr list_of_left [ vars : list_of_vars ]
+ # (fv, left, list_of_left, list_of_right) = split_vars var_info_ptr [] list_of_left vars list_of_vars
+ = (fv, [left : list_of_left], list_of_right)
+ where
+ split_vars var_info_ptr left list_of_left [] list_of_vars
+ # (fv, list_of_left, list_of_right) = split_list_of_vars var_info_ptr list_of_left list_of_vars
+ = (fv, left, list_of_left, list_of_right)
+
+ split_vars var_info_ptr left list_of_left [ this_var=:(fv,_) : vars ] list_of_vars
+ | var_info_ptr == fv.fv_info_ptr
+ = (this_var, left, list_of_left, [ vars : list_of_vars ])
+ = split_vars var_info_ptr [this_var : left] list_of_left vars list_of_vars
+
+ complete_patterns [ left_args ] current_pattern [ right_args : list_of_right_args ]
+ = [ add_free_vars left_args [current_pattern : right_args] : list_of_right_args ]
+ complete_patterns [ left_args : list_of_left_args ] current_pattern list_of_right_args
+ = [ add_free_vars left_args [] : complete_patterns list_of_left_args current_pattern list_of_right_args ]
+
+ add_free_vars [(fv, _) : left_vars] right_vars
+ = add_free_vars left_vars [ FP_Variable fv : right_vars ]
+ add_free_vars [] right_vars
+ = right_vars
+
+convertPatternExpression left_vars right_vars group_index common_defs default_ptr expr cs
+ = convertToRhsExpression left_vars right_vars group_index common_defs default_ptr expr cs
+
+convertToRhsExpression left_vars right_vars group_index common_defs default_ptr expr cs
+ # (bb_rhs, cs) = convertRootExpression {ci_bound_vars=left_vars ++ flatten right_vars, ci_group_index=group_index, ci_common_defs=common_defs} default_ptr expr cs
+ = ([(map (map selectFreeVar) right_vars, bb_rhs)], cs)
+
+selectFreeVar (fv,_) = FP_Variable fv
+
+toFreeVar (var_info_ptr, _) var_heap
+ #! var_info = sreadPtr var_info_ptr var_heap
+ # (VI_FreeVar name new_ptr count type) = var_info
+ = (FP_Variable { fv_def_level = NotALevel, fv_name = name, fv_info_ptr = new_ptr, fv_count = count}, var_heap)
+
+toOptionalFreeVar (Yes (var_info_ptr, type)) var_heap
+ #! var_info = sreadPtr var_info_ptr var_heap
+ = case var_info of
+ VI_FreeVar name new_ptr count type
+ -> (Yes ({ fv_def_level = NotALevel, fv_name = name, fv_info_ptr = new_ptr, fv_count = count}, type), var_heap)
+ _
+ -> (No, var_heap)
+toOptionalFreeVar No var_heap
+ = (No, var_heap)
+
+:: TypedVariable =
+ { tv_free_var :: !FreeVar
+ , tv_type :: !AType
+ }
+
+copyExpression :: ![TypedVariable] !Expression !*VarHeap -> (![Expression], ![TypedVariable], ![FreeVar], !Expression, !*VarHeap)
+copyExpression bound_vars expression var_heap
+ # var_heap = foldSt (\{tv_free_var={fv_info_ptr},tv_type} -> writePtr fv_info_ptr (VI_BoundVar tv_type)) bound_vars var_heap
+ (expression, {cp_free_vars, cp_var_heap, cp_local_vars}) = copy expression { cp_free_vars = [], cp_var_heap = var_heap, cp_local_vars = [] }
+ (bound_vars, free_typed_vars, var_heap) = foldSt retrieve_variable cp_free_vars ([], [], cp_var_heap)
+ = (bound_vars, free_typed_vars, cp_local_vars, expression, var_heap)
+where
+ retrieve_variable (var_info_ptr, type) (bound_vars, free_typed_vars, var_heap)
+ # (VI_FreeVar name new_ptr count type, var_heap) = readPtr var_info_ptr var_heap
+ = ( [Var { var_name = name, var_info_ptr = var_info_ptr, var_expr_ptr = nilPtr} : bound_vars],
+ [{tv_free_var = { fv_def_level = NotALevel, fv_name = name, fv_info_ptr = new_ptr, fv_count = count }, tv_type = type} : free_typed_vars], var_heap)
+
+retrieveVariable (var_info_ptr, type) (bound_vars, free_typed_vars, var_heap)
+ # (VI_FreeVar name new_ptr count type, var_heap) = readPtr var_info_ptr var_heap
+ = ( [Var { var_name = name, var_info_ptr = var_info_ptr, var_expr_ptr = nilPtr} : bound_vars],
+ [({ fv_def_level = NotALevel, fv_name = name, fv_info_ptr = new_ptr, fv_count = count }, type) : free_typed_vars], var_heap)
+
+:: CopyInfo =
+ { cp_free_vars :: ![(VarInfoPtr,AType)]
+ , cp_local_vars :: ![FreeVar]
+ , cp_var_heap :: !.VarHeap
+ }
+class copy e :: !e !*CopyInfo -> (!e, !*CopyInfo)
+
+instance copy BoundVar
+where
+ copy var=:{var_name,var_info_ptr} cp_info=:{cp_var_heap}
+ # (var_info, cp_var_heap) = readPtr var_info_ptr cp_var_heap
+ cp_info = { cp_info & cp_var_heap = cp_var_heap }
+ = case var_info of
+ VI_FreeVar name new_info_ptr count type
+ -> ({ var & var_info_ptr = new_info_ptr },
+ { cp_info & cp_var_heap = cp_info.cp_var_heap <:= (var_info_ptr, VI_FreeVar name new_info_ptr (inc count) type)})
+ VI_LocalVar
+ -> (var, cp_info)
+ VI_BoundVar type
+ # (new_info_ptr, cp_var_heap) = newPtr VI_Empty cp_info.cp_var_heap
+ -> ({ var & var_info_ptr = new_info_ptr },
+ { cp_info & cp_free_vars = [ (var_info_ptr, type) : cp_info.cp_free_vars ],
+ cp_var_heap = cp_var_heap <:= (var_info_ptr, VI_FreeVar var_name new_info_ptr 1 type) })
+ _
+ -> abort "copy [BoundVar] (convertcases)" // <<- (var_info ---> (var_name, ptrToInt var_info_ptr))
+
+instance copy Expression
+where
+ copy (Var var) cp_info
+ # (var, cp_info) = copy var cp_info
+ = (Var var, cp_info)
+ copy (App app=:{app_args}) cp_info
+ # (app_args, cp_info) = copy app_args cp_info
+ = (App {app & app_args = app_args}, cp_info)
+ copy (fun_expr @ exprs) cp_info
+ # ((fun_expr, exprs), cp_info) = copy (fun_expr, exprs) cp_info
+ = (fun_expr @ exprs, cp_info)
+ copy (Let lad=:{let_strict_binds,let_lazy_binds, let_expr}) cp_info=:{cp_var_heap, cp_local_vars}
+ # (cp_local_vars, cp_var_heap) = foldSt bind_let_var let_strict_binds (cp_local_vars, cp_var_heap)
+ # (cp_local_vars, cp_var_heap) = foldSt bind_let_var let_lazy_binds (cp_local_vars, cp_var_heap)
+ # (let_strict_binds, cp_info) = copy let_strict_binds {cp_info & cp_var_heap = cp_var_heap, cp_local_vars = cp_local_vars }
+ # (let_lazy_binds, cp_info) = copy let_lazy_binds cp_info
+ # (let_expr, cp_info) = copy let_expr cp_info
+ = (Let {lad & let_strict_binds = let_strict_binds, let_lazy_binds = let_lazy_binds, let_expr = let_expr }, cp_info)
+ where
+ bind_let_var {lb_dst} (local_vars, var_heap)
+ = ([lb_dst : local_vars], var_heap <:= (lb_dst.fv_info_ptr, VI_LocalVar))
+ copy (Case case_expr) cp_info
+ # (case_expr, cp_info) = copy case_expr cp_info
+ = (Case case_expr, cp_info)
+ copy expr=:(BasicExpr _ _) cp_info
+ = (expr, cp_info)
+ copy (MatchExpr opt_tuple constructor expr) cp_info
+ # (expr, cp_info) = copy expr cp_info
+ = (MatchExpr opt_tuple constructor expr, cp_info)
+ copy (Selection is_unique expr selectors) cp_info
+ # (expr, cp_info) = copy expr cp_info
+ (selectors, cp_info) = copy selectors cp_info
+ = (Selection is_unique expr selectors, cp_info)
+ copy (Update expr1 selectors expr2) cp_info
+ # (expr1, cp_info) = copy expr1 cp_info
+ (selectors, cp_info) = copy selectors cp_info
+ (expr2, cp_info) = copy expr2 cp_info
+ = (Update expr1 selectors expr2, cp_info)
+ copy (RecordUpdate cons_symbol expression expressions) cp_info
+ # (expression, cp_info) = copy expression cp_info
+ (expressions, cp_info) = copy expressions cp_info
+ = (RecordUpdate cons_symbol expression expressions, cp_info)
+ copy (TupleSelect tuple_symbol arg_nr expr) cp_info
+ # (expr, cp_info) = copy expr cp_info
+ = (TupleSelect tuple_symbol arg_nr expr, cp_info)
+ copy EE cp_info
+ = (EE, cp_info)
+ copy (NoBind ptr) cp_info
+ = (NoBind ptr, cp_info)
+ copy expr cp_info
+ = abort ("copy (Expression) does not match" ---> expr)
+
+instance copy (Optional a) | copy a
+where
+ copy (Yes expr) cp_info
+ # (expr, cp_info) = copy expr cp_info
+ = (Yes expr, cp_info)
+ copy No cp_info
+ = (No, cp_info)
+
+instance copy Selection
+where
+ copy (DictionarySelection record selectors expr_ptr index_expr) cp_info
+ # (index_expr, cp_info) = copy index_expr cp_info
+ (selectors, cp_info) = copy selectors cp_info
+ (record, cp_info) = copy record cp_info
+ = (DictionarySelection record selectors expr_ptr index_expr, cp_info)
+ copy (ArraySelection selector expr_ptr index_expr) cp_info
+ # (index_expr, cp_info) = copy index_expr cp_info
+ = (ArraySelection selector expr_ptr index_expr, cp_info)
+ copy selector cp_info
+ = (selector, cp_info)
+
+instance copy Case
+where
+ copy this_case=:{case_expr, case_guards, case_default} cp_info
+ # ((case_expr,(case_guards,case_default)), cp_info) = copy (case_expr,(case_guards,case_default)) cp_info
+ = ({ this_case & case_expr = case_expr, case_guards = case_guards, case_default = case_default}, cp_info)
+
+instance copy CasePatterns
+where
+ copy (AlgebraicPatterns type patterns) cp_info
+ # (patterns, cp_info) = copy patterns cp_info
+ = (AlgebraicPatterns type patterns, cp_info)
+ copy (BasicPatterns type patterns) cp_info
+ # (patterns, cp_info) = copy patterns cp_info
+ = (BasicPatterns type patterns, cp_info)
+
+instance copy AlgebraicPattern
+where
+ copy pattern=:{ap_vars,ap_expr} cp_info=:{cp_var_heap}
+ # (ap_expr, cp_info) = copy ap_expr { cp_info & cp_var_heap = foldSt (\{fv_info_ptr} -> writePtr fv_info_ptr VI_LocalVar) ap_vars cp_var_heap}
+ = ({ pattern & ap_expr = ap_expr }, cp_info)
+
+instance copy BasicPattern
+where
+ copy pattern=:{bp_expr} cp_info
+ # (bp_expr, cp_info) = copy bp_expr cp_info
+ = ({ pattern & bp_expr = bp_expr }, cp_info)
+
+instance copy [a] | copy a
+where
+ copy l cp_info = mapSt copy l cp_info
+
+instance copy (a,b) | copy a & copy b
+where
+ copy t cp_info = app2St (copy, copy) t cp_info
+
+instance copy LetBind
+where
+ copy bind=:{lb_src} cp_info
+ # (lb_src, cp_info) = copy lb_src cp_info
+ = ({ bind & lb_src = lb_src }, cp_info)
+
+instance copy (Bind a b) | copy a
+where
+ copy bind=:{bind_src} cp_info
+ # (bind_src, cp_info) = copy bind_src cp_info
+ = ({ bind & bind_src = bind_src }, cp_info)
+
instance <<< ExprInfo
where
(<<<) file EI_Empty = file <<< "*Empty*"