aboutsummaryrefslogtreecommitdiff
path: root/frontend
diff options
context:
space:
mode:
Diffstat (limited to 'frontend')
-rw-r--r--frontend/frontend.dcl2
-rw-r--r--frontend/frontend.icl115
-rw-r--r--frontend/trans.dcl6
-rw-r--r--frontend/trans.icl385
4 files changed, 336 insertions, 172 deletions
diff --git a/frontend/frontend.dcl b/frontend/frontend.dcl
index 171d1c3..cd760bd 100644
--- a/frontend/frontend.dcl
+++ b/frontend/frontend.dcl
@@ -11,6 +11,8 @@ import checksupport, transform, overloading
= { feo_up_to_phase :: !FrontEndPhase
, feo_generics :: !Bool
, feo_fusion :: !Bool
+ , feo_dump_core :: !Bool
+ , feo_strip_unused :: !Bool
}
:: FrontEndSyntaxTree
diff --git a/frontend/frontend.icl b/frontend/frontend.icl
index bf6f110..56e71ba 100644
--- a/frontend/frontend.icl
+++ b/frontend/frontend.icl
@@ -6,6 +6,8 @@ implementation module frontend
import scanner, parse, postparse, check, type, trans, convertcases, overloading, utilities, convertDynamics,
convertimportedtypes, /*checkKindCorrectness, */ compilerSwitches, analtypes, generics1
+//import coredump
+
//import print
// trace macro
@@ -149,15 +151,6 @@ frontEndInterface options mod_ident search_paths cached_dcl_modules functions_an
| not ok
= (No,{},{},0,main_dcl_module_n,predef_symbols, hash_table, files, error, io, out, tcl_file, heaps)
-/*
- # (components, fun_defs) = partitionateFunctions (fun_defs -*-> "partitionateFunctions") (icl_global_functions++icl_instances ++ [icl_specials] ++ icl_gencases ++ generic_ranges)
- # (_,f,files) = fopen "components" FWriteText files
- (components, fun_defs, f) = showComponents {x\\x<-:components} 0 True fun_defs f
- (ok,files) = fclose f files
- | ok<>ok
- = abort "";
-*/
-
# (ok, fun_defs, array_instances, type_code_instances, common_defs, imported_funs, type_def_infos, heaps, predef_symbols, error,out)
= typeProgram (components -*-> "Typing") main_dcl_module_n fun_defs/*icl_functions*/ icl_specials list_inferred_types icl_common [a\\a<-:icl_import] dcl_mods icl_used_module_numbers td_infos heaps predef_symbols error out dcl_mods
@@ -166,11 +159,8 @@ frontEndInterface options mod_ident search_paths cached_dcl_modules functions_an
# (fun_def_size, fun_defs) = usize fun_defs
- # (components, fun_defs) = partitionateFunctions (fun_defs -*-> "partitionateFunctions") (icl_global_functions++icl_instances ++ [icl_specials] ++ icl_gencases ++ generic_ranges)
-
-// (components, fun_defs, error) = showTypes components 0 fun_defs error
-// (components, fun_defs, out) = showComponents components 0 True fun_defs out
-// (fun_defs, error) = showFunctions array_instances fun_defs error
+ # (components, fun_defs) = partitionateFunctions (fun_defs -*-> "partitionateFunctions")
+ (icl_global_functions++icl_instances ++ [icl_specials] ++ icl_gencases ++ generic_ranges)
| options.feo_up_to_phase == FrontEndPhaseTypeCheck
= frontSyntaxTree cached_dcl_macros cached_dcl_mods n_functions_and_macros_in_dcl_modules main_dcl_module_n
@@ -179,16 +169,12 @@ frontEndInterface options mod_ident search_paths cached_dcl_modules functions_an
# (components, fun_defs, predef_symbols, dcl_types, used_conses_in_dynamics, var_heap, type_heaps, expression_heap, tcl_file)
= convertDynamicPatternsIntoUnifyAppls type_code_instances common_defs main_dcl_module_n (components -*-> "convertDynamics") fun_defs predef_symbols
heaps.hp_var_heap heaps.hp_type_heaps heaps.hp_expression_heap tcl_file dcl_mods icl_mod directly_imported_dcl_modules
-// # (components, fun_defs, error) = showComponents3 components 0 False fun_defs error
-// (components, fun_defs, error) = showComponents components 0 True fun_defs error
| options.feo_up_to_phase == FrontEndPhaseConvertDynamics
# heaps = {hp_var_heap=var_heap, hp_type_heaps=type_heaps, hp_expression_heap=expression_heap, hp_generic_heap=newHeap}
= frontSyntaxTree cached_dcl_macros cached_dcl_mods n_functions_and_macros_in_dcl_modules main_dcl_module_n
predef_symbols hash_table files error io out tcl_file icl_mod dcl_mods fun_defs components array_instances heaps
-// (components, fun_defs, error) = showComponents components 0 True fun_defs error
-
# (stdStrictLists_module_n,predef_symbols) = get_StdStrictLists_module_n predef_symbols
with
get_StdStrictLists_module_n predef_symbols
@@ -198,10 +184,48 @@ frontEndInterface options mod_ident search_paths cached_dcl_modules functions_an
= (-1,predef_symbols)
# (cleanup_info, acc_args, components, fun_defs, var_heap, expression_heap)
= analyseGroups common_defs imported_funs array_instances.ali_instances_range main_dcl_module_n stdStrictLists_module_n (components -*-> "Analyse") fun_defs var_heap expression_heap
-// # (components, fun_defs, error) = showComponents2 components 0 fun_defs acc_args error
- (components, fun_defs, dcl_types, used_conses, var_heap, type_heaps, expression_heap, acc_args)
- = transformGroups cleanup_info main_dcl_module_n stdStrictLists_module_n (components -*-> "Transform") fun_defs acc_args common_defs imported_funs dcl_types used_conses_in_dynamics type_def_infos var_heap type_heaps expression_heap options.feo_fusion
+ # (def_max, acc_args) = usize acc_args
+ # (def_min, fun_defs) = usize fun_defs
+
+ (components, fun_defs, dcl_types, used_conses, var_heap, type_heaps, expression_heap, acc_args, error, predef_symbols)
+ = transformGroups cleanup_info main_dcl_module_n stdStrictLists_module_n def_min def_max (components -*-> "Transform") fun_defs acc_args common_defs imported_funs dcl_types used_conses_in_dynamics type_def_infos var_heap type_heaps expression_heap options.feo_fusion error predef_symbols
+
+ # error_admin = {ea_file = error, ea_loc = [], ea_ok = True }
+ # {dcl_instances,dcl_specials,dcl_gencases} = dcl_mods.[main_dcl_module_n]
+ # (start_rule_index,predef_symbols) = get_index_of_start_rule predef_symbols
+ with
+ get_index_of_start_rule predef_symbols
+ # ({pds_def, pds_module}, predef_symbols) = predef_symbols![PD_Start]
+ | pds_def <> NoIndex && pds_module == main_dcl_module_n
+ = (pds_def, predef_symbols)
+ = (NoIndex, predef_symbols)
+
+ # [icl_exported_global_functions,icl_not_exported_global_functions:_] = icl_global_functions
+ # exported_global_functions = case start_rule_index of
+ NoIndex -> [icl_exported_global_functions]
+ sri -> [{ir_from=sri,ir_to=inc sri},icl_exported_global_functions]
+ # exported_functions = exported_global_functions ++ [dcl_instances,dcl_specials,dcl_gencases]
+ # (components, fun_defs, predef_symbols, var_heap, expression_heap, error_admin)
+ = case options.feo_strip_unused of
+ True -> partitionateFunctions` (fun_defs -*-> "partitionateFunctions`")
+ exported_functions
+ main_dcl_module_n def_min def_max predef_symbols var_heap expression_heap error_admin
+ _
+ # (fun_defs,predef_symbols,var_heap,expression_heap,error_admin)
+ = stripStrictLets fun_defs predef_symbols var_heap expression_heap error_admin
+ -> (components, fun_defs, predef_symbols, var_heap, expression_heap, error_admin)
+
+ # error = error_admin.ea_file
+ | not error_admin.ea_ok
+ # heaps = {hp_var_heap=var_heap, hp_type_heaps=type_heaps, hp_expression_heap=expression_heap,hp_generic_heap=heaps.hp_generic_heap}
+ = (No,{},{},0,main_dcl_module_n,predef_symbols, hash_table, files, error, io, out, tcl_file, heaps)
+
+ # (components,fun_defs,files) = case options.feo_dump_core of
+// True
+// -> dumpCore components start_rule_index exported_global_functions icl_mod dcl_mods.[main_dcl_module_n] fun_defs acc_args def_min def_max files
+ _
+ -> (components,fun_defs,files)
| options.feo_up_to_phase == FrontEndPhaseTransformGroups
# heaps = {hp_var_heap=var_heap, hp_type_heaps=type_heaps, hp_expression_heap=expression_heap,hp_generic_heap=heaps.hp_generic_heap}
@@ -302,54 +326,6 @@ where
= show_component funs show_types fun_defs (file <<< fun_def)
// = show_component funs show_types fun_defs (file <<< fun_def.fun_symb)
-showComponents2 :: !*{! Group} !Int !*{# FunDef} !{! ConsClasses} !*File -> (!*{! Group},!*{# FunDef},!*File)
-showComponents2 comps comp_index fun_defs acc_args file
- | comp_index >= (size comps)
- = (comps, fun_defs, file)
- # (comp, comps) = comps![comp_index]
- # (fun_defs, file) = show_component comp.group_members fun_defs acc_args file
- = showComponents2 comps (inc comp_index) fun_defs acc_args file
-where
- show_component [] fun_defs _ file
- = (fun_defs, file <<< '\n')
- show_component [fun:funs] fun_defs acc_args file
- # (fd, fun_defs) = fun_defs![fun]
- | fun >= size acc_args
- # file = file <<< fd.fun_symb <<< '.' <<< fun <<< " ???"
- = show_component funs fun_defs acc_args file
- # file = file <<< fd.fun_symb <<< '.' <<< fun <<< " ("
- # file = show_producer_status acc_args.[fun].cc_producer file
- # file = show_accumulating_arguments acc_args.[fun].cc_args file
- # file = show_linear_arguments acc_args.[fun].cc_linear_bits file
- = show_component funs fun_defs acc_args (file <<< ") ")
-
- show_producer_status pc file
- | pc == True
- = file <<< "+:"
- = file <<< "-:"
-
- show_accumulating_arguments [ cc : ccs] file
- | cc == CPassive
- = show_accumulating_arguments ccs (file <<< 'p')
- | cc == CActive
- = show_accumulating_arguments ccs (file <<< 'c')
- | cc == CAccumulating
- = show_accumulating_arguments ccs (file <<< 'a')
- | cc == CVarOfMultimatchCase
- = show_accumulating_arguments ccs (file <<< 'm')
- | cc == CUnused
- = show_accumulating_arguments ccs (file <<< 'u')
- = show_accumulating_arguments ccs (file <<< '?')
- show_accumulating_arguments [] file
- = file
-
- show_linear_arguments [ cc : ccs] file
- | cc == True
- = show_linear_arguments ccs (file <<< 'l')
- = show_linear_arguments ccs (file <<< 'n')
- show_linear_arguments [] file
- = file
-
//show_components comps fun_defs = map (show_component fun_defs) comps
show_component fun_defs [] = []
@@ -408,4 +384,3 @@ instance == ListTypesKind where
= True
(==) _ _
= False
- \ No newline at end of file
diff --git a/frontend/trans.dcl b/frontend/trans.dcl
index d23c9ff..796892a 100644
--- a/frontend/trans.dcl
+++ b/frontend/trans.dcl
@@ -5,9 +5,9 @@ import StdEnv
import syntax, transform
import classify, partition
-transformGroups :: !CleanupInfo !Int !Int !*{! Group} !*{#FunDef} !*{!.ConsClasses} !{# CommonDefs} !{# {# FunType} }
- !*ImportedTypes !ImportedConstructors !*TypeDefInfos !*VarHeap !*TypeHeaps !*ExpressionHeap !Bool
- -> (!*{! Group}, !*{#FunDef}, !*ImportedTypes, !ImportedConstructors, !*VarHeap, !*TypeHeaps, !*ExpressionHeap, !*{!ConsClasses})
+transformGroups :: !CleanupInfo !Int !Int !Int !Int !*{!Group} !*{#FunDef} !*{!.ConsClasses} !{# CommonDefs} !{# {# FunType} }
+ !*ImportedTypes !ImportedConstructors !*TypeDefInfos !*VarHeap !*TypeHeaps !*ExpressionHeap !Bool !*File !*PredefinedSymbols
+ -> (!*{!Group}, !*{#FunDef}, !*ImportedTypes, !ImportedConstructors, !*VarHeap, !*TypeHeaps, !*ExpressionHeap, !*{!ConsClasses}, !*File, !*PredefinedSymbols)
convertSymbolType :: !Bool !{# CommonDefs} !SymbolType !Int !*ImportedTypes !ImportedConstructors !*TypeHeaps !*VarHeap
-> (!SymbolType, !*ImportedTypes, !ImportedConstructors, !*TypeHeaps, !*VarHeap)
diff --git a/frontend/trans.icl b/frontend/trans.icl
index ff5728a..33e0c8b 100644
--- a/frontend/trans.icl
+++ b/frontend/trans.icl
@@ -8,18 +8,32 @@ import StdEnv
import syntax, transform, checksupport, StdCompare, check, utilities, unitype, typesupport, type
import classify, partition
-SwitchCaseFusion fuse dont_fuse :== dont_fuse // fuse
+SwitchCaseFusion fuse dont_fuse :== fuse
SwitchGeneratedFusion fuse dont_fuse :== fuse
SwitchFunctionFusion fuse dont_fuse :== fuse
-SwitchConstructorFusion fuse dont_fuse :== dont_fuse // fuse
-SwitchCurriedFusion fuse dont_fuse :== fuse
+SwitchConstructorFusion fuse dont_fuse :== dont_fuse
+SwitchRnfConstructorFusion rnf linear :== rnf
+SwitchCurriedFusion fuse xtra dont_fuse :== fuse //&& xtra
+SwitchExtraCurriedFusion fuse dont_fuse :== fuse//dont_fuse
SwitchTrivialFusion fuse dont_fuse :== fuse
SwitchUnusedFusion fuse dont_fuse :== fuse
-SwitchTransformConstants tran dont_tran :== dont_tran // can argue that if you want constant functions to be inlined you should define them as a macro
+SwitchReanalyseFunction rean dont_rean :== dont_rean
+SwitchTransformConstants tran dont_tran :== tran
SwitchSpecialFusion fuse dont_fuse :== fuse
+SwitchArityChecks check dont_check :== check
+SwitchNWayFusion fuse dont_fuse :== dont_fuse//fuse
+SwitchDirectConsumerUnfold unfold dont :== dont//unfold
+SwitchAutoFoldCaseInCase fold dont :== fold
+SwitchAutoFoldAppInCase fold dont :== fold
+SwitchAlwaysIntroduceCaseFunction yes no :== yes
+SwitchNonRecFusion fuse dont_fuse :== dont_fuse
+SwitchHOFusion fuse dont_fuse :== fuse
+SwitchHOFusion` fuse dont_fuse :== fuse
(-!->) infix
-(-!->) a b :== a // ---> b
+(-!->) a b :== a // ---> b
+(<-!-) infix
+(<-!-) a b :== a // <--- b
fromYes (Yes x) = x
@@ -109,20 +123,22 @@ cleanup_attributes expr_info_ptr symbol_heap
* TRANSFORM
*/
-:: TransformInfo =
- { ti_fun_defs :: !.{# FunDef}
- , ti_instances :: !.{! InstanceInfo }
- , ti_cons_args :: !.{! ConsClasses}
+:: *TransformInfo =
+ { ti_fun_defs :: !*{# FunDef}
+ , ti_instances :: !*{! InstanceInfo }
+ , ti_cons_args :: !*{! ConsClasses}
, ti_new_functions :: ![FunctionInfoPtr]
- , ti_fun_heap :: !.FunctionHeap
- , ti_var_heap :: !.VarHeap
- , ti_symbol_heap :: !.ExpressionHeap
- , ti_type_heaps :: !.TypeHeaps
- , ti_type_def_infos :: !.TypeDefInfos
+ , ti_fun_heap :: !*FunctionHeap
+ , ti_var_heap :: !*VarHeap
+ , ti_symbol_heap :: !*ExpressionHeap
+ , ti_type_heaps :: !*TypeHeaps
+ , ti_type_def_infos :: !*TypeDefInfos
, ti_next_fun_nr :: !Index
, ti_cleanup_info :: !CleanupInfo
, ti_recursion_introduced :: !Optional Index
// , ti_trace :: !Bool // XXX just for tracing
+ , ti_error_file :: !*File
+ , ti_predef_symbols :: !*PredefinedSymbols
}
:: ReadOnlyTI =
@@ -133,6 +149,7 @@ cleanup_attributes expr_info_ptr symbol_heap
, ro_fun_root :: !SymbIdent // original function
, ro_fun_case :: !SymbIdent // original function or possibly generated case
, ro_fun_args :: ![FreeVar] // args of above
+ , ro_fun_orig :: !SymbIdent // original consumer
, ro_main_dcl_module_n :: !Int
@@ -143,12 +160,20 @@ cleanup_attributes expr_info_ptr symbol_heap
:: RootCaseMode = NotRootCase | RootCase | RootCaseOfZombie
-neverMatchingCase = { case_expr = EE, case_guards = NoPattern, case_default = No, case_ident = No, case_info_ptr = nilPtr,
+neverMatchingCase (Yes ident)
+ # ident = ident -!-> ("neverMatchingCase",ident)
+ = FailExpr ident
+neverMatchingCase _
+ # ident = {id_name = "neverMatchingCase", id_info = nilPtr} -!-> "neverMatchingCase without ident\n"
+ = FailExpr ident
+/*
+ = Case { case_expr = EE, case_guards = NoPattern, case_default = No, case_ident = ident, case_info_ptr = nilPtr,
// RWS ...
case_explicit = False,
+ // case_explicit = True, // DvA better?
// ... RWS
case_default_pos = NoPos }
-
+*/
class transform a :: !a !ReadOnlyTI !*TransformInfo -> (!a, !*TransformInfo)
instance transform Expression
@@ -272,7 +297,7 @@ transformCase this_case=:{case_expr,case_guards,case_default,case_ident,case_inf
_ -> transCase True (Yes aci) this_case ro ti
_ -> transCase False No this_case ro ti
ti = { ti & ti_symbol_heap = remove_aci_free_vars_info case_info_ptr ti.ti_symbol_heap }
- = (removeNeverMatchingSubcases result_expr, ti)
+ = (removeNeverMatchingSubcases result_expr ro, ti)
where
is_variable (Var _) = True
is_variable _ = False
@@ -366,7 +391,11 @@ transCase is_active opt_aci this_case=:{case_expr = (App app=:{app_symb,app_args
Yes match_expr
-> (match_expr, ti)
No
- -> (Case neverMatchingCase, ti)
+ -> (neverMatchingCase never_ident, ti) <-!- ("transCase:App:neverMatchingCase",never_ident)
+ with
+ never_ident = case ro.ro_root_case_mode of
+ NotRootCase -> this_case.case_ident
+ _ -> Yes ro.ro_fun_case.symb_name
// otherwise it's a function application
_ -> case opt_aci of
Yes aci=:{ aci_params, aci_opt_unfolder }
@@ -385,9 +414,15 @@ transCase is_active opt_aci this_case=:{case_expr = (App app=:{app_symb,app_args
# (ro_fun=:{symb_kind=SK_GeneratedFunction fun_info_ptr _}) = ro.ro_fun_case
-> (inc ti_next_fun_nr,
{ ro_fun & symb_kind=SK_GeneratedFunction fun_info_ptr ti_next_fun_nr })
+ -!-> ("Recursion","RootCaseOfZombie",ti_next_fun_nr,ti.ti_recursion_introduced)
RootCase
-> (ti_next_fun_nr, ro.ro_fun_root)
- ti = { ti & ti_next_fun_nr = new_next_fun_nr, ti_recursion_introduced = Yes ti_next_fun_nr }
+ -!-> ("Recursion","RootCase",ti_next_fun_nr,ro.ro_fun_root,ti.ti_recursion_introduced)
+ ti = case ro.ro_root_case_mode of
+ RootCaseOfZombie
+ -> { ti & ti_next_fun_nr = new_next_fun_nr, ti_recursion_introduced = Yes ti_next_fun_nr }
+ RootCase
+ -> { ti & ti_next_fun_nr = new_next_fun_nr, ti_recursion_introduced = No }
app_args1 = replace_arg [ fv_info_ptr \\ {fv_info_ptr}<-aci_params ] app_args variables
(app_args2, ti) = transform app_args1 { ro & ro_root_case_mode = NotRootCase } ti
-> (App {app_symb=app_symb, app_args=app_args2, app_info_ptr=nilPtr}, ti)
@@ -495,7 +530,11 @@ transCase is_active opt_aci this_case=:{case_expr = (BasicExpr basic_value),case
| isEmpty may_be_match_pattern
= case case_default of
Yes default_expr-> transform default_expr { ro & ro_root_case_mode = NotRootCase } ti
- No -> (Case neverMatchingCase, ti)
+ No -> (neverMatchingCase never_ident, ti) <-!- ("transCase:BasicExpr:neverMatchingCase",never_ident)
+ with
+ never_ident = case ro.ro_root_case_mode of
+ NotRootCase -> this_case.case_ident
+ _ -> Yes ro.ro_fun_case.symb_name
= transform (hd may_be_match_pattern).bp_expr { ro & ro_root_case_mode = NotRootCase } ti
where
getBasicPatterns (BasicPatterns _ basicPatterns)
@@ -554,6 +593,7 @@ possibly_generate_case_function kees=:{case_info_ptr} aci=:{aci_free_vars} ro ti
= { id_name = ro.ro_fun_root.symb_name.id_name+++"_case", id_info = nilPtr }
fun_symb
= { symb_name = fun_ident, symb_kind=SK_GeneratedFunction fun_info_ptr undeff }
+ <-!- ("<<<transformCaseFunction",fun_ident)
new_ro
= { ro & ro_root_case_mode = RootCaseOfZombie , ro_fun_case = fun_symb, ro_fun_args = all_args }
ti
@@ -562,6 +602,7 @@ possibly_generate_case_function kees=:{case_info_ptr} aci=:{aci_free_vars} ro ti
= transformCase kees new_ro ti
(ti_recursion_introduced, ti)
= ti!ti_recursion_introduced
+ <-!- ("transformCaseFunction>>>",fun_ident)
ti = { ti & ti_recursion_introduced = old_ti_recursion_introduced }
= case ti_recursion_introduced of
Yes fun_index
@@ -668,8 +709,8 @@ where
free_var_to_bound_var {fv_name, fv_info_ptr}
= Var { var_name = fv_name, var_info_ptr = fv_info_ptr, var_expr_ptr = nilPtr}
-removeNeverMatchingSubcases :: Expression -> Expression
-removeNeverMatchingSubcases keesExpr=:(Case kees)
+removeNeverMatchingSubcases :: Expression !.ReadOnlyTI -> Expression
+removeNeverMatchingSubcases keesExpr=:(Case kees) ro
// remove those case guards whose right hand side is a never matching case
| is_never_matching_case keesExpr
= keesExpr
@@ -681,7 +722,7 @@ removeNeverMatchingSubcases keesExpr=:(Case kees)
-> keesExpr // frequent case: all subexpressions can't fail
# filtered_case_guards = filter (not o is_never_matching_case o get_alg_rhs) alg_patterns
| has_become_never_matching filtered_default filtered_case_guards
- -> Case neverMatchingCase
+ -> neverMatchingCase never_ident <-!- ("removeNeverMatchingSubcases:AlgebraicPatterns:neverMatchingCase",never_ident)
| is_default_only filtered_default filtered_case_guards
-> fromYes case_default
-> Case {kees & case_guards = AlgebraicPatterns i filtered_case_guards, case_default = filtered_default }
@@ -690,7 +731,7 @@ removeNeverMatchingSubcases keesExpr=:(Case kees)
-> keesExpr // frequent case: all subexpressions can't fail
# filtered_case_guards = filter (not o is_never_matching_case o get_basic_rhs) basic_patterns
| has_become_never_matching filtered_default filtered_case_guards
- -> Case neverMatchingCase
+ -> neverMatchingCase never_ident <-!- ("removeNeverMatchingSubcases:BasicPatterns:neverMatchingCase",never_ident)
| is_default_only filtered_default filtered_case_guards
-> fromYes case_default
-> Case {kees & case_guards = BasicPatterns bt filtered_case_guards, case_default = filtered_default }
@@ -699,7 +740,7 @@ removeNeverMatchingSubcases keesExpr=:(Case kees)
-> keesExpr // frequent case: all subexpressions can't fail
# filtered_case_guards = filter (not o is_never_matching_case o get_alg_rhs) alg_patterns
| has_become_never_matching filtered_default filtered_case_guards
- -> Case neverMatchingCase
+ -> neverMatchingCase never_ident <-!- ("removeNeverMatchingSubcases:OverloadedListPatterns:neverMatchingCase",never_ident)
| is_default_only filtered_default filtered_case_guards
-> fromYes case_default
-> Case {kees & case_guards = OverloadedListPatterns i decons_expr filtered_case_guards, case_default = filtered_default }
@@ -725,7 +766,10 @@ where
= False
is_never_matching_default (Yes expr)
= is_never_matching_case expr
-removeNeverMatchingSubcases expr
+ never_ident = case ro.ro_root_case_mode of
+ NotRootCase -> kees.case_ident
+ _ -> Yes ro.ro_fun_case.symb_name
+removeNeverMatchingSubcases expr ro
= expr
@@ -1183,14 +1227,17 @@ generateFunction fd=:{fun_body = TransformedBody {tb_args,tb_rhs},fun_info = {fi
= unfold tb_rhs ui us
// | False ---> ("unfolded:", tb_rhs) = undef
# ro_fun= { symb_name = fd.fun_symb, symb_kind = SK_GeneratedFunction fun_def_ptr ti_next_fun_nr }
- # ro = { ro & ro_root_case_mode = case tb_rhs of
+ # ro_root_case_mode = case tb_rhs of
Case _
-> RootCase
- _ -> NotRootCase,
+ _ -> NotRootCase
+ # ro = { ro & ro_root_case_mode = ro_root_case_mode,
ro_fun_root = ro_fun,
ro_fun_case = ro_fun,
ro_fun_args = new_fun_args
}
+// | False ---> ("transform generated function:",ti_next_fun_nr,ro_root_case_mode) = undef
+// | False -!-> ("transforming new function:",ti_next_fun_nr) = undef
// | False -!-> ("transforming new function:",tb_rhs) = undef
# ti
= { ti & ti_var_heap = us_var_heap, ti_fun_heap = ti_fun_heap, ti_symbol_heap = us_symbol_heap,
@@ -1341,8 +1388,6 @@ where
No
-> (subst, coercions, ti_type_def_infos, ti_type_heaps)
-// expand_type converts 'pointer' type representation to 'integer' type representation
-// inverse of class replaceIntegers?
expand_type ro_common_defs cons_vars atype (coercions, subst, ti_type_heaps, ti_type_def_infos)
| is_dictionary atype ti_type_def_infos
# (_, atype, subst) = arraySubst atype subst
@@ -2195,7 +2240,7 @@ transformApplication app=:{app_symb=symb=:{symb_kind}, app_args} extra_args
= (App { app & app_args = app_args ++ extra_args}, ti)
| glob_module==ro.ro_stdStrictLists_module_n && is_cons_or_decons_of_UList_or_UTSList glob_object glob_module ro.ro_imported_funs && (not (isEmpty app_args))
-// && trace_tn ("transformApplication "+++toString symb.symb_name)
+// && True ---> ("transformApplication "+++toString symb.symb_name)
# {ft_type} = ro.ro_imported_funs.[glob_module].[glob_object] // type of cons instance of instance List [#] a | U(TS)List a
# [{tc_class=TCClass {glob_module,glob_object={ds_index}}}:_] = ft_type.st_context
# member_n=find_member_n 0 symb.symb_name.id_name ro.ro_common_defs.[glob_module].com_class_defs.[ds_index].class_members
@@ -2404,7 +2449,7 @@ determineProducer is_applied_to_macro_fun consumer_is_curried linear_bit app=:{a
| is_applied_to_macro_fun
= ({ producers & [prod_index] = PR_Curried symb (length app_args)}, app_args ++ new_args, ti)
-!-> ("Produce1cc_macro",symb.symb_name)
- | SwitchCurriedFusion (ro.ro_transform_fusion && cc_producer) False
+ | SwitchCurriedFusion ro.ro_transform_fusion cc_producer False
= ({ producers & [prod_index] = PR_Curried symb (length app_args)}, app_args ++ new_args, ti)
-!-> ("Produce1cc_curried",symb.symb_name)
= (producers, [App app : new_args ], ti)
@@ -2441,7 +2486,7 @@ determineProducer is_applied_to_macro_fun consumer_is_curried linear_bit app=:{a
= ({ producers & [prod_index] = PR_Curried symb (length app_args)}, app_args ++ new_args, ti)
-!-> ("Produce2cc_macro",symb.symb_name)
# ({cc_producer},ti) = ti!ti_cons_args.[glob_object]
- | SwitchCurriedFusion (ro.ro_transform_fusion && cc_producer) False
+ | SwitchCurriedFusion ro.ro_transform_fusion cc_producer False
= ({ producers & [prod_index] = PR_Curried symb (length app_args)}, app_args ++ new_args, ti)
-!-> ("Produce2cc_curried",symb.symb_name)
= (producers, [App app : new_args ], ti)
@@ -2634,11 +2679,11 @@ add_let_binds free_vars rhss original_binds
//@ transformGroups
-transformGroups :: !CleanupInfo !Int !Int !*{! Group} !*{#FunDef} !*{!.ConsClasses} !{# CommonDefs} !{# {# FunType} }
- !*ImportedTypes !ImportedConstructors !*TypeDefInfos !*VarHeap !*TypeHeaps !*ExpressionHeap !Bool
- -> (!*{! Group}, !*{#FunDef}, !*ImportedTypes, !ImportedConstructors, !*VarHeap, !*TypeHeaps, !*ExpressionHeap, !*{!ConsClasses})
-transformGroups cleanup_info main_dcl_module_n stdStrictLists_module_n groups fun_defs cons_args common_defs imported_funs
- imported_types collected_imports type_def_infos var_heap type_heaps symbol_heap compile_with_fusion
+transformGroups :: !CleanupInfo !Int !Int !Int !Int !*{!Group} !*{#FunDef} !*{!.ConsClasses} !{# CommonDefs} !{# {# FunType} }
+ !*ImportedTypes !ImportedConstructors !*TypeDefInfos !*VarHeap !*TypeHeaps !*ExpressionHeap !Bool !*File !*PredefinedSymbols
+ -> (!*{!Group}, !*{#FunDef}, !*ImportedTypes, !ImportedConstructors, !*VarHeap, !*TypeHeaps, !*ExpressionHeap, !*{!ConsClasses}, !*File, !*PredefinedSymbols)
+transformGroups cleanup_info main_dcl_module_n stdStrictLists_module_n def_min def_max groups fun_defs cons_args common_defs imported_funs
+ imported_types collected_imports type_def_infos var_heap type_heaps symbol_heap compile_with_fusion error predef_symbols
#! nr_of_funs = size fun_defs
# initial_ti =
{ ti_fun_defs = fun_defs
@@ -2653,62 +2698,199 @@ transformGroups cleanup_info main_dcl_module_n stdStrictLists_module_n groups fu
, ti_next_fun_nr = nr_of_funs
, ti_cleanup_info = cleanup_info
, ti_recursion_introduced = No
+ , ti_error_file = error
+ , ti_predef_symbols = predef_symbols
}
+ # groups = [group \\ group <-: groups]
# (groups, imported_types, collected_imports, fun_indices_with_abs_syn_types, ti)
- = transform_groups 0 groups common_defs imported_funs imported_types collected_imports [] initial_ti
- {ti_fun_defs,ti_new_functions,ti_var_heap,ti_symbol_heap,ti_fun_heap,ti_next_fun_nr,ti_type_heaps,ti_cleanup_info,ti_cons_args} = ti
+ = transform_groups 0 groups [] common_defs imported_funs imported_types collected_imports [] initial_ti
+ # groups = {group \\ group <- reverse groups}
+ {ti_fun_defs,ti_new_functions,ti_var_heap,ti_symbol_heap,ti_fun_heap,ti_next_fun_nr,ti_type_heaps,ti_cleanup_info} = ti
# (fun_defs, imported_types, collected_imports, type_heaps, var_heap)
= foldSt (expand_abstract_syn_types_in_function_type common_defs) (reverse fun_indices_with_abs_syn_types)
(ti_fun_defs, imported_types, collected_imports, ti_type_heaps, ti_var_heap)
- (groups, new_fun_defs, imported_types, collected_imports, type_heaps, var_heap)
+ (groups, new_fun_defs, new_cons_classes, imported_types, collected_imports, type_heaps, var_heap)
= foldSt (add_new_function_to_group common_defs ti_fun_heap) ti_new_functions
- (groups, [], imported_types, collected_imports, type_heaps, var_heap)
- symbol_heap = foldSt cleanup_attributes ti_cleanup_info ti_symbol_heap
+ (groups, [], [], imported_types, collected_imports, type_heaps, var_heap)
+ symbol_heap = foldSt cleanup_attributes ti.ti_cleanup_info ti.ti_symbol_heap
fun_defs = { fundef \\ fundef <- [ fundef \\ fundef <-: fun_defs ] ++ new_fun_defs }
- = (groups, fun_defs, imported_types, collected_imports, var_heap, type_heaps, symbol_heap, ti_cons_args)
+ cons_args = { consarg \\ consarg <- [ consarg \\ consarg <-: ti.ti_cons_args ] ++ new_cons_classes }
+ = (groups, fun_defs, imported_types, collected_imports, var_heap, type_heaps, symbol_heap, cons_args, ti.ti_error_file, ti.ti_predef_symbols)
where
- transform_groups group_nr groups common_defs imported_funs imported_types collected_imports fun_indices_with_abs_syn_types ti
- | group_nr < size groups
- # (group, groups) = groups![group_nr]
+ transform_groups group_nr [] acc_groups common_defs imported_funs imported_types collected_imports fun_indices_with_abs_syn_types ti
+ = (acc_groups, imported_types, collected_imports, fun_indices_with_abs_syn_types, ti)
+ transform_groups group_nr [group:groups] acc_groups common_defs imported_funs imported_types collected_imports fun_indices_with_abs_syn_types ti
# {group_members} = group
# (ti_fun_defs, imported_types, collected_imports, fun_indices_with_abs_syn_types, ti_type_heaps, ti_var_heap)
= foldSt (convert_function_type common_defs) group_members
(ti.ti_fun_defs, imported_types, collected_imports, fun_indices_with_abs_syn_types, ti.ti_type_heaps, ti.ti_var_heap)
# ti = { ti & ti_fun_defs = ti_fun_defs, ti_type_heaps = ti_type_heaps, ti_var_heap = ti_var_heap }
+ # (group_nr,acc_groups,ti) = transform_group common_defs imported_funs group_nr group_members acc_groups ti
+ = transform_groups group_nr groups acc_groups common_defs imported_funs imported_types collected_imports fun_indices_with_abs_syn_types ti
+
+ transform_groups` common_defs imported_funs group_nr [] acc_groups ti
+ = (group_nr, acc_groups, ti)
+ transform_groups` common_defs imported_funs group_nr [{group_members}:groups] acc_groups ti
+ # (group_nr,acc_groups,ti) = transform_group common_defs imported_funs group_nr group_members acc_groups ti
+ = transform_groups` common_defs imported_funs group_nr groups acc_groups ti
+
+ transform_group common_defs imported_funs group_nr group_members acc_groups ti
+ // assign group_nr to group_members
+ # ti = ti <-!- ("transform_group",group_nr)
+ # ti = foldSt (assign_group group_nr) group_members ti
+ // store old consumer classification
+ # (before,ti) = ti!ti_next_fun_nr
+ // transform group_members
# ti = foldSt (transform_function common_defs imported_funs) group_members ti
- # ti = reannotate_producers group_nr (group_members -!-> ("reannotate_producers",group_nr)) ti
- = transform_groups (inc group_nr) groups common_defs imported_funs imported_types collected_imports fun_indices_with_abs_syn_types ti
- = (groups, imported_types, collected_imports, fun_indices_with_abs_syn_types, ti)
+ // partitionate group: need to know added functions for this...
+ # (after,ti) = ti!ti_next_fun_nr
+ # (new_groups,ti) = partition_group group_nr (group_members++[before..after-1]) ti
+ // reanalyse consumers
+ # (cleanup,ti_fun_defs,ti_var_heap,ti_symbol_heap,ti_fun_heap,ti_cons_args,same)
+ = reanalyseGroups common_defs imported_funs main_dcl_module_n stdStrictLists_module_n ti.ti_new_functions
+ new_groups
+ ti.ti_fun_defs ti.ti_var_heap ti.ti_symbol_heap ti.ti_fun_heap ti.ti_cons_args
+ # ti = {ti
+ & ti_cleanup_info = cleanup ++ ti.ti_cleanup_info
+ , ti_fun_defs = ti_fun_defs
+ , ti_var_heap = ti_var_heap
+ , ti_symbol_heap = ti_symbol_heap
+ , ti_fun_heap = ti_fun_heap
+ , ti_cons_args = ti_cons_args
+ }
+ // if wanted reapply transform_group to all found groups
+ | (after>before) || (length new_groups > 1) || not same
+ = transform_groups` common_defs imported_funs group_nr new_groups acc_groups ti
+ // producer annotation for finished components!
+ # ti = reannotate_producers group_nr group_members ti
+ = (inc group_nr,(reverse new_groups)++acc_groups,ti)
+
+ changed_group_classification [] ti
+ = (False,ti)
+ changed_group_classification [fun:funs] ti
+ = (False,ti)
+
+ assign_group group_number fun ti
+ # (fd,ti) = get_fun_def fun ti
+ # fd = { fd & fun_info.fi_group_index = group_number }
+ # ti = set_fun_def fun fd ti
+ = ti
+
+ get_fun_def fun ti=:{ti_fun_defs}
+ | fun < size ti_fun_defs
+ # (fun_def, ti) = ti!ti_fun_defs.[fun]
+ = (fun_def,ti)
+ # (fun_def_ptr,ti_fun_heap) = lookup_ptr fun ti.ti_new_functions ti.ti_fun_heap
+ with
+ lookup_ptr fun [] ti_fun_heap = abort "drat"
+ lookup_ptr fun [fun_def_ptr:new_functions] ti_fun_heap
+ # (FI_Function {gf_fun_index}, ti_fun_heap)
+ = readPtr fun_def_ptr ti_fun_heap
+ | gf_fun_index == fun
+ = (fun_def_ptr, ti_fun_heap)
+ = lookup_ptr fun new_functions ti_fun_heap
+ # (FI_Function {gf_fun_def}, ti_fun_heap)
+ = readPtr fun_def_ptr ti_fun_heap
+ ti = { ti & ti_fun_heap = ti_fun_heap }
+ = (gf_fun_def,ti)
- transform_function common_defs imported_funs fun ti=:{ti_fun_defs, ti_var_heap}
- # (fun_def, ti_fun_defs) = ti_fun_defs![fun]
- (Yes {st_args}) = fun_def.fun_type
+ set_fun_def fun fun_def ti=:{ti_fun_defs}
+ | fun < size ti_fun_defs
+ = {ti & ti_fun_defs.[fun] = fun_def}
+ # (fun_def_ptr,ti_fun_heap) = lookup_ptr fun ti.ti_new_functions ti.ti_fun_heap
+ with
+ lookup_ptr fun [] ti_fun_heap = abort "drat"
+ lookup_ptr fun [fun_def_ptr:new_functions] ti_fun_heap
+ # (FI_Function {gf_fun_index}, ti_fun_heap)
+ = readPtr fun_def_ptr ti_fun_heap
+ | gf_fun_index == fun
+ = (fun_def_ptr, ti_fun_heap)
+ = lookup_ptr fun new_functions ti_fun_heap
+ # (FI_Function gf, ti_fun_heap)
+ = readPtr fun_def_ptr ti_fun_heap
+ # ti_fun_heap = writePtr fun_def_ptr (FI_Function {gf & gf_fun_def = fun_def}) ti_fun_heap
+ ti = { ti & ti_fun_heap = ti_fun_heap }
+ = ti
+
+ partition_group group_nr group_members ti
+ # fun_defs = ti.ti_fun_defs
+ # fun_heap = ti.ti_fun_heap
+ # max_fun_nr = ti.ti_next_fun_nr
+ # new_functions = ti.ti_new_functions
+ # main_dcl_module_n = main_dcl_module_n
+ # next_group = group_nr
+ # predef_symbols = ti.ti_predef_symbols
+ # var_heap = ti.ti_var_heap
+ # expression_heap = ti.ti_symbol_heap
+ # error_admin = {ea_file = ti.ti_error_file, ea_loc = [], ea_ok = True }
+ # (_,groups,fun_defs,fun_heap,predef_symbols,var_heap,expression_heap,error_admin)
+ = partitionateFunctions`` max_fun_nr next_group new_functions fun_defs group_members main_dcl_module_n def_min def_max fun_heap predef_symbols var_heap expression_heap error_admin
+ # ti =
+ { ti
+ & ti_fun_defs = fun_defs
+ , ti_fun_heap = fun_heap
+ , ti_predef_symbols = predef_symbols
+ , ti_var_heap = var_heap
+ , ti_symbol_heap = expression_heap
+ , ti_error_file = error_admin.ea_file
+ }
+ = (groups,ti)
+
+ transform_function common_defs imported_funs fun ti
+ # (fun_def, ro_fun, ti) = get_fun_def_and_symb_ident fun ti
+ # ti = ti <-!- ("transform_function",fun,ro_fun,fun_def)
+ # (Yes {st_args}) = fun_def.fun_type
{fun_body = TransformedBody tb} = fun_def
- ti_var_heap = fold2St (\{fv_info_ptr} a_type ti_var_heap
- -> setExtendedVarInfo fv_info_ptr (EVI_VarType a_type) ti_var_heap)
- tb.tb_args st_args ti_var_heap
- ro_fun = fun_def_to_symb_ident fun fun_def
+ ti_var_heap = fold2St store_arg_type_info tb.tb_args st_args ti.ti_var_heap
ro = { ro_imported_funs = imported_funs
, ro_common_defs = common_defs
, ro_root_case_mode = get_root_case_mode tb
, ro_fun_root = ro_fun
, ro_fun_case = ro_fun
+ , ro_fun_orig = ro_fun
, ro_fun_args = tb.tb_args
, ro_main_dcl_module_n = main_dcl_module_n
, ro_transform_fusion = compile_with_fusion
, ro_stdStrictLists_module_n = stdStrictLists_module_n
}
- (fun_rhs, ti) = transform tb.tb_rhs ro { ti & ti_fun_defs = ti_fun_defs, ti_var_heap = ti_var_heap }
- = { ti & ti_fun_defs = {ti.ti_fun_defs & [fun] = { fun_def & fun_body = TransformedBody { tb & tb_rhs = fun_rhs }}}}
+ ti = { ti & ti_var_heap = ti_var_heap } <-!- ("transform_function",fun,ro.ro_root_case_mode)
+ (fun_rhs, ti) = transform tb.tb_rhs ro ti
+ fun_def = { fun_def & fun_body = TransformedBody { tb & tb_rhs = fun_rhs }}
+ # ti = set_fun_def fun fun_def ti
+ = ti
where
- fun_def_to_symb_ident fun_index {fun_symb}
+ store_arg_type_info {fv_info_ptr} a_type ti_var_heap
+ = setExtendedVarInfo fv_info_ptr (EVI_VarType a_type) ti_var_heap
+
+ fun_def_to_symb_ident fun_index fsize {fun_symb}
+ | fun_index < fsize
= { symb_name=fun_symb, symb_kind=SK_Function {glob_object=fun_index, glob_module=main_dcl_module_n } }
get_root_case_mode {tb_rhs=Case _} = RootCase
get_root_case_mode _ = NotRootCase
+ get_fun_def_and_symb_ident fun ti=:{ti_fun_defs}
+ | fun < size ti_fun_defs
+ # (fun_def, ti) = ti!ti_fun_defs.[fun]
+ # si = { symb_name=fun_def.fun_symb, symb_kind=SK_Function {glob_object=fun, glob_module=main_dcl_module_n } }
+ = (fun_def,si,ti)
+ # (fun_def_ptr,ti_fun_heap) = lookup_ptr fun ti.ti_new_functions ti.ti_fun_heap
+ with
+ lookup_ptr fun [] ti_fun_heap = abort "drat"
+ lookup_ptr fun [fun_def_ptr:new_functions] ti_fun_heap
+ # (FI_Function {gf_fun_index}, ti_fun_heap)
+ = readPtr fun_def_ptr ti_fun_heap
+ | gf_fun_index == fun
+ = (fun_def_ptr, ti_fun_heap)
+ = lookup_ptr fun new_functions ti_fun_heap
+ # (FI_Function {gf_fun_def}, ti_fun_heap)
+ = readPtr fun_def_ptr ti_fun_heap
+ # si = { symb_name=gf_fun_def.fun_symb, symb_kind=SK_GeneratedFunction fun_def_ptr fun }
+ ti = { ti & ti_fun_heap = ti_fun_heap }
+ = (gf_fun_def,si,ti)
+
reannotate_producers group_nr group_members ti
// determine if safe group
# (safe,ti) = safe_producers group_nr group_members group_members ti
@@ -2716,24 +2898,6 @@ where
// if safe mark all members as safe
= foldSt mark_producer_safe group_members ti
= ti
-
- get_fun_def fun ti
- | fun < size ti.ti_fun_defs
- # (fun_def, ti) = ti!ti_fun_defs.[fun]
- = (fun_def,ti)
- # (fun_def_ptr,ti_fun_heap) = lookup_ptr fun ti.ti_new_functions ti.ti_fun_heap
- with
- lookup_ptr fun [] ti_fun_heap = abort "drat"
- lookup_ptr fun [fun_def_ptr:new_functions] ti_fun_heap
- # (FI_Function {gf_fun_index}, ti_fun_heap)
- = readPtr fun_def_ptr ti_fun_heap
- | gf_fun_index == fun
- = (fun_def_ptr, ti_fun_heap)
- = lookup_ptr fun new_functions ti_fun_heap
- # (FI_Function {gf_fun_def}, ti_fun_heap)
- = readPtr fun_def_ptr ti_fun_heap
- ti = { ti & ti_fun_heap = ti_fun_heap }
- = (gf_fun_def,ti)
safe_producers group_nr group_members [] ti
= (True,ti)
@@ -2741,7 +2905,8 @@ where
// look for occurrence of group_members in safe argument position of fun RHS
// i.e. linearity ok && ...
#! (fun_def, ti) = get_fun_def fun ti
- {fun_body = TransformedBody tb} = fun_def
+ {fun_body = TransformedBody tb}
+ = fun_def
fun_body = tb.tb_rhs
#! prs =
@@ -2759,18 +2924,31 @@ where
= safe_producers group_nr group_members funs ti
= (safe,ti)
- mark_producer_safe fun ti
+ mark_producer_safe fun ti=:{ti_fun_defs}
// update cc_prod for fun
- #! ti_cons_args = {ti.ti_cons_args & [fun].cc_producer = pIsSafe}
- ti = {ti & ti_cons_args = ti_cons_args}
+ | fun < size ti_fun_defs
+ = {ti & ti_cons_args.[fun].cc_producer = pIsSafe}
+ # (fun_def_ptr,ti_fun_heap) = lookup_ptr fun ti.ti_new_functions ti.ti_fun_heap
+ with
+ lookup_ptr fun [] ti_fun_heap = abort "drat"
+ lookup_ptr fun [fun_def_ptr:new_functions] ti_fun_heap
+ # (FI_Function {gf_fun_index}, ti_fun_heap)
+ = readPtr fun_def_ptr ti_fun_heap
+ | gf_fun_index == fun
+ = (fun_def_ptr, ti_fun_heap)
+ = lookup_ptr fun new_functions ti_fun_heap
+ # (FI_Function gf, ti_fun_heap)
+ = readPtr fun_def_ptr ti_fun_heap
+ # ti_fun_heap = writePtr fun_def_ptr (FI_Function {gf & gf_cons_args.cc_producer = pIsSafe}) ti_fun_heap
+ ti = { ti & ti_fun_heap = ti_fun_heap }
= ti
// ... DvA
add_new_function_to_group :: !{# CommonDefs} !FunctionHeap !FunctionInfoPtr
- !(!*{! Group}, ![FunDef], !*ImportedTypes, !ImportedConstructors, !*TypeHeaps, !*VarHeap)
- -> (!*{! Group}, ![FunDef], !*ImportedTypes, !ImportedConstructors, !*TypeHeaps, !*VarHeap)
- add_new_function_to_group common_defs fun_heap fun_ptr (groups, fun_defs, imported_types, collected_imports, type_heaps, var_heap)
- # (FI_Function {gf_fun_def,gf_fun_index}) = sreadPtr fun_ptr fun_heap
+ !(!*{!Group}, ![FunDef], ![ConsClasses], !*ImportedTypes, !ImportedConstructors, !*TypeHeaps, !*VarHeap)
+ -> (!*{!Group}, ![FunDef], ![ConsClasses], !*ImportedTypes, !ImportedConstructors, !*TypeHeaps, !*VarHeap)
+ add_new_function_to_group common_defs fun_heap fun_ptr (groups, fun_defs, cons_classes, imported_types, collected_imports, type_heaps, var_heap)
+ # (FI_Function {gf_fun_def,gf_fun_index,gf_cons_args}) = sreadPtr fun_ptr fun_heap
{fun_type = Yes ft=:{st_args,st_result}, fun_info = {fi_group_index,fi_properties}} = gf_fun_def
ets =
{ ets_type_defs = imported_types
@@ -2782,11 +2960,17 @@ where
}
(_,(st_result,st_args), {ets_type_defs, ets_collected_conses, ets_type_heaps, ets_var_heap})
= expandSynTypes (if (fi_properties bitand FI_HasTypeSpec == 0) (RemoveAnnotationsMask bitor ExpandAbstractSynTypesMask) ExpandAbstractSynTypesMask) common_defs (st_result,st_args) ets
-
# ft = { ft & st_result = st_result, st_args = st_args }
+ | fi_group_index >= size groups
+ = abort ("add_new_function_to_group "+++ toString fi_group_index+++ "," +++ toString (size groups) +++ "," +++ toString gf_fun_index)
+
# (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],
+ | not (isMember gf_fun_index group.group_members)
+ = abort ("add_new_function_to_group INSANE!\n" +++ toString gf_fun_index +++ "," +++ toString fi_group_index)
+ # groups = {groups & [fi_group_index] = group}
+
+ = (groups,
+ [ { gf_fun_def & fun_type = Yes ft} : fun_defs], [gf_cons_args:cons_classes],
ets_type_defs, ets_collected_conses, ets_type_heaps, ets_var_heap)
convert_function_type common_defs fun_index (fun_defs, imported_types, collected_imports, fun_indices_with_abs_syn_types, type_heaps, var_heap)
@@ -3258,7 +3442,10 @@ instance producerRequirements Expression where
= (True,prs)
producerRequirements (App {app_symb={symb_kind=(SK_Constructor _)},app_args}) prs
= producerRequirements app_args prs
- producerRequirements (App {app_symb,app_args}) prs
+ producerRequirements app=:(App {app_symb,app_args}) prs
+ # (rec,prs) = is_recursive_app app prs
+ | not rec
+ = producerRequirements app_args prs
// look up consumer class for app_symb args
#! (maybe_ca,prs) = retrieve_consumer_args app_symb prs
// need to check for recursive call in safe arg...
@@ -3287,21 +3474,19 @@ instance producerRequirements Expression where
is_recursive_app (App {app_symb}) prs
// check if app_symb member of prs_group
# {symb_kind} = app_symb
- | is_SK_Function_or_SK_LocalMacroFunction symb_kind
#! main_dcl_module_n = prs.prs_main_dcl_module_n
# { glob_module, glob_object }
= case symb_kind of
SK_Function global_index -> global_index
SK_LocalMacroFunction index -> { glob_module = main_dcl_module_n, glob_object = index }
+ SK_GeneratedFunction info_ptr index -> { glob_module = main_dcl_module_n, glob_object = index }
+ _ -> {glob_module = -1, glob_object = -1}
| glob_module <> main_dcl_module_n
= (False,prs)
-// #! rec = isMember glob_object prs.prs_group
#! (fun_def,fun_defs,fun_heap) = get_fun_def symb_kind prs.prs_main_dcl_module_n prs.prs_fun_defs prs.prs_fun_heap
prs = {prs & prs_fun_defs = fun_defs, prs_fun_heap = fun_heap}
- rec` = fun_def.fun_info.fi_group_index == prs.prs_group_index
-// | rec <> rec`
-// = (rec`,prs ---> ("is_recursive_app mismatch!"))
- = (rec`,prs)
+ rec = fun_def.fun_info.fi_group_index == prs.prs_group_index
+ = (rec,prs)
is_recursive_app _ prs
= (False,prs)
@@ -3375,6 +3560,8 @@ instance producerRequirements Expression where
= (False,prs)
producerRequirements (NoBind var) prs
= (True,prs)
+ producerRequirements (FailExpr _) prs
+ = (True,prs)
producerRequirements expr prs
= abort ("producerRequirements " ---> expr)
@@ -3470,17 +3657,17 @@ retrieve_consumer_args si=:{symb_kind} prs=:{prs_cons_args, prs_main_dcl_module_
prs = {prs & prs_cons_args = prs_cons_args}
= case symb_kind of
SK_Function {glob_module, glob_object}
- | glob_module == prs_main_dcl_module_n && glob_object < prs_size//size prs_cons_args
+ | glob_module == prs_main_dcl_module_n && glob_object < prs_size
# (cons_args,prs) = prs!prs_cons_args.[glob_object]
-> (Yes cons_args,prs)
-> (No,prs) -!-> ("r_c_a",si)
SK_LocalMacroFunction glob_object
- | glob_object < prs_size//size prs_cons_args
+ | glob_object < prs_size
# (cons_args,prs) = prs!prs_cons_args.[glob_object]
-> (Yes cons_args,prs)
-> (No,prs) -!-> ("r_c_a",si)
SK_GeneratedFunction fun_ptr fun_index
- | fun_index < prs_size//size prs_cons_args
+ | fun_index < prs_size
# (cons_args,prs) = prs!prs_cons_args.[fun_index]
-> (Yes cons_args,prs)
# (FI_Function {gf_cons_args}, fun_heap) = readPtr fun_ptr prs.prs_fun_heap