aboutsummaryrefslogtreecommitdiff
path: root/frontend
diff options
context:
space:
mode:
Diffstat (limited to 'frontend')
-rw-r--r--frontend/analunitypes.icl2
-rw-r--r--frontend/frontend.icl20
-rw-r--r--frontend/overloading.dcl10
-rw-r--r--frontend/overloading.icl903
-rw-r--r--frontend/refmark.icl5
-rw-r--r--frontend/syntax.dcl6
-rw-r--r--frontend/syntax.icl22
-rw-r--r--frontend/trans.dcl2
-rw-r--r--frontend/trans.icl113
9 files changed, 583 insertions, 500 deletions
diff --git a/frontend/analunitypes.icl b/frontend/analunitypes.icl
index cdb3e5c..746fbbc 100644
--- a/frontend/analunitypes.icl
+++ b/frontend/analunitypes.icl
@@ -385,7 +385,7 @@ where
# (pc, _, type_var_heap, td_infos) = propClassOfType at_type group_nr ci type_var_heap td_infos
= prop_classes_of_type_list types tks pcs prop_class_of_type (inc type_index) group_nr ci (cumm_class bitor pc) type_var_heap td_infos
= prop_classes_of_type_list types tks pcs prop_class_of_type (inc type_index) group_nr ci cumm_class type_var_heap td_infos
- prop_classes_of_type_list [] [] _ _ _ _ _ cumm_class type_var_heap td_infos
+ prop_classes_of_type_list [] _ _ _ _ _ _ cumm_class type_var_heap td_infos
= (cumm_class, type_var_heap, td_infos)
propClassOfType (CV tv :@: types) group_nr ci type_var_heap td_infos
diff --git a/frontend/frontend.icl b/frontend/frontend.icl
index 60d2519..d779c35 100644
--- a/frontend/frontend.icl
+++ b/frontend/frontend.icl
@@ -1,6 +1,6 @@
implementation module frontend
-import scanner, parse, postparse, check, type, trans, convertcases, overloading, convertDynamics
+import scanner, parse, postparse, check, type, trans, convertcases, overloading, utilities, convertDynamics
import RWSDebug
:: FrontEndSyntaxTree
@@ -21,7 +21,7 @@ import RWSDebug
frontEndInterface :: !Ident !SearchPaths !*PredefinedSymbols !*HashTable !*Files !*File !*File !*File -> (!*PredefinedSymbols, !*HashTable, !*Files, !*File, !*File, !*File, !Optional *FrontEndSyntaxTree)
frontEndInterface mod_ident search_paths predef_symbols hash_table files error io out
# (ok, mod, hash_table, error, predef_symbols, files)
- = wantModule cWantIclFile mod_ident (hash_table -*-> ("Parsing:", mod_ident)) error search_paths predef_symbols files
+ = wantModule cWantIclFile mod_ident (hash_table ---> ("Parsing:", mod_ident)) error search_paths predef_symbols files
| not ok
= (predef_symbols, hash_table, files, error, io, out, No)
# (ok, mod, nr_of_global_funs, mod_functions, dcl_mod, predef_mod, modules, hash_table, error, predef_symbols, files)
@@ -42,8 +42,9 @@ frontEndInterface mod_ident search_paths predef_symbols hash_table files error i
= (predef_symbols, hash_table, files, error, io, out, No)
# (components, fun_defs) = partitionateFunctions (fun_defs -*-> "partitionateFunctions") [ { ir_from = 0, ir_to = nr_of_global_funs }, icl_instances, icl_specials]
-// (components, fun_defs, io) = showTypes components 0 fun_defs io
-// (components, fun_defs, out) = showComponents components 0 True fun_defs out
+// (components, fun_defs, error) = showTypes components 0 fun_defs error
+// (components, fun_defs, error) = showComponents components 0 True fun_defs error
+// (fun_defs, error) = showFunctions array_instances fun_defs error
(components, fun_defs, predef_symbols, dcl_types, used_conses_in_dynamics, var_heap, type_heaps, expression_heap)
= convertDynamicPatternsIntoUnifyAppls type_code_instances common_defs (components -*-> "convertDynamics") fun_defs predef_symbols
@@ -51,7 +52,7 @@ frontEndInterface mod_ident search_paths predef_symbols hash_table files error i
// (components, fun_defs, error) = showComponents components 0 True fun_defs error
(cleanup_info, acc_args, components, fun_defs, var_heap, expression_heap)
- = analyseGroups common_defs (components -*-> "Transform") fun_defs var_heap expression_heap
+ = analyseGroups common_defs array_instances (components -*-> "Transform") fun_defs var_heap expression_heap
(components, fun_defs, dcl_types, used_conses, var_heap, type_heaps, expression_heap)
= transformGroups cleanup_info components fun_defs acc_args common_defs imported_funs dcl_types used_conses_in_dynamics var_heap type_heaps expression_heap
/*
@@ -116,6 +117,13 @@ newSymbolTable :: !Int -> *{# SymbolTableEntry}
newSymbolTable size
= createArray size { ste_index = NoIndex, ste_def_level = -1, ste_kind = STE_Empty, ste_previous = abort "PreviousPlaceholder"}
+showFunctions :: !IndexRange !*{# FunDef} !*File -> (!*{# FunDef},!*File)
+showFunctions {ir_from, ir_to} fun_defs file
+ = iFoldSt show_function ir_from ir_to (fun_defs, file)
+where
+ show_function fun_index (fun_defs, file)
+ # (fd, fun_defs) = fun_defs![fun_index]
+ = (fun_defs, file <<< fun_index <<< fd <<< '\n')
showComponents :: !*{! Group} !Int !Bool !*{# FunDef} !*File -> (!*{! Group}, !*{# FunDef},!*File)
showComponents comps comp_index show_types fun_defs file
@@ -130,7 +138,7 @@ where
show_component [fun:funs] show_types fun_defs file
#! fun_def = fun_defs.[fun]
| show_types
- = show_component funs show_types fun_defs (file <<< '\n' <<< fun_def)
+ = show_component funs show_types fun_defs (file <<< fun_def.fun_type <<< '\n' <<< fun_def)
= show_component funs show_types fun_defs (file <<< fun_def)
// = show_component funs show_types fun_defs (file <<< fun_def.fun_symb)
diff --git a/frontend/overloading.dcl b/frontend/overloading.dcl
index ddf1835..56f2470 100644
--- a/frontend/overloading.dcl
+++ b/frontend/overloading.dcl
@@ -1,7 +1,7 @@
definition module overloading
import StdEnv
-import syntax, check
+import syntax, check, typesupport
:: InstanceTree = IT_Node !(Global Index) !InstanceTree !InstanceTree | IT_Empty
@@ -44,9 +44,9 @@ tryToSolveOverloading :: ![(Optional [TypeContext], [ExprInfoPtr], IdentPos, Ind
, tci_type_var_heap :: !.TypeVarHeap
}
-removeOverloadedFunctions :: ![(Optional [TypeContext], IdentPos, Index)] ![TypeContext] ![LocalTypePatternVariable] !*{#FunDef} !*ExpressionHeap
+removeOverloadedFunctions :: ![Index] ![LocalTypePatternVariable] !*{#FunDef} !*{! FunctionType} !*ExpressionHeap
!*TypeCodeInfo !*VarHeap !*ErrorAdmin
- -> (!*{#FunDef}, !*ExpressionHeap, !*TypeCodeInfo, !*VarHeap, !*ErrorAdmin)
+ -> (!*{#FunDef}, !*{! FunctionType}, !*ExpressionHeap, !*TypeCodeInfo, !*VarHeap, !*ErrorAdmin)
-updateDynamics :: ![Int] ![TypeContext] ![LocalTypePatternVariable] !*{#FunDef} !*ExpressionHeap !*TypeCodeInfo !*VarHeap !*ErrorAdmin
- -> (!*{#FunDef}, !*ExpressionHeap, !*TypeCodeInfo, !*VarHeap, !*ErrorAdmin)
+updateDynamics :: ![Index] ![LocalTypePatternVariable] !*{#FunDef} !*{! FunctionType} !*ExpressionHeap !*TypeCodeInfo !*VarHeap !*ErrorAdmin
+ -> (!*{#FunDef}, !*{! FunctionType}, !*ExpressionHeap, !*TypeCodeInfo, !*VarHeap, !*ErrorAdmin)
diff --git a/frontend/overloading.icl b/frontend/overloading.icl
index ff0b5b9..25576f4 100644
--- a/frontend/overloading.icl
+++ b/frontend/overloading.icl
@@ -56,11 +56,6 @@ import syntax, check, type, typesupport, utilities, unitype, predef, RWSDebug
, ltpv_new_var :: !VarInfoPtr
}
-:: LocalTypePatternVariables =
- { ltp_var_heap :: !.VarHeap
- , ltp_variables :: ![LocalTypePatternVariable]
- }
-
:: OverloadingState =
{ os_type_heaps :: !.TypeHeaps
, os_var_heap :: !.VarHeap
@@ -100,9 +95,6 @@ instanceError symbol types err
format = { form_properties = cNoProperties, form_attr_position = No }
= { err & ea_file = err.ea_file <<< " \"" <<< symbol <<< "\" no instance available of type " <:: (format, types) <<< '\n' }
-contextError {tc_class={glob_object={ds_ident}}} err
- # err = errorHeading "Overloading error" err
- = { err & ea_file = err.ea_file <<< " unresolved class \"" <<< ds_ident <<< "\" not occurring in specified type\n"}
uniqueError symbol types err
# err = errorHeading "Overloading/Uniqueness error" err
@@ -115,13 +107,9 @@ unboxError type err
format = { form_properties = cNoProperties, form_attr_position = No }
= { err & ea_file = err.ea_file <<< ' ' <:: (format, type) <<< " instance cannot be unboxed\n"}
-get :: !a !(Env a b) -> b | == a
-get elem_id []
- = abort "illegal access"
-get elem_id [b : bs]
- | elem_id == b.bind_src
- = b.bind_dst
- = get elem_id bs
+overloadingError op_symb err
+ # err = errorHeading "Overloading error" err
+ = { err & ea_file = err.ea_file <<< " internal overloading of \"" <<< op_symb <<< "\" could not be solved\n" }
/*
As soon as all overloaded variables in an type context are instantiated, context reduction is carried out.
@@ -129,114 +117,122 @@ get elem_id [b : bs]
ClassApplications.
*/
-simpleSubstitution type type_heaps
- = substitute type type_heaps
+containsContext :: !TypeContext ![TypeContext] -> Bool
+containsContext new_tc []
+ = False
+containsContext new_tc [tc : tcs]
+ = new_tc == tc || containsContext new_tc tcs
+
FoundObject object :== object.glob_module <> NotFound
ObjectNotFound :== { glob_module = NotFound, glob_object = NotFound }
-
-reduceContexts :: ![TypeContext] !{# CommonDefs} !ClassInstanceInfo !*SpecialInstances !*LocalTypePatternVariables
- !*TypeHeaps !*Coercions !*PredefinedSymbols !*ErrorAdmin
- -> *(![ClassApplication], !*SpecialInstances, !*LocalTypePatternVariables, !*TypeHeaps, !*Coercions, !*PredefinedSymbols, !*ErrorAdmin)
-reduceContexts [] defs instance_info special_instances type_pattern_vars type_heaps coercion_env predef_symbols error
- = ([], special_instances, type_pattern_vars, type_heaps, coercion_env, predef_symbols, error)
-reduceContexts [tc : tcs] defs instance_info special_instances type_pattern_vars type_heaps coercion_env predef_symbols error
- # (appl, special_instances, type_pattern_vars, type_heaps, coercion_env, predef_symbols, error)
- = try_to_reduce_context tc defs instance_info special_instances type_pattern_vars type_heaps coercion_env predef_symbols error
- (appls, special_instances, type_pattern_vars, type_heaps, coercion_env, predef_symbols, error)
- = reduceContexts tcs defs instance_info special_instances type_pattern_vars type_heaps coercion_env predef_symbols error
- = ([appl : appls], special_instances, type_pattern_vars, type_heaps, coercion_env, predef_symbols, error)
+reduceContexts :: ![TypeContext] !{# CommonDefs} !ClassInstanceInfo ![TypeContext] !*SpecialInstances ![LocalTypePatternVariable]
+ !(!*VarHeap, !*TypeHeaps) !*Coercions !*PredefinedSymbols !*ErrorAdmin
+ -> *(![ClassApplication], ![TypeContext], !*SpecialInstances, ![LocalTypePatternVariable],
+ !(!*VarHeap, !*TypeHeaps), !*Coercions, !*PredefinedSymbols, !*ErrorAdmin)
+reduceContexts [] defs instance_info new_contexts special_instances type_pattern_vars heaps coercion_env predef_symbols error
+ = ([], new_contexts, special_instances, type_pattern_vars, heaps, coercion_env, predef_symbols, error)
+reduceContexts [tc : tcs] defs instance_info new_contexts special_instances type_pattern_vars heaps coercion_env predef_symbols error
+ # (appl, new_contexts, special_instances, type_pattern_vars, heaps, coercion_env, predef_symbols, error)
+ = try_to_reduce_context tc defs instance_info new_contexts special_instances type_pattern_vars heaps coercion_env predef_symbols error
+ (appls, new_contexts, special_instances, type_pattern_vars, heaps, coercion_env, predef_symbols, error)
+ = reduceContexts tcs defs instance_info new_contexts special_instances type_pattern_vars heaps coercion_env predef_symbols error
+ = ([appl : appls], new_contexts, special_instances, type_pattern_vars, heaps, coercion_env, predef_symbols, error)
where
- try_to_reduce_context :: !TypeContext !{# CommonDefs} !ClassInstanceInfo !*SpecialInstances !*LocalTypePatternVariables
- !*TypeHeaps !*Coercions !*PredefinedSymbols !*ErrorAdmin
- -> *(!ClassApplication, !*SpecialInstances, !*LocalTypePatternVariables, !*TypeHeaps, !*Coercions, !*PredefinedSymbols, !*ErrorAdmin)
- try_to_reduce_context tc=:{tc_class=class_symb=:{glob_object={ds_index},glob_module},tc_types} defs instance_info
- special_instances type_pattern_vars type_heaps coercion_env predef_symbols error
+ try_to_reduce_context :: !TypeContext !{# CommonDefs} !ClassInstanceInfo ![TypeContext] !*SpecialInstances ![LocalTypePatternVariable]
+ !(!*VarHeap, !*TypeHeaps) !*Coercions !*PredefinedSymbols !*ErrorAdmin
+ -> *(!ClassApplication, ![TypeContext], !*SpecialInstances, ![LocalTypePatternVariable], !(!*VarHeap, !*TypeHeaps), !*Coercions, !*PredefinedSymbols, !*ErrorAdmin)
+ try_to_reduce_context tc=:{tc_class=class_symb=:{glob_object={ds_index},glob_module},tc_types} defs instance_info new_contexts
+ special_instances type_pattern_vars (var_heap, type_heaps) coercion_env predef_symbols error
| is_reducible tc_types
| is_predefined_symbol glob_module ds_index PD_TypeCodeClass predef_symbols
- # (red_context, (special_instances, type_pattern_vars)) = reduce_TC_context class_symb (hd tc_types) special_instances type_pattern_vars
- = (red_context, special_instances, type_pattern_vars, type_heaps, coercion_env, predef_symbols, error)
- # (class_appls, special_instances, type_pattern_vars, type_heaps, coercion_env, predef_symbols, error)
- = reduceContext tc defs instance_info special_instances type_pattern_vars
- type_heaps coercion_env predef_symbols error
- = (CA_Instance class_appls, special_instances, type_pattern_vars, type_heaps, coercion_env, predef_symbols, error)
- = (CA_Context tc, special_instances, type_pattern_vars, type_heaps, coercion_env, predef_symbols, error)
-
-/* reduceContext :: !ClassDef !InstanceTree ![Type] !{# CommonDefs} !ClassInstanceInfo !*SpecialInstances !*LocalTypePatternVariables
+ # (red_context, (special_instances, type_pattern_vars, var_heap))
+ = reduce_TC_context class_symb (hd tc_types) special_instances type_pattern_vars var_heap
+ = (red_context, new_contexts, special_instances, type_pattern_vars, (var_heap, type_heaps), coercion_env, predef_symbols, error)
+ # (class_appls, new_contexts, special_instances, type_pattern_vars, heaps, coercion_env, predef_symbols, error)
+ = reduce_context tc defs instance_info new_contexts special_instances type_pattern_vars
+ (var_heap, type_heaps) coercion_env predef_symbols error
+ = (CA_Instance class_appls, new_contexts, special_instances, type_pattern_vars, heaps, coercion_env, predef_symbols, error)
+ | containsContext tc new_contexts
+ = (CA_Context tc, new_contexts, special_instances, type_pattern_vars, (var_heap, type_heaps), coercion_env, predef_symbols, error)
+ # (tc_var, var_heap) = newPtr VI_Empty var_heap
+ = (CA_Context tc, [{ tc & tc_var = tc_var } : new_contexts], special_instances,
+ type_pattern_vars, (var_heap, type_heaps), coercion_env, predef_symbols, error)
+
+/* reduceContext :: !ClassDef !InstanceTree ![Type] !{# CommonDefs} !ClassInstanceInfo !*SpecialInstances ![LocalTypePatternVariable]
!*TypeHeaps !*Coercions !*PredefinedSymbols !*ErrorAdmin
- -> *(![ReducedContext], !*SpecialInstances, !*LocalTypePatternVariables, !*TypeHeaps, !*Coercions, !*PredefinedSymbols, !*ErrorAdmin)
+ -> *(![ReducedContext], !*SpecialInstances, ![LocalTypePatternVariable], !*TypeHeaps, !*Coercions, !*PredefinedSymbols, !*ErrorAdmin)
*/
- reduceContext {tc_class=class_symb=:{glob_object={ds_index},glob_module},tc_types} defs
- instance_info special_instances type_pattern_vars type_heaps coercion_env predef_symbols error
+
+ reduce_context {tc_class=class_symb=:{glob_object={ds_index},glob_module},tc_types} defs
+ instance_info new_contexts special_instances type_pattern_vars heaps coercion_env predef_symbols error
# {class_members,class_context,class_args,class_name} = defs.[glob_module].com_class_defs.[ds_index]
| size class_members > 0
# class_instances = instance_info.[glob_module].[ds_index]
- # ({glob_module,glob_object}, contexts, uni_ok, type_heaps, coercion_env) = find_instance tc_types class_instances defs type_heaps coercion_env
+ # ({glob_module,glob_object}, contexts, uni_ok, (var_heap, type_heaps), coercion_env) = find_instance tc_types class_instances defs heaps coercion_env
| (glob_module <> NotFound) && uni_ok
# {ins_members, ins_class} = defs.[glob_module].com_instance_defs.[glob_object]
| is_predefined_symbol ins_class.glob_module ins_class.glob_object.ds_index PD_ArrayClass predef_symbols &&
is_unboxed_array tc_types predef_symbols
# (rcs_class_context, special_instances, (predef_symbols, type_heaps), error)
= check_unboxed_type glob_module ins_class ins_members tc_types class_members defs special_instances (predef_symbols, type_heaps) error
- = ({ rcs_class_context = rcs_class_context, rcs_constraints_contexts = []},
- special_instances, type_pattern_vars, type_heaps, coercion_env, predef_symbols, error)
- # (appls, special_instances, type_pattern_vars, type_heaps, coercion_env, predef_symbols, error)
- = reduceContexts contexts defs instance_info special_instances type_pattern_vars type_heaps coercion_env predef_symbols error
- (constraints, special_instances, type_pattern_vars, type_heaps, coercion_env, predef_symbols, error)
- = reduceContextsInConstraints tc_types class_args class_context defs instance_info special_instances type_pattern_vars
- type_heaps coercion_env predef_symbols error
-
+ = ({ rcs_class_context = rcs_class_context, rcs_constraints_contexts = []}, new_contexts,
+ special_instances, type_pattern_vars, (var_heap, type_heaps), coercion_env, predef_symbols, error)
+ # (appls, new_contexts, special_instances, type_pattern_vars, heaps, coercion_env, predef_symbols, error)
+ = reduceContexts contexts defs instance_info new_contexts special_instances type_pattern_vars (var_heap, type_heaps) coercion_env predef_symbols error
+ (constraints, new_contexts, special_instances, type_pattern_vars, heaps, coercion_env, predef_symbols, error)
+ = reduce_contexts_in_constraints tc_types class_args class_context defs instance_info new_contexts special_instances type_pattern_vars
+ heaps coercion_env predef_symbols error
= ({ rcs_class_context = { rc_class = ins_class, rc_inst_module = glob_module, rc_inst_members = ins_members,
- rc_types = tc_types, rc_red_contexts = appls }, rcs_constraints_contexts = constraints },
- special_instances, type_pattern_vars, type_heaps, coercion_env, predef_symbols, error)
+ rc_types = tc_types, rc_red_contexts = appls }, rcs_constraints_contexts = constraints }, new_contexts,
+ special_instances, type_pattern_vars, heaps, coercion_env, predef_symbols, error)
# rcs_class_context = { rc_class = class_symb, rc_inst_module = NoIndex, rc_inst_members = {}, rc_types = tc_types, rc_red_contexts = [] }
| glob_module <> NotFound
- = ({ rcs_class_context = rcs_class_context, rcs_constraints_contexts = []},
- special_instances, type_pattern_vars, type_heaps, coercion_env, predef_symbols, uniqueError class_name tc_types error)
- = ({ rcs_class_context = rcs_class_context, rcs_constraints_contexts = []},
- special_instances, type_pattern_vars, type_heaps, coercion_env, predef_symbols, instanceError class_name tc_types error)
- # (constraints, special_instances, type_pattern_vars, type_heaps, coercion_env, predef_symbols, error)
- = reduceContextsInConstraints tc_types class_args class_context defs instance_info special_instances type_pattern_vars
- type_heaps coercion_env predef_symbols error
+ = ({ rcs_class_context = rcs_class_context, rcs_constraints_contexts = []}, new_contexts,
+ special_instances, type_pattern_vars, (var_heap, type_heaps), coercion_env, predef_symbols, uniqueError class_name tc_types error)
+ = ({ rcs_class_context = rcs_class_context, rcs_constraints_contexts = []}, new_contexts,
+ special_instances, type_pattern_vars, (var_heap, type_heaps), coercion_env, predef_symbols, instanceError class_name tc_types error)
+ # (constraints, new_contexts, special_instances, type_pattern_vars, heaps, coercion_env, predef_symbols, error)
+ = reduce_contexts_in_constraints tc_types class_args class_context defs instance_info new_contexts special_instances type_pattern_vars
+ heaps coercion_env predef_symbols error
= ({ rcs_class_context = { rc_class = class_symb, rc_inst_module = NoIndex, rc_inst_members = {}, rc_types = tc_types, rc_red_contexts = [] },
- rcs_constraints_contexts = constraints }, special_instances, type_pattern_vars, type_heaps, coercion_env, predef_symbols, error)
+ rcs_constraints_contexts = constraints }, new_contexts, special_instances, type_pattern_vars, heaps, coercion_env, predef_symbols, error)
- reduceContextsInConstraints types class_args [] defs instance_info special_instances type_pattern_vars type_heaps coercion_env predef_symbols error
- = ([], special_instances, type_pattern_vars, type_heaps, coercion_env, predef_symbols, error)
- reduceContextsInConstraints types class_args class_context defs instance_info special_instances type_pattern_vars
- type_heaps=:{th_vars} coercion_env predef_symbols error
+ reduce_contexts_in_constraints types class_args [] defs instance_info new_contexts special_instances type_pattern_vars heaps coercion_env predef_symbols error
+ = ([], new_contexts, special_instances, type_pattern_vars, heaps, coercion_env, predef_symbols, error)
+ reduce_contexts_in_constraints types class_args class_context defs instance_info new_contexts special_instances type_pattern_vars
+ (var_heap, type_heaps=:{th_vars}) coercion_env predef_symbols error
# th_vars = fold2St (\ type {tv_info_ptr} -> writePtr tv_info_ptr (TVI_Type type)) types class_args th_vars
- (instantiated_context, type_heaps) = substitute class_context { type_heaps & th_vars = th_vars }
- # (cappls, (special_instances, type_pattern_vars, type_var_heap, coercion_env, predef_symbols, error))
+ (instantiated_context, heaps) = fresh_contexts class_context (var_heap, { type_heaps & th_vars = th_vars })
+ # (cappls, (new_contexts, special_instances, type_pattern_vars, heaps, coercion_env, predef_symbols, error))
= mapSt (reduce_context_in_constraint defs instance_info) instantiated_context
- (special_instances, type_pattern_vars, type_heaps, coercion_env, predef_symbols, error)
- = (cappls, special_instances, type_pattern_vars, type_var_heap, coercion_env, predef_symbols, error)
+ (new_contexts, special_instances, type_pattern_vars, heaps, coercion_env, predef_symbols, error)
+ = (cappls, new_contexts, special_instances, type_pattern_vars, heaps, coercion_env, predef_symbols, error)
where
- reduce_context_in_constraint defs instance_info tc (special_instances, type_pattern_vars, type_heaps, coercion_env, predef_symbols, error)
- # (cappls, special_instances, type_pattern_vars, type_var_heap, coercion_env, predef_symbols, error)
- = reduceContext tc defs instance_info special_instances
- type_pattern_vars type_heaps coercion_env predef_symbols error
- = (cappls, (special_instances, type_pattern_vars, type_var_heap, coercion_env, predef_symbols, error))
-
- find_instance co_types (IT_Node this_inst_index=:{glob_object,glob_module} left right) defs type_heaps coercion_env
- # (left_index, types, uni_ok, type_heaps, coercion_env) = find_instance co_types left defs type_heaps coercion_env
+ reduce_context_in_constraint defs instance_info tc (new_contexts, special_instances, type_pattern_vars, heaps, coercion_env, predef_symbols, error)
+ # (cappls, new_contexts, special_instances, type_pattern_vars, heaps, coercion_env, predef_symbols, error)
+ = reduce_context tc defs instance_info new_contexts special_instances type_pattern_vars heaps coercion_env predef_symbols error
+ = (cappls, (new_contexts, special_instances, type_pattern_vars, heaps, coercion_env, predef_symbols, error))
+
+ find_instance co_types (IT_Node this_inst_index=:{glob_object,glob_module} left right) defs heaps coercion_env
+ # (left_index, types, uni_ok, (var_heap, type_heaps), coercion_env) = find_instance co_types left defs heaps coercion_env
| FoundObject left_index
- = (left_index, types, uni_ok, type_heaps, coercion_env)
+ = (left_index, types, uni_ok, (var_heap, type_heaps), coercion_env)
# {ins_type={it_types,it_context}, ins_specials} = defs.[glob_module].com_instance_defs.[glob_object]
(matched, type_heaps) = match defs it_types co_types type_heaps
| matched
- # (subst_context, type_heaps) = simpleSubstitution it_context type_heaps
+ # (subst_context, (var_heap, type_heaps)) = fresh_contexts it_context (var_heap, type_heaps)
(uni_ok, coercion_env, type_heaps) = adjust_type_attributes defs co_types it_types coercion_env type_heaps
(spec_inst, type_heaps) = trySpecializedInstances subst_context (get_specials ins_specials) type_heaps
| FoundObject spec_inst
- = (spec_inst, [], uni_ok, type_heaps, coercion_env)
- = (this_inst_index, subst_context, uni_ok, type_heaps, coercion_env)
- = find_instance co_types right defs type_heaps coercion_env
- find_instance co_types IT_Empty defs type_heaps coercion_env
- = (ObjectNotFound, [], True, type_heaps, coercion_env)
+ = (spec_inst, [], uni_ok, (var_heap, type_heaps), coercion_env)
+ = (this_inst_index, subst_context, uni_ok, (var_heap, type_heaps), coercion_env)
+ = find_instance co_types right defs (var_heap, type_heaps) coercion_env
+ find_instance co_types IT_Empty defs heaps coercion_env
+ = (ObjectNotFound, [], True, heaps, coercion_env)
get_specials (SP_ContextTypes specials) = specials
get_specials SP_None = []
@@ -284,6 +280,15 @@ where
is_reducible [ _ : types]
= is_reducible types
+ fresh_contexts contexts heaps
+ = mapSt fresh_context contexts heaps
+ where
+ fresh_context tc=:{tc_types} (var_heap, type_heaps)
+ # (tc_types, type_heaps) = substitute tc_types type_heaps
+// (tc_var, var_heap) = newPtr VI_Empty var_heap
+// = ({ tc & tc_types = tc_types, tc_var = tc_var }, (var_heap, type_heaps))
+ = ({ tc & tc_types = tc_types }, (var_heap, type_heaps))
+
is_predefined_symbol mod_index symb_index predef_index predef_symbols
# {pds_def,pds_module,pds_ident} = predef_symbols.[predef_index]
= (mod_index == pds_module && symb_index == pds_def)
@@ -330,9 +335,33 @@ where
add_record_to_array_instances :: !TypeSymbIdent !{# DefinedSymbol} !*SpecialInstances -> (!{#DefinedSymbol},!*SpecialInstances)
add_record_to_array_instances record members special_instances=:{si_next_array_member_index,si_array_instances}
+ # may_be_there = look_up_array_instance record si_array_instances
+ = case may_be_there of
+ Yes inst
+ -> (inst.ai_members, special_instances)
+ No
+ # inst = new_array_instance record members si_next_array_member_index
+ -> (inst.ai_members, { special_instances & si_next_array_member_index = si_next_array_member_index + size members,
+ si_array_instances = [ inst : si_array_instances ] })
+ where
+ look_up_array_instance :: !TypeSymbIdent ![ArrayInstance] -> Optional ArrayInstance
+ look_up_array_instance record []
+ = No
+ look_up_array_instance record [inst : insts]
+ | record == inst.ai_record
+ = Yes inst
+ = look_up_array_instance record insts
+
+ new_array_instance :: !TypeSymbIdent !{# DefinedSymbol} !Index -> ArrayInstance
+ new_array_instance record members next_member_index
+ = { ai_members = { { class_member & ds_index = next_inst_index } \\ class_member <-: members & next_inst_index <- [next_member_index .. ]},
+ ai_record = record }
+
+
+/*
# (inst_members, si_array_instances, si_next_array_member_index) = add_array_instance record members si_next_array_member_index si_array_instances
= (inst_members, { special_instances & si_array_instances = si_array_instances, si_next_array_member_index = si_next_array_member_index })
- where
+
add_array_instance :: !TypeSymbIdent !{# DefinedSymbol} !Index !u:[ArrayInstance]
-> (!{#DefinedSymbol}, !u:[ArrayInstance], !Index)
add_array_instance record members next_member_index instances=:[inst : insts]
@@ -349,55 +378,55 @@ where
# ai_members = { { class_member & ds_index = next_inst_index } \\
class_member <-: members & next_inst_index <- [next_member_index .. ]}
= (ai_members, [{ ai_members = ai_members, ai_record = record }], next_member_index + size members)
-
-
- reduce_TC_context type_code_class tc_type special_instances type_pattern_vars
- = reduce_tc_context type_code_class tc_type (special_instances, type_pattern_vars)
+*/
+ reduce_TC_context type_code_class tc_type special_instances type_pattern_vars var_heap
+ = reduce_tc_context type_code_class tc_type (special_instances, type_pattern_vars, var_heap)
where
- reduce_tc_context type_code_class (TA cons_id cons_args) (special_instances=:{si_next_TC_member_index, si_TC_instances}, type_pattern_vars)
+ reduce_tc_context type_code_class (TA cons_id cons_args) (special_instances=:{si_next_TC_member_index, si_TC_instances}, type_pattern_vars, var_heap)
# (inst_index, (si_next_TC_member_index, si_TC_instances))
= addGlobalTCInstance (GTT_Constructor cons_id) (si_next_TC_member_index, si_TC_instances)
(rc_red_contexts, instances) = reduce_TC_contexts type_code_class cons_args
- ({ special_instances & si_next_TC_member_index = si_next_TC_member_index, si_TC_instances = si_TC_instances }, type_pattern_vars)
+ ({ special_instances & si_next_TC_member_index = si_next_TC_member_index, si_TC_instances = si_TC_instances }, type_pattern_vars, var_heap)
= (CA_GlobalTypeCode { tci_index = inst_index, tci_contexts = rc_red_contexts }, instances)
- reduce_tc_context type_code_class (TB basic_type) (special_instances=:{si_next_TC_member_index, si_TC_instances}, type_pattern_vars)
+ reduce_tc_context type_code_class (TB basic_type) (special_instances=:{si_next_TC_member_index, si_TC_instances}, type_pattern_vars, var_heap)
# (inst_index, (si_next_TC_member_index, si_TC_instances))
= addGlobalTCInstance (GTT_Basic basic_type) (si_next_TC_member_index, si_TC_instances)
= (CA_GlobalTypeCode { tci_index = inst_index, tci_contexts = [] },
- ({ special_instances & si_next_TC_member_index = si_next_TC_member_index, si_TC_instances = si_TC_instances }, type_pattern_vars))
+ ({ special_instances & si_next_TC_member_index = si_next_TC_member_index, si_TC_instances = si_TC_instances }, type_pattern_vars, var_heap))
- reduce_tc_context type_code_class (arg_type --> result_type) (special_instances=:{si_next_TC_member_index, si_TC_instances}, type_pattern_vars)
+ reduce_tc_context type_code_class (arg_type --> result_type) (special_instances=:{si_next_TC_member_index, si_TC_instances}, type_pattern_vars, var_heap)
# (inst_index, (si_next_TC_member_index, si_TC_instances))
= addGlobalTCInstance GTT_Function (si_next_TC_member_index, si_TC_instances)
(rc_red_contexts, instances) = reduce_TC_contexts type_code_class [arg_type, result_type]
- ({ special_instances & si_next_TC_member_index = si_next_TC_member_index, si_TC_instances = si_TC_instances }, type_pattern_vars)
+ ({ special_instances & si_next_TC_member_index = si_next_TC_member_index, si_TC_instances = si_TC_instances }, type_pattern_vars, var_heap)
= (CA_GlobalTypeCode { tci_index = inst_index, tci_contexts = rc_red_contexts }, instances)
- reduce_tc_context type_code_class (TempQV var_number) (special_instances, type_pattern_vars)
- # (inst_var, type_pattern_vars) = addLocalTCInstance var_number type_pattern_vars
- = (CA_LocalTypeCode inst_var, (special_instances, type_pattern_vars))
+ reduce_tc_context type_code_class (TempQV var_number) (special_instances, type_pattern_vars, var_heap)
+ # (inst_var, (type_pattern_vars, var_heap)) = addLocalTCInstance var_number (type_pattern_vars, var_heap)
+ = (CA_LocalTypeCode inst_var, (special_instances, type_pattern_vars, var_heap))
- reduce_tc_context type_code_class (TempV var_number) instances
- = (CA_Context { tc_class = type_code_class, tc_types = [TempV var_number], tc_var = nilPtr }, instances)
+ reduce_tc_context type_code_class (TempV var_number) (special_instances, type_pattern_vars, var_heap)
+// # (tc_var, var_heap) = newPtr VI_Empty var_heap
+ = (CA_Context { tc_class = type_code_class, tc_types = [TempV var_number], tc_var = nilPtr }, (special_instances, type_pattern_vars, var_heap))
reduce_TC_contexts type_code_class cons_args instances
= mapSt (\{at_type} -> reduce_tc_context type_code_class at_type) cons_args instances
-addLocalTCInstance var_number ltp=:{ltp_variables=instances=:[inst : insts], ltp_var_heap}
+addLocalTCInstance var_number (instances=:[inst : insts], ltp_var_heap)
# cmp = var_number =< inst.ltpv_var
| cmp == Equal
- = (inst.ltpv_new_var, ltp)
+ = (inst.ltpv_new_var, (instances, ltp_var_heap))
| cmp == Smaller
# (ltpv_new_var, ltp_var_heap) = newPtr VI_Empty ltp_var_heap
- = (ltpv_new_var, { ltp_variables = [{ ltpv_new_var = ltpv_new_var, ltpv_var = var_number } : instances ], ltp_var_heap = ltp_var_heap })
- # (found_var, ltp) = addLocalTCInstance var_number { ltp & ltp_variables = insts }
- = (found_var, { ltp & ltp_variables = [inst :ltp.ltp_variables ] })
-addLocalTCInstance var_number {ltp_variables = [], ltp_var_heap}
+ = (ltpv_new_var, ( [{ ltpv_new_var = ltpv_new_var, ltpv_var = var_number } : instances ], ltp_var_heap ))
+ # (found_var, (insts, ltp_var_heap)) = addLocalTCInstance var_number (insts, ltp_var_heap)
+ = (found_var, ([inst : insts ], ltp_var_heap))
+addLocalTCInstance var_number ([], ltp_var_heap)
# (ltpv_new_var, ltp_var_heap) = newPtr VI_Empty ltp_var_heap
- = (ltpv_new_var, { ltp_variables = [{ ltpv_new_var = ltpv_new_var, ltpv_var = var_number }], ltp_var_heap = ltp_var_heap })
+ = (ltpv_new_var, ([{ ltpv_new_var = ltpv_new_var, ltpv_var = var_number }], ltp_var_heap))
addGlobalTCInstance type_of_TC (next_member_index, instances=:[inst : insts])
# cmp = type_of_TC =< inst.gtci_type
@@ -528,60 +557,74 @@ where
tryToSolveOverloading :: ![(Optional [TypeContext], [ExprInfoPtr], IdentPos, Index)] !{# CommonDefs } !ClassInstanceInfo !*Coercions !*OverloadingState
-> (![TypeContext], !*Coercions, ![LocalTypePatternVariable], !*OverloadingState)
tryToSolveOverloading ocs defs instance_info coercion_env os
- = foldSt (try_to_solve_overloading defs instance_info) ocs ([], coercion_env, [], os)
+ # (reduced_contexts, contexts, coercion_env, type_pattern_vars, os) = foldSt (reduce_contexts defs instance_info) ocs
+ ([], [], coercion_env, [], os)
+ (contexts, os_var_heap) = foldSt add_spec_contexts ocs (contexts, os.os_var_heap)
+ (contexts, os_type_heaps) = remove_sub_classes contexts os.os_type_heaps
+ (os_type_heaps, os_symbol_heap) = foldSt (convert_dictionaries defs contexts) reduced_contexts (os_type_heaps, os.os_symbol_heap)
+ = (contexts, coercion_env, type_pattern_vars, { os & os_type_heaps = os_type_heaps, os_symbol_heap = os_symbol_heap, os_var_heap = os_var_heap })
+
where
+ reduce_contexts defs instance_info (opt_spec_contexts, expr_ptrs, pos, index) rc_state
+ = foldSt (reduce_contexts_of_application defs instance_info) expr_ptrs rc_state
- try_to_solve_overloading defs instance_info (fun_context, call_ptrs, location, _) (contexts, coercion_env, type_pattern_vars, os=:{os_error})
- | isEmpty call_ptrs
- = (contexts, coercion_env, type_pattern_vars, os)
- # os = { os & os_error = setErrorAdmin location os_error }
-// ---> ("try_to_solve_overloading", call_ptrs)
- = case fun_context of
- Yes specified_context
- # (_, coercion_env, type_pattern_vars, os)
- = reduce_and_simplify_contexts call_ptrs defs instance_info True specified_context coercion_env type_pattern_vars os
- -> (contexts, coercion_env, type_pattern_vars, os)
-// ---> ("try_to_solve_overloading (Yes ...)", location, specified_context)
- No
- -> reduce_and_simplify_contexts call_ptrs defs instance_info False contexts coercion_env type_pattern_vars os
-// ---> ("try_to_solve_overloading (No)", location, contexts)
-
- reduce_and_simplify_contexts :: ![ExprInfoPtr] !{# CommonDefs } !ClassInstanceInfo !Bool ![TypeContext] !*Coercions ![LocalTypePatternVariable]
- !*OverloadingState -> (![TypeContext], !*Coercions, ![LocalTypePatternVariable], !*OverloadingState)
- reduce_and_simplify_contexts [over_info_ptr : ocs] defs instance_info has_context contexts coercion_env type_pattern_vars os=:{os_symbol_heap, os_type_heaps}
- # (expr_info, os_symbol_heap) = readPtr over_info_ptr os_symbol_heap
- {oc_symbol, oc_context, oc_specials} = case expr_info of
- EI_Overloaded over_info -> over_info
- _ -> abort ("reduce_and_simplify_contexts" <<- expr_info)
+ add_spec_contexts (Yes spec_context, expr_ptrs, pos, index) contexts_and_var_heap
+ = foldSt add_spec_context spec_context contexts_and_var_heap
+ where
+ add_spec_context tc (contexts, var_heap)
+ | containsContext tc contexts
+ = (contexts, var_heap)
+ # (tc_var, var_heap) = newPtr VI_Empty var_heap
+ = ([{ tc & tc_var = tc_var } : contexts], var_heap)
+ add_spec_contexts (No, expr_ptrs, pos, index) contexts_and_var_heap
+ = contexts_and_var_heap
+
+ reduce_contexts_of_application :: !{# CommonDefs } !ClassInstanceInfo !ExprInfoPtr
+ ([(SymbIdent, ExprInfoPtr,[ClassApplication])], ![TypeContext], !*Coercions, ![LocalTypePatternVariable], !*OverloadingState)
+ -> ([(SymbIdent, ExprInfoPtr,[ClassApplication])], ![TypeContext], !*Coercions, ![LocalTypePatternVariable], !*OverloadingState)
+ reduce_contexts_of_application defs instance_info over_info_ptr (reduced_calls, new_contexts, coercion_env, type_pattern_vars,
+ os=:{os_symbol_heap,os_type_heaps,os_var_heap,os_special_instances,os_error,os_predef_symbols})
+ # (EI_Overloaded {oc_symbol, oc_context, oc_specials}, os_symbol_heap) = readPtr over_info_ptr os_symbol_heap
(glob_fun, os_type_heaps) = trySpecializedInstances oc_context oc_specials os_type_heaps
| FoundObject glob_fun
# os_symbol_heap = os_symbol_heap <:= (over_info_ptr, EI_Instance {glob_module = glob_fun.glob_module, glob_object =
{ ds_ident = oc_symbol.symb_name, ds_arity = 0, ds_index = glob_fun.glob_object }} [])
- = reduce_and_simplify_contexts ocs defs instance_info has_context contexts coercion_env type_pattern_vars
- { os & os_type_heaps = os_type_heaps, os_symbol_heap = os_symbol_heap }
- # (appls, os_special_instances, {ltp_var_heap, ltp_variables}, os_type_heaps, coercion_env, os_predef_symbols, os_error)
- = reduceContexts oc_context defs instance_info os.os_special_instances {ltp_var_heap = os.os_var_heap, ltp_variables = type_pattern_vars}
- os_type_heaps coercion_env os.os_predef_symbols os.os_error
- | os_error.ea_ok
- # (contexts, os_type_heaps, os_var_heap, os_symbol_heap, os_error)
- = simplifyOverloadedCall oc_symbol over_info_ptr appls defs has_context contexts os_type_heaps ltp_var_heap os_symbol_heap os_error
- = reduce_and_simplify_contexts ocs defs instance_info has_context contexts coercion_env ltp_variables { os &
- os_type_heaps = os_type_heaps, os_var_heap = os_var_heap, os_symbol_heap = os_symbol_heap,
- os_predef_symbols = os_predef_symbols, os_special_instances = os_special_instances, os_error = os_error }
-
- = reduce_and_simplify_contexts ocs defs instance_info has_context contexts coercion_env ltp_variables
- { os & os_type_heaps = os_type_heaps, os_predef_symbols = os_predef_symbols, os_symbol_heap = os_symbol_heap,
- os_special_instances = os_special_instances, os_error = os_error, os_var_heap = ltp_var_heap}
- reduce_and_simplify_contexts [] defs instance_info has_context contexts coercion_env type_pattern_vars os
- = (contexts, coercion_env, type_pattern_vars, os)
-
-/*
-RecordName = { id_name = "_Record", id_info = nilPtr }
-
-InternalSelectSymbol = { symb_name = {id_name = "_Select", id_info = nilPtr },
- symb_kind = SK_InternalFunction (-1), symb_arity = 2 }
-*/
-
+ = (reduced_calls, new_contexts, coercion_env, type_pattern_vars, { os & os_type_heaps = os_type_heaps, os_symbol_heap = os_symbol_heap })
+ | otherwise
+ # (class_applications, new_contexts, os_special_instances, type_pattern_vars,
+ (os_var_heap, os_type_heaps), coercion_env, os_predef_symbols, os_error)
+ = reduceContexts oc_context defs instance_info new_contexts os_special_instances type_pattern_vars
+ (os_var_heap, os_type_heaps) coercion_env os_predef_symbols os_error
+ = ([ (oc_symbol, over_info_ptr, class_applications) : reduced_calls ], new_contexts, coercion_env, type_pattern_vars,
+ { os & os_type_heaps = os_type_heaps, os_symbol_heap = os_symbol_heap, os_var_heap = os_var_heap,
+ os_special_instances = os_special_instances, os_error = os_error, os_predef_symbols = os_predef_symbols })
+
+ remove_sub_classes contexts type_heaps
+ # (sub_classes, type_heaps) = foldSt generate_subclasses contexts ([], type_heaps)
+ = (foldSt (remove_doubles sub_classes) contexts [], type_heaps)
+
+ generate_subclasses {tc_class={glob_object={ds_index},glob_module},tc_types} (sub_classes, type_heaps)
+ # {class_args,class_members,class_context,class_dictionary} = defs.[glob_module].com_class_defs.[ds_index]
+ th_vars = fold2St set_type class_args tc_types type_heaps.th_vars
+ = foldSt subst_context class_context (sub_classes, { type_heaps & th_vars = th_vars })
+ where
+ set_type {tv_info_ptr} type type_var_heap
+ = type_var_heap <:= (tv_info_ptr, TVI_Type type)
+
+ subst_context class_context (sub_classes, type_heaps)
+ # (sub_class, type_heaps) = substitute class_context type_heaps
+ = ([sub_class : sub_classes], type_heaps)
+
+ remove_doubles sub_classes tc context
+ | containsContext tc sub_classes
+ = context
+ = [tc : context]
+
+ convert_dictionaries :: !{# CommonDefs } ![TypeContext] !(!SymbIdent,!ExprInfoPtr,![ClassApplication]) !(!*TypeHeaps, !*ExpressionHeap)
+ -> !(!*TypeHeaps, !*ExpressionHeap)
+ convert_dictionaries defs contexts (oc_symbol, over_info_ptr, class_applications) heaps
+ = convertOverloadedCall defs contexts oc_symbol over_info_ptr class_applications heaps
+
selectFromDictionary dict_mod dict_index member_index defs
# (RecordType {rt_fields}) = defs.[dict_mod].com_type_defs.[dict_index].td_rhs
{ fs_name, fs_index } = rt_fields.[member_index]
@@ -590,40 +633,33 @@ selectFromDictionary dict_mod dict_index member_index defs
getDictionaryConstructor {glob_module, glob_object = {ds_ident,ds_index}} defs
# {class_dictionary} = defs.[glob_module].com_class_defs.[ds_index]
(RecordType {rt_constructor}) = defs.[glob_module].com_type_defs.[class_dictionary.ds_index].td_rhs
- = rt_constructor
+ = rt_constructor
-
-simplifyOverloadedCall {symb_kind = SK_OverloadedFunction {glob_module,glob_object}, symb_arity} expr_info_ptr [class_appl:class_appls]
- defs has_context contexts type_heaps var_heap symbol_heap error
+convertOverloadedCall :: !{#CommonDefs} ![TypeContext] !SymbIdent !ExprInfoPtr ![ClassApplication] !(!*TypeHeaps, !*ExpressionHeap)
+ -> (!*TypeHeaps, !*ExpressionHeap)
+convertOverloadedCall defs contexts {symb_name,symb_kind = SK_OverloadedFunction {glob_module,glob_object}, symb_arity} expr_ptr [class_appl:class_appls] heaps
# mem_def = defs.[glob_module].com_member_defs.[glob_object]
- # (class_exprs, (contexts, heaps, error)) = convertClassApplsToExpressions defs has_context class_appls (contexts, (type_heaps, var_heap, symbol_heap), error)
- (inst_expr, contexts, (type_heaps, var_heap, symbol_heap), error)
- = adjust_member_application mem_def symb_arity class_appl class_exprs defs has_context contexts heaps error
- = (contexts, type_heaps, var_heap, symbol_heap <:= (expr_info_ptr, inst_expr), error)
-// ---> ("simplifyOverloadedCall", expr_info_ptr, inst_expr)
-
+ (class_exprs, heaps) = convertClassApplsToExpressions defs contexts class_appls heaps
+ (inst_expr, (type_heaps, expr_heap)) = adjust_member_application defs contexts mem_def symb_arity class_appl class_exprs heaps
+ = (type_heaps, expr_heap <:= (expr_ptr, inst_expr))
where
- adjust_member_application {me_symb,me_offset,me_class} symb_arity (CA_Instance red_contexts) class_exprs defs has_context contexts heaps error
+ adjust_member_application defs contexts {me_symb,me_offset,me_class} symb_arity (CA_Instance red_contexts) class_exprs heaps
# ({glob_module,glob_object}, red_contexts) = find_instance_of_member me_class me_offset red_contexts
- (exprs, (contexts, heaps, error)) = convertClassApplsToExpressions defs has_context red_contexts (contexts, heaps, error)
+ (exprs, heaps) = convertClassApplsToExpressions defs contexts red_contexts heaps
class_exprs = exprs ++ class_exprs
- = (EI_Instance { glob_module = glob_module, glob_object = { ds_ident = me_symb, ds_arity = length class_exprs, ds_index = glob_object }}
- class_exprs, contexts, heaps, error)
- adjust_member_application {me_symb,me_offset,me_class={glob_module,glob_object}} symb_arity (CA_Context tc)
- class_exprs defs has_context contexts (type_heaps, var_heap, symbol_heap) error
- # (class_context, address, contexts, type_heaps, var_heap, error)
- = determineContextAddress tc has_context contexts defs type_heaps var_heap error
+ = (EI_Instance { glob_module = glob_module, glob_object = { ds_ident = me_symb, ds_arity = length class_exprs, ds_index = glob_object }} class_exprs,
+ heaps)
+ adjust_member_application defs contexts {me_symb,me_offset,me_class={glob_module,glob_object}} symb_arity (CA_Context tc) class_exprs (type_heaps, expr_heap)
+ # (class_context, address, type_heaps) = determineContextAddress contexts defs tc type_heaps
{class_dictionary={ds_index}} = defs.[glob_module].com_class_defs.[glob_object]
selector = selectFromDictionary glob_module ds_index me_offset defs
- = (EI_Selection (generateClassSelection address [RecordSelection selector me_offset]) class_context.tc_var class_exprs,
- contexts, (type_heaps, var_heap, symbol_heap), error)
-// ---> ("adjust_member_application", contexts, class_context.tc_var)
-
- adjust_member_application _ _ (CA_GlobalTypeCode {tci_index,tci_contexts}) _ defs has_context contexts heaps error
- # (exprs, (contexts, heaps, error)) = convertClassApplsToExpressions defs has_context tci_contexts (contexts, heaps, error)
- = (EI_TypeCode (TCE_Constructor tci_index (map expressionToTypeCodeExpression exprs)), contexts, heaps, error)
- adjust_member_application _ _ (CA_LocalTypeCode new_var_ptr) _ defs has_context contexts heaps error
- = (EI_TypeCode (TCE_Var new_var_ptr), contexts, heaps, error)
+ = (EI_Selection (generateClassSelection address [RecordSelection selector me_offset]) class_context.tc_var class_exprs, (type_heaps, expr_heap))
+
+ adjust_member_application defs contexts _ _ (CA_GlobalTypeCode {tci_index,tci_contexts}) _ heaps
+ # (exprs, heaps) = convertClassApplsToExpressions defs contexts tci_contexts heaps
+ = (EI_TypeCode (TCE_Constructor tci_index (map expressionToTypeCodeExpression exprs)), heaps)
+ adjust_member_application defs contexts _ _ (CA_LocalTypeCode new_var_ptr) _ heaps
+ = (EI_TypeCode (TCE_Var new_var_ptr), heaps)
find_instance_of_member me_class me_offset { rcs_class_context = {rc_class, rc_inst_module, rc_inst_members, rc_red_contexts}, rcs_constraints_contexts}
| rc_class.glob_module == me_class.glob_module && rc_class.glob_object.ds_index == me_class.glob_object
@@ -634,16 +670,12 @@ where
= find_instance_of_member me_class me_offset {rcs & rcs_constraints_contexts = rcs_constraints_contexts ++ rcss}
find_instance_of_member_in_constraints me_class me_offset []
= abort "Error in module overloading: find_instance_of_member_in_constraints\n"
-
-simplifyOverloadedCall {symb_kind = SK_TypeCode} expr_info_ptr class_appls defs has_context contexts type_heaps var_heap symbol_heap error
- # (class_expressions, (contexts, (type_heaps, var_heap, symbol_heap), error))
- = convertClassApplsToExpressions defs has_context class_appls (contexts, (type_heaps, var_heap, symbol_heap), error)
- = (contexts, type_heaps, var_heap, symbol_heap <:= (expr_info_ptr, EI_TypeCodes (map expressionToTypeCodeExpression class_expressions)), error)
-simplifyOverloadedCall _ expr_info_ptr appls defs has_context contexts type_heaps var_heap symbol_heap error
- # (class_expressions, (contexts, (type_heaps, var_heap, symbol_heap), error))
- = convertClassApplsToExpressions defs has_context appls (contexts, (type_heaps, var_heap, symbol_heap), error)
- = (contexts, type_heaps, var_heap, symbol_heap <:= (expr_info_ptr, EI_Context class_expressions), error)
-// ---> ("simplifyOverloadedCall", expr_info_ptr, class_expressions)
+convertOverloadedCall defs contexts {symb_kind = SK_TypeCode} expr_info_ptr class_appls heaps
+ # (class_expressions, (type_heaps, expr_heap)) = convertClassApplsToExpressions defs contexts class_appls heaps
+ = (type_heaps, expr_heap <:= (expr_info_ptr, EI_TypeCodes (map expressionToTypeCodeExpression class_expressions)))
+convertOverloadedCall defs contexts {symb_name} expr_info_ptr appls heaps
+ # (class_expressions, (type_heaps, expr_heap)) = convertClassApplsToExpressions defs contexts appls heaps
+ = (type_heaps, expr_heap <:= (expr_info_ptr, EI_Context class_expressions))
expressionToTypeCodeExpression (TypeCodeExpression texpr) = texpr
@@ -652,35 +684,33 @@ expressionToTypeCodeExpression (Var {var_info_ptr}) = TCE_Var var_info_ptr
generateClassSelection address last_selectors
= mapAppend (\(off_set,selector) -> RecordSelection selector off_set) address last_selectors
-convertClassApplsToExpressions defs has_context cl_appls contexts_heaps_error
- = mapSt (convert_class_appl_to_expression defs has_context) cl_appls contexts_heaps_error
+convertClassApplsToExpressions defs contexts cl_appls heaps
+ = mapSt (convert_class_appl_to_expression defs contexts) cl_appls heaps
where
- convert_class_appl_to_expression defs has_context (CA_Instance {rcs_class_context,rcs_constraints_contexts}) contexts_heaps_error
- # (class_symb, class_members, instance_types, contexts_heaps_error)
- = convert_reduced_context_to_expression defs has_context rcs_class_context contexts_heaps_error
- (members_of_constraints, (contexts, (type_heaps, var_heap, expr_heap), error))
- = convert_list_of_reduced_contexts_to_expressions defs has_context rcs_constraints_contexts contexts_heaps_error
+ convert_class_appl_to_expression defs contexts (CA_Instance {rcs_class_context,rcs_constraints_contexts}) heaps
+ # (class_symb, class_members, instance_types, heaps)
+ = convert_reduced_context_to_expression defs contexts rcs_class_context heaps
+ (members_of_constraints, (type_heaps, expr_heap))
+ = convert_list_of_reduced_contexts_to_expressions defs contexts rcs_constraints_contexts heaps
{ds_ident,ds_index,ds_arity} = getDictionaryConstructor class_symb defs
record_symbol = { symb_name = ds_ident, symb_kind = SK_Constructor {glob_module = class_symb.glob_module, glob_object = ds_index}, symb_arity = ds_arity }
(app_info_ptr, expr_heap) = newPtr (EI_ClassTypes instance_types) expr_heap
- = (App { app_symb = record_symbol, app_args = class_members ++ members_of_constraints, app_info_ptr = app_info_ptr },
- (contexts, (type_heaps, var_heap, expr_heap), error))
- convert_class_appl_to_expression defs has_context (CA_Context tc) (contexts, (type_heaps, var_heap, expr_heap), error)
- # (class_context, context_address, contexts, type_heaps, var_heap, error)
- = determineContextAddress tc has_context contexts defs type_heaps var_heap error
- | isEmpty context_address // ---> ("convert_class_appl_to_expression", tc , contexts, class_context)
- = (ClassVariable class_context.tc_var, (contexts, (type_heaps, var_heap, expr_heap), error))
- = (Selection No (ClassVariable class_context.tc_var) (generateClassSelection context_address []), (contexts, (type_heaps, var_heap, expr_heap), error))
- convert_class_appl_to_expression defs has_context (CA_LocalTypeCode new_var_ptr) contexts_heaps_error
- = (TypeCodeExpression (TCE_Var new_var_ptr), contexts_heaps_error)
- convert_class_appl_to_expression defs has_context (CA_GlobalTypeCode {tci_index,tci_contexts}) contexts_heaps_error
- # (exprs, contexts_heaps_error) = convertClassApplsToExpressions defs has_context tci_contexts contexts_heaps_error
- = (TypeCodeExpression (TCE_Constructor tci_index (map expressionToTypeCodeExpression exprs)), contexts_heaps_error)
-
- convert_reduced_context_to_expression defs has_context {rc_class, rc_inst_module, rc_inst_members, rc_red_contexts, rc_types} contexts_heaps_error
- # (expressions, contexts_heaps_error) = convertClassApplsToExpressions defs has_context rc_red_contexts contexts_heaps_error
+ = (App { app_symb = record_symbol, app_args = class_members ++ members_of_constraints, app_info_ptr = app_info_ptr }, (type_heaps, expr_heap))
+ convert_class_appl_to_expression defs contexts (CA_Context tc) (type_heaps, expr_heap)
+ # (class_context, context_address, type_heaps) = determineContextAddress contexts defs tc type_heaps
+ | isEmpty context_address
+ = (ClassVariable class_context.tc_var, (type_heaps, expr_heap))
+ = (Selection No (ClassVariable class_context.tc_var) (generateClassSelection context_address []), (type_heaps, expr_heap))
+ convert_class_appl_to_expression defs contexts (CA_LocalTypeCode new_var_ptr) heaps
+ = (TypeCodeExpression (TCE_Var new_var_ptr), heaps)
+ convert_class_appl_to_expression defs contexts (CA_GlobalTypeCode {tci_index,tci_contexts}) heaps
+ # (exprs, heaps) = convertClassApplsToExpressions defs contexts tci_contexts heaps
+ = (TypeCodeExpression (TCE_Constructor tci_index (map expressionToTypeCodeExpression exprs)), heaps)
+
+ convert_reduced_context_to_expression defs contexts {rc_class, rc_inst_module, rc_inst_members, rc_red_contexts, rc_types} heaps
+ # (expressions, heaps) = convertClassApplsToExpressions defs contexts rc_red_contexts heaps
members = build_class_members 0 rc_inst_members rc_inst_module expressions (length expressions)
- = (rc_class, members, rc_types, contexts_heaps_error)
+ = (rc_class, members, rc_types, heaps)
where
build_class_members mem_offset ins_members mod_index class_arguments arity
| mem_offset == size ins_members
@@ -690,54 +720,36 @@ where
= [ App { app_symb = { symb_name = ds_ident, symb_kind = SK_Function { glob_object = ds_index, glob_module = mod_index },
symb_arity = arity }, app_args = class_arguments, app_info_ptr = nilPtr } : expressions ]
- convert_list_of_reduced_contexts_to_expressions defs has_context list_of_rcs contexts_heaps_error
- = mapSt (convert_reduced_contexts_to_expressions defs has_context) list_of_rcs contexts_heaps_error
-
- convert_reduced_contexts_to_expressions defs has_context {rcs_class_context,rcs_constraints_contexts} contexts_heaps_error
- # (class_symb, rc_exprs, instance_types, contexts_heaps_error)
- = convert_reduced_context_to_expression defs has_context rcs_class_context contexts_heaps_error
- (rcs_exprs, (contexts, (type_heaps, var_heap, expr_heap), error))
- = convert_list_of_reduced_contexts_to_expressions defs has_context rcs_constraints_contexts contexts_heaps_error
+ convert_list_of_reduced_contexts_to_expressions defs contexts list_of_rcs heaps
+ = mapSt (convert_reduced_contexts_to_expressions defs contexts) list_of_rcs heaps
+
+ convert_reduced_contexts_to_expressions defs contexts {rcs_class_context,rcs_constraints_contexts} heaps
+ # (class_symb, rc_exprs, instance_types, heaps)
+ = convert_reduced_context_to_expression defs contexts rcs_class_context heaps
+ (rcs_exprs, (type_heaps, expr_heap))
+ = convert_list_of_reduced_contexts_to_expressions defs contexts rcs_constraints_contexts heaps
{ds_ident,ds_index,ds_arity} = getDictionaryConstructor class_symb defs
record_symbol = { symb_name = ds_ident, symb_kind = SK_Constructor {glob_module = class_symb.glob_module, glob_object = ds_index}, symb_arity = ds_arity }
(app_info_ptr, expr_heap) = newPtr (EI_ClassTypes instance_types) expr_heap
rc_record = App { app_symb = record_symbol, app_args = rc_exprs ++ rcs_exprs, app_info_ptr = app_info_ptr }
- = (rc_record, (contexts, (type_heaps, var_heap, expr_heap), error))
-
-/*
-createBoundVar :: !TypeContext -> BoundVar
-createBoundVar {tc_class={glob_object={ds_ident}}, tc_var}
- = { var_name = { id_name = "_v" +++ ds_ident.id_name, id_info = nilPtr }, var_info_ptr = tc_var, var_expr_ptr = nilPtr }
-
-createFreeVar :: !TypeContext -> FreeVar
-createFreeVar {tc_class={glob_object={ds_ident}}, tc_var}
- | isNilPtr tc_var
- = abort ("createFreeVar : NIL ptr" ---> ds_ident)
- = { fv_name = { id_name = "_v" +++ ds_ident.id_name, id_info = nilPtr }, fv_info_ptr = tc_var, fv_def_level = NotALevel, fv_count = -1 }
-*/
+ = (rc_record, (type_heaps, expr_heap))
+
-determineContextAddress :: !TypeContext !Bool ![TypeContext] !{#CommonDefs} !*TypeHeaps !*VarHeap !*ErrorAdmin
- -> (!TypeContext, ![(Int, Global DefinedSymbol)], ![TypeContext], !*TypeHeaps, !*VarHeap, !*ErrorAdmin)
-determineContextAddress tc has_context contexts defs type_heaps var_heap error
- = determine_context_and_address tc contexts has_context contexts defs type_heaps var_heap error
+determineContextAddress :: ![TypeContext] !{#CommonDefs} !TypeContext !*TypeHeaps
+ -> (!TypeContext, ![(Int, Global DefinedSymbol)], !*TypeHeaps)
+determineContextAddress contexts defs this_context type_heaps
+ = look_up_context_and_address this_context contexts defs type_heaps
where
- determine_context_and_address :: !TypeContext ![TypeContext] !Bool ![TypeContext] !{#CommonDefs} !*TypeHeaps !*VarHeap !*ErrorAdmin
- -> (!TypeContext, ![(Int, Global DefinedSymbol)], ![TypeContext], !*TypeHeaps, !*VarHeap, !*ErrorAdmin)
- determine_context_and_address context [] has_context contexts defs type_heaps var_heap error
- | has_context
- = (context, [], contexts, type_heaps, var_heap, contextError context error)
- #! (new_info_ptr, var_heap) = newPtr VI_Empty var_heap
- # new_context = { context & tc_var = new_info_ptr}
- = (new_context, [], [new_context : contexts], type_heaps, var_heap, error)
- determine_context_and_address context [tc : tcs] has_context contexts defs type_heaps var_heap error
- #! (may_be_addres, type_heaps) = determine_address context tc [] defs type_heaps
+ look_up_context_and_address :: !TypeContext ![TypeContext] !{#CommonDefs} !*TypeHeaps -> (TypeContext, [(Int, Global DefinedSymbol)], !*TypeHeaps)
+ look_up_context_and_address context [] defs type_heaps
+ = abort "look_up_context_and_address (overloading.icl)"
+ look_up_context_and_address this_context [tc : tcs] defs type_heaps
+ #! (may_be_addres, type_heaps) = determine_address this_context tc [] defs type_heaps
= case may_be_addres of
Yes address
- | isNilPtr tc.tc_var
- -> abort ("determine_context_and_address" ---> tc.tc_class.glob_object.ds_ident)
- -> (tc, address, contexts, type_heaps, var_heap, error)
+ -> (tc, address, type_heaps)
No
- -> determine_context_and_address context tcs has_context contexts defs type_heaps var_heap error
+ -> look_up_context_and_address this_context tcs defs type_heaps
determine_address :: !TypeContext !TypeContext ![(Int, Global DefinedSymbol)] !{#CommonDefs} !*TypeHeaps
-> (!Optional [(Int, Global DefinedSymbol)],!*TypeHeaps)
@@ -749,101 +761,111 @@ where
th_vars = foldr2 (\{tv_info_ptr} type -> writePtr tv_info_ptr (TVI_Type type)) th_vars class_args tc2.tc_types
(super_instances, type_heaps) = substitute class_context { type_heaps & th_vars = th_vars }
= find_super_instance tc1 super_instances (size class_members) address glob_module class_dictionary.ds_index defs type_heaps
+ where
+ find_super_instance :: !TypeContext ![TypeContext] !Index ![(Int, Global DefinedSymbol)] !Index !Index !{#CommonDefs} !*TypeHeaps
+ -> (!Optional [(Int, Global DefinedSymbol)],!*TypeHeaps)
+ find_super_instance context [] tc_index address dict_mod dict_index defs type_heaps
+ = (No, type_heaps)
+ find_super_instance context [tc : tcs] tc_index address dict_mod dict_index defs type_heaps
+ #! (may_be_addres, type_heaps) = determine_address context tc address defs type_heaps
+ = case may_be_addres of
+ Yes address
+ # selector = selectFromDictionary dict_mod dict_index tc_index defs
+ -> (Yes [ (tc_index, selector) : address ], type_heaps)
+ No
+ -> find_super_instance context tcs (inc tc_index) address dict_mod dict_index defs type_heaps
+
- find_super_instance :: !TypeContext ![TypeContext] !Index ![(Int, Global DefinedSymbol)] !Index !Index !{#CommonDefs} !*TypeHeaps
- -> (!Optional [(Int, Global DefinedSymbol)],!*TypeHeaps)
- find_super_instance context [] tc_index address dict_mod dict_index defs type_heaps
- = (No, type_heaps)
- find_super_instance context [tc : tcs] tc_index address dict_mod dict_index defs type_heaps
- #! (may_be_addres, type_heaps) = determine_address context tc address defs type_heaps
- = case may_be_addres of
- Yes address
- # selector = selectFromDictionary dict_mod dict_index tc_index defs
- -> (Yes [ (tc_index, selector) : address ], type_heaps)
- No
- -> find_super_instance context tcs (inc tc_index) address dict_mod dict_index defs type_heaps
+getClassVariable :: !Ident !VarInfoPtr !*VarHeap !*ErrorAdmin -> (!Ident, !VarInfoPtr, !*VarHeap, !*ErrorAdmin)
+getClassVariable symb var_info_ptr var_heap error
+ = case (readPtr var_info_ptr var_heap) of
+ (VI_ClassVar var_name new_info_ptr count, var_heap)
+ -> (var_name, new_info_ptr, var_heap <:= (var_info_ptr, VI_ClassVar var_name new_info_ptr (inc count)), error)
+ (_, var_heap)
+ -> (symb, var_info_ptr, var_heap, overloadingError symb error)
-getClassVariable var_info_ptr var_heap
- # (var_info, var_heap) = readPtr var_info_ptr var_heap
- = case var_info of
- VI_ClassVar var_name new_info_ptr count
- -> (var_name, new_info_ptr, var_heap <:= (var_info_ptr, VI_ClassVar var_name new_info_ptr (inc count)))
- _
- -> abort "getClassVariable" ---> var_info_ptr
-updateDynamics :: ![Int] ![TypeContext] ![LocalTypePatternVariable] !*{#FunDef} !*ExpressionHeap !*TypeCodeInfo !*VarHeap !*ErrorAdmin
- -> (!*{#FunDef}, !*ExpressionHeap, !*TypeCodeInfo, !*VarHeap, !*ErrorAdmin)
-updateDynamics funs type_contexts type_pattern_vars fun_defs symbol_heap type_code_info var_heap error
+updateDynamics :: ![Index] ![LocalTypePatternVariable] !*{#FunDef} !*{! FunctionType} !*ExpressionHeap !*TypeCodeInfo !*VarHeap !*ErrorAdmin
+ -> (!*{#FunDef}, !*{! FunctionType}, !*ExpressionHeap, !*TypeCodeInfo, !*VarHeap, !*ErrorAdmin)
+updateDynamics funs type_pattern_vars fun_defs fun_env symbol_heap type_code_info var_heap error
| error.ea_ok
- = update_dynamics funs type_contexts fun_defs symbol_heap type_code_info { ltp_var_heap = var_heap, ltp_variables = type_pattern_vars} error
- = (fun_defs, symbol_heap, type_code_info, var_heap, error)
+ = update_dynamics funs type_pattern_vars fun_defs fun_env symbol_heap type_code_info var_heap error
+ = (fun_defs, fun_env, symbol_heap, type_code_info, var_heap, error)
where
- update_dynamics [] type_contexts fun_defs symbol_heap type_code_info ltp error
- = (fun_defs, symbol_heap, type_code_info, ltp.ltp_var_heap, error)
- update_dynamics [fun:funs] type_contexts fun_defs symbol_heap type_code_info ltp error
+ update_dynamics [] type_pattern_vars fun_defs fun_env symbol_heap type_code_info var_heap error
+ = (fun_defs, fun_env, symbol_heap, type_code_info, var_heap, error)
+ update_dynamics [fun:funs] type_pattern_vars fun_defs fun_env symbol_heap type_code_info var_heap error
#! fun_def = fun_defs.[fun]
# {fun_body,fun_info={fi_group_index, fi_dynamics}} = fun_def
| isEmpty fi_dynamics
- = update_dynamics funs type_contexts fun_defs symbol_heap type_code_info ltp error
- # (type_code_info, symbol_heap, ltp) = convertDynamicTypes fi_dynamics (type_code_info, symbol_heap, ltp)
+ = update_dynamics funs type_pattern_vars fun_defs fun_env symbol_heap type_code_info var_heap error
+ # (type_code_info, symbol_heap, type_pattern_vars, var_heap)
+ = convertDynamicTypes fi_dynamics (type_code_info, symbol_heap, type_pattern_vars, var_heap)
(TransformedBody tb) = fun_body
- (tb_rhs, {ui_instance_calls, ui_symbol_heap, ui_var_heap, ui_fun_defs}) = updateExpression fi_group_index [] tb.tb_rhs
- { ui_instance_calls = [], ui_symbol_heap = symbol_heap, ui_fun_defs = fun_defs, ui_var_heap = ltp.ltp_var_heap }
+ (tb_rhs, {ui_instance_calls, ui_symbol_heap, ui_var_heap, ui_fun_defs, ui_fun_env, ui_error}) = updateExpression fi_group_index tb.tb_rhs
+ { ui_instance_calls = [], ui_symbol_heap = symbol_heap, ui_fun_defs = fun_defs,
+ ui_fun_env = fun_env, ui_var_heap = var_heap, ui_error = error }
fun_def = { fun_def & fun_body = TransformedBody {tb & tb_rhs = tb_rhs}}
- = update_dynamics funs type_contexts { ui_fun_defs & [fun] = fun_def } ui_symbol_heap type_code_info { ltp & ltp_var_heap = ui_var_heap } error
+ = update_dynamics funs type_pattern_vars { ui_fun_defs & [fun] = fun_def } ui_fun_env ui_symbol_heap type_code_info ui_var_heap ui_error
-removeOverloadedFunctions :: ![(Optional [TypeContext], IdentPos, Index)] ![TypeContext] ![LocalTypePatternVariable] !*{#FunDef} !*ExpressionHeap
+removeOverloadedFunctions :: ![Index] ![LocalTypePatternVariable] !*{#FunDef} !*{! FunctionType} !*ExpressionHeap
!*TypeCodeInfo !*VarHeap !*ErrorAdmin
- -> (!*{#FunDef}, !*ExpressionHeap, !*TypeCodeInfo, !*VarHeap, !*ErrorAdmin)
-removeOverloadedFunctions opt_spec_contexts type_contexts type_pattern_vars fun_defs symbol_heap type_code_info var_heap error
+ -> (!*{#FunDef}, !*{! FunctionType}, !*ExpressionHeap, !*TypeCodeInfo, !*VarHeap, !*ErrorAdmin)
+removeOverloadedFunctions group type_pattern_vars fun_defs fun_env symbol_heap type_code_info var_heap error
| error.ea_ok
- # (_, fun_defs, symbol_heap, type_code_info, ltp, error)
- = foldSt (remove_overloaded_function type_contexts) opt_spec_contexts
- (False, fun_defs, symbol_heap, type_code_info, { ltp_var_heap = var_heap, ltp_variables = type_pattern_vars}, error)
- = (fun_defs, symbol_heap, type_code_info, ltp.ltp_var_heap, error)
+ # (fun_defs, fun_env, symbol_heap, type_code_info, var_heap, error)
+ = foldSt (remove_overloaded_function type_pattern_vars) group (fun_defs, fun_env, symbol_heap, type_code_info, var_heap, error)
+ = (fun_defs, fun_env, symbol_heap, type_code_info, var_heap, error)
where
- remove_overloaded_function derived_context (opt_context, location, fun_index)
- (refresh_variables, fun_defs, symbol_heap, type_code_info, ltp, error)
+ remove_overloaded_function type_pattern_vars fun_index (fun_defs, fun_env, symbol_heap, type_code_info, var_heap, error)
# (fun_def, fun_defs) = fun_defs![fun_index]
- {fun_body = TransformedBody {tb_args,tb_rhs},fun_info,fun_arity,fun_symb} = fun_def
- (refresh_variables, rev_variables, ltp_var_heap) = determine_class_arguments refresh_variables opt_context derived_context ltp.ltp_var_heap
- error = setErrorAdmin location error
- (type_code_info, symbol_heap, ltp) = convertDynamicTypes fun_info.fi_dynamics (type_code_info, symbol_heap, { ltp & ltp_var_heap = ltp_var_heap })
- (tb_rhs, {ui_instance_calls, ui_symbol_heap, ui_var_heap, ui_fun_defs}) = updateExpression fun_info.fi_group_index rev_variables tb_rhs
- { ui_instance_calls = [], ui_symbol_heap = symbol_heap, ui_var_heap = ltp.ltp_var_heap, ui_fun_defs = fun_defs }
- (tb_args, ltp_var_heap) = foldSt retrieve_class_argument rev_variables (tb_args, ui_var_heap)
+ (CheckedType {st_context}, fun_env) = fun_env![fun_index]
+ {fun_body = TransformedBody {tb_args,tb_rhs},fun_info,fun_arity,fun_symb,fun_pos} = fun_def
+ (rev_variables, var_heap) = foldSt determine_class_argument st_context ([], var_heap)
+// ---> ("remove_overloaded_function", fun_symb, st_context))
+ error = setErrorAdmin (newPosition fun_symb fun_pos) error
+ (type_code_info, symbol_heap, type_pattern_vars, var_heap) = convertDynamicTypes fun_info.fi_dynamics (type_code_info, symbol_heap, type_pattern_vars, var_heap)
+ (tb_rhs, {ui_instance_calls, ui_symbol_heap, ui_var_heap, ui_fun_defs, ui_fun_env, ui_error})
+ = updateExpression fun_info.fi_group_index tb_rhs { ui_instance_calls = [], ui_symbol_heap = symbol_heap,
+ ui_var_heap = var_heap, ui_fun_defs = fun_defs, ui_fun_env = fun_env, ui_error = error }
+ (tb_args, var_heap) = foldSt retrieve_class_argument rev_variables (tb_args, ui_var_heap)
fun_def = { fun_def & fun_body = TransformedBody {tb_args = tb_args, tb_rhs = tb_rhs},
fun_arity = length tb_args, fun_info = { fun_info & fi_calls = fun_info.fi_calls ++ ui_instance_calls } }
- = (refresh_variables, { ui_fun_defs & [fun_index] = fun_def }, ui_symbol_heap, type_code_info, { ltp & ltp_var_heap = ltp_var_heap }, error)
-
- determine_class_arguments fresh_variables (Yes spec_context) _ var_heap
- # (rev_variables, var_heap) = foldSt set_variable spec_context ([], var_heap)
- = (fresh_variables, rev_variables, var_heap)
- determine_class_arguments fresh_variables No derived_context var_heap
- | fresh_variables
- # (rev_variables, var_heap) = foldSt set_fresh_variable derived_context ([], var_heap)
- = (True, rev_variables, var_heap)
- # (rev_variables, var_heap) = foldSt set_variable derived_context ([], var_heap)
- = (True, rev_variables, var_heap)
-
- set_fresh_variable {tc_class={glob_object={ds_ident={id_name}}}, tc_var} (variables, var_heap)
- # (new_info_ptr, var_heap) = newPtr VI_Empty var_heap
- = ([tc_var : variables], var_heap <:= (tc_var, VI_ClassVar (build_var_name id_name) new_info_ptr 0))
-
- set_variable {tc_class={glob_object={ds_ident={id_name}}}, tc_var} (variables, var_heap)
- = ([tc_var : variables], var_heap <:= (tc_var, VI_ClassVar (build_var_name id_name) tc_var 0))
+ = ({ ui_fun_defs & [fun_index] = fun_def }, ui_fun_env, ui_symbol_heap, type_code_info, var_heap, ui_error)
+// ---> ("remove_overloaded_function", fun_symb, tb_args, tb_rhs)
+
+ determine_class_argument {tc_class={glob_object={ds_ident={id_name}}}, tc_var} (variables, var_heap)
+ # (var_info, var_heap) = readPtr tc_var var_heap
+ = case var_info of
+ VI_ForwardClassVar var_info_ptr
+ # (var_info, var_heap) = readPtr var_info_ptr var_heap
+// (new_info_ptr, var_heap) = newPtr VI_Empty var_heap
+// -> ([var_info_ptr : variables], var_heap <:= (var_info_ptr, VI_ClassVar (build_var_name id_name) new_info_ptr 0 var_info))
+
+ -> case var_info of
+ VI_Empty
+ # (new_info_ptr, var_heap) = newPtr VI_Empty var_heap
+ -> ([var_info_ptr : variables], var_heap <:= (var_info_ptr, VI_ClassVar (build_var_name id_name) new_info_ptr 0))
+ _
+ -> abort "determine_class_argument (overloading.icl)"
+
+ VI_Empty
+ # (new_info_ptr, var_heap) = newPtr VI_Empty var_heap
+ -> ([tc_var : variables], var_heap <:= (tc_var, VI_ClassVar (build_var_name id_name) new_info_ptr 0))
+ _
+ -> abort "determine_class_argument (overloading.icl)"
build_var_name id_name
= { id_name = "_v" +++ id_name, id_info = nilPtr }
retrieve_class_argument var_info_ptr (args, var_heap)
# (VI_ClassVar var_name new_info_ptr count, var_heap) = readPtr var_info_ptr var_heap
- = ([{fv_name = var_name, fv_info_ptr = new_info_ptr, fv_def_level = NotALevel, fv_count = count } : args], var_heap)
+ = ([{fv_name = var_name, fv_info_ptr = new_info_ptr, fv_def_level = NotALevel, fv_count = count } : args], var_heap <:= (var_info_ptr, VI_Empty))
convertDynamicTypes dyn_ptrs update_info
= foldSt update_dynamic dyn_ptrs update_info
where
- update_dynamic dyn_ptr (type_code_info, expr_heap, ltp)
+ update_dynamic dyn_ptr (type_code_info, expr_heap, type_pattern_vars, var_heap)
# (dyn_info, expr_heap) = readPtr dyn_ptr expr_heap
= case dyn_info of
EI_TempDynamicType (Yes {dt_global_vars, dt_uni_vars, dt_type}) _ _ expr_ptr _
@@ -852,35 +874,35 @@ where
EI_TypeCodes type_codes
# type_var_heap = fold2St (\{tv_info_ptr} type_code -> writePtr tv_info_ptr (TVI_TypeCode type_code))
dt_global_vars type_codes type_code_info.tci_type_var_heap
- (uni_vars, (type_var_heap, ltp_var_heap)) = new_type_variables dt_uni_vars (type_var_heap, ltp.ltp_var_heap)
+ (uni_vars, (type_var_heap, var_heap)) = new_type_variables dt_uni_vars (type_var_heap, var_heap)
(type_code_expr, type_code_info) = toTypeCodeExpression dt_type { type_code_info & tci_type_var_heap = type_var_heap }
- -> (type_code_info, expr_heap <:= (dyn_ptr, EI_TypeOfDynamic uni_vars type_code_expr), { ltp & ltp_var_heap = ltp_var_heap})
+ -> (type_code_info, expr_heap <:= (dyn_ptr, EI_TypeOfDynamic uni_vars type_code_expr), type_pattern_vars, var_heap)
EI_Empty
- # (uni_vars, (type_var_heap, ltp_var_heap)) = new_type_variables dt_uni_vars (type_code_info.tci_type_var_heap, ltp.ltp_var_heap)
+ # (uni_vars, (type_var_heap, var_heap)) = new_type_variables dt_uni_vars (type_code_info.tci_type_var_heap, var_heap)
(type_code_expr, type_code_info) = toTypeCodeExpression dt_type { type_code_info & tci_type_var_heap = type_var_heap }
- -> (type_code_info, expr_heap <:= (dyn_ptr, EI_TypeOfDynamic uni_vars type_code_expr), {ltp & ltp_var_heap = ltp_var_heap})
+ -> (type_code_info, expr_heap <:= (dyn_ptr, EI_TypeOfDynamic uni_vars type_code_expr), type_pattern_vars, var_heap)
EI_TempDynamicType No _ _ expr_ptr _
# (expr_info, expr_heap) = readPtr expr_ptr expr_heap
-> case expr_info of
EI_TypeCode type_expr
- -> (type_code_info, expr_heap <:= (dyn_ptr, EI_TypeOfDynamic [] type_expr), ltp)
+ -> (type_code_info, expr_heap <:= (dyn_ptr, EI_TypeOfDynamic [] type_expr), type_pattern_vars, var_heap)
EI_Selection selectors record_var _
- # (_, var_info_ptr, ltp_var_heap) = getClassVariable record_var ltp.ltp_var_heap
- -> (type_code_info, expr_heap <:= (dyn_ptr, EI_TypeOfDynamic [] (convert_selectors selectors var_info_ptr)), { ltp & ltp_var_heap = ltp_var_heap })
+ # (_, var_info_ptr, var_heap) = abort "getClassVariable record_var var_heap (overloading.icl)"
+ -> (type_code_info, expr_heap <:= (dyn_ptr, EI_TypeOfDynamic [] (convert_selectors selectors var_info_ptr)), type_pattern_vars, var_heap)
EI_TempDynamicPattern type_vars {dt_global_vars, dt_type} loc_dynamics temp_local_vars _ _ expr_ptr _
# (expr_info, expr_heap) = readPtr expr_ptr expr_heap
-> case expr_info of
EI_TypeCodes type_codes
# type_var_heap = fold2St (\{tv_info_ptr} type_code -> writePtr tv_info_ptr (TVI_TypeCode type_code)) dt_global_vars type_codes type_code_info.tci_type_var_heap
- (var_ptrs, ltp) = mapSt addLocalTCInstance temp_local_vars ltp
+ (var_ptrs, (type_pattern_vars, var_heap)) = mapSt addLocalTCInstance temp_local_vars (type_pattern_vars, var_heap)
type_var_heap = fold2St (\{tv_info_ptr} var_ptr -> writePtr tv_info_ptr (TVI_TypeCode (TCE_Var var_ptr))) type_vars var_ptrs type_var_heap
(type_code_expr, type_code_info) = toTypeCodeExpression dt_type { type_code_info & tci_type_var_heap = type_var_heap }
- -> convert_local_dynamics loc_dynamics (type_code_info, expr_heap <:= (dyn_ptr, EI_TypeOfDynamicPattern var_ptrs type_code_expr), ltp)
+ -> convert_local_dynamics loc_dynamics (type_code_info, expr_heap <:= (dyn_ptr, EI_TypeOfDynamicPattern var_ptrs type_code_expr), type_pattern_vars, var_heap)
EI_Empty
- # (var_ptrs, ltp) = mapSt addLocalTCInstance temp_local_vars ltp
+ # (var_ptrs, (type_pattern_vars, var_heap)) = mapSt addLocalTCInstance temp_local_vars (type_pattern_vars, var_heap)
type_var_heap = fold2St (\{tv_info_ptr} var_ptr -> writePtr tv_info_ptr (TVI_TypeCode (TCE_Var var_ptr))) type_vars var_ptrs type_code_info.tci_type_var_heap
(type_code_expr, type_code_info) = toTypeCodeExpression dt_type { type_code_info & tci_type_var_heap = type_var_heap }
- -> convert_local_dynamics loc_dynamics (type_code_info, expr_heap <:= (dyn_ptr, EI_TypeOfDynamicPattern var_ptrs type_code_expr), ltp)
+ -> convert_local_dynamics loc_dynamics (type_code_info, expr_heap <:= (dyn_ptr, EI_TypeOfDynamicPattern var_ptrs type_code_expr), type_pattern_vars, var_heap)
where
convert_local_dynamics loc_dynamics state
@@ -936,54 +958,77 @@ where
, ui_symbol_heap :: !.ExpressionHeap
, ui_var_heap :: !.VarHeap
, ui_fun_defs :: !.{# FunDef}
+ , ui_fun_env :: !.{! FunctionType}
+ , ui_error :: !.ErrorAdmin
}
-class updateExpression e :: !Index ![VarInfoPtr] !e !*UpdateInfo -> (!e, !*UpdateInfo)
+class updateExpression e :: !Index !e !*UpdateInfo -> (!e, !*UpdateInfo)
instance updateExpression Expression
where
- updateExpression group_index type_contexts (App app=:{app_symb=symb=:{symb_kind,symb_arity,symb_name},app_args,app_info_ptr}) ui
- # (app_args, ui) = updateExpression group_index type_contexts app_args ui
+ updateExpression group_index (App app=:{app_symb=symb=:{symb_kind,symb_arity,symb_name},app_args,app_info_ptr}) ui
+ # (app_args, ui) = updateExpression group_index app_args ui
| isNilPtr app_info_ptr
= (App { app & app_args = app_args }, ui)
#! symb_info = sreadPtr app_info_ptr ui.ui_symbol_heap
= case symb_info of
EI_Empty
- | is_recursive_call group_index symb_kind ui.ui_fun_defs
- # (symb_arity, app_args, ui_var_heap) = foldSt build_context_arg type_contexts (symb_arity, app_args, ui.ui_var_heap)
- -> (App { app & app_symb = { symb & symb_arity = symb_arity }, app_args = app_args }, { ui & ui_var_heap = ui_var_heap })
+ #! fun_index = get_recursive_fun_index group_index symb_kind ui.ui_fun_defs
+ | fun_index == NoIndex
-> (App { app & app_args = app_args }, ui)
+ # (CheckedType {st_context}, ui) = ui!ui_fun_env.[fun_index]
+ (app_args, (ui_var_heap, ui_error)) = mapAppendSt (build_context_arg symb_name) st_context app_args (ui.ui_var_heap, ui.ui_error)
+ -> (App { app & app_symb = { symb & symb_arity = symb_arity + length st_context}, app_args = app_args },
+ { ui & ui_var_heap = ui_var_heap, ui_error = ui_error })
+ EI_Context context_args
+ # (app_args, (ui_var_heap, ui_error)) = adjustClassExpressions symb_name context_args app_args (ui.ui_var_heap, ui.ui_error)
+ #! fun_index = get_recursive_fun_index group_index symb_kind ui.ui_fun_defs
+ | fun_index == NoIndex
+ # app = { app & app_symb = { symb & symb_arity = length context_args + symb_arity }, app_args = app_args}
+ -> (App app, examine_calls context_args { ui & ui_var_heap = ui_var_heap, ui_error = ui_error })
+ # (CheckedType {st_context}, ui) = ui!ui_fun_env.[fun_index]
+ nr_of_context_args = length context_args
+ nr_of_lifted_contexts = length st_context - nr_of_context_args
+ (app_args, (ui_var_heap, ui_error)) = mapAppendSt (build_context_arg symb_name) (take nr_of_lifted_contexts st_context) app_args (ui_var_heap, ui_error)
+ -> (App { app & app_symb = { symb & symb_arity = nr_of_lifted_contexts + nr_of_context_args + symb_arity }, app_args = app_args },
+ examine_calls context_args { ui & ui_var_heap = ui_var_heap, ui_error = ui_error })
EI_Instance inst_symbol context_args
- # (context_args, ui_var_heap) = adjustClassExpressions context_args [] ui.ui_var_heap
+ # (context_args, (ui_var_heap, ui_error)) = adjustClassExpressions symb_name context_args [] (ui.ui_var_heap, ui.ui_error)
-> (build_application inst_symbol context_args app_args symb_arity app_info_ptr,
examine_calls context_args (new_call inst_symbol.glob_module inst_symbol.glob_object.ds_index
- { ui & ui_var_heap = ui_var_heap }))
+ { ui & ui_var_heap = ui_var_heap, ui_error = ui_error }))
EI_Selection selectors record_var context_args
- # (all_args, ui_var_heap) = adjustClassExpressions context_args app_args ui.ui_var_heap
- (var_name, var_info_ptr, ui_var_heap) = getClassVariable record_var ui_var_heap
+ # (all_args, (ui_var_heap, ui_error)) = adjustClassExpressions symb_name context_args app_args (ui.ui_var_heap, ui.ui_error)
+ (var_name, var_info_ptr, ui_var_heap, ui_error) = getClassVariable symb_name record_var ui_var_heap ui_error
select_expr = Selection No (Var { var_name = var_name, var_info_ptr = var_info_ptr, var_expr_ptr = nilPtr }) selectors
| isEmpty all_args
- -> (select_expr, { ui & ui_var_heap = ui_var_heap })
- -> (select_expr @ all_args, examine_calls context_args { ui & ui_var_heap = ui_var_heap })
- EI_Context context_args
- # (app_args, ui_var_heap) = adjustClassExpressions context_args app_args ui.ui_var_heap
- # app = { app & app_symb = { symb & symb_arity = length context_args + symb_arity }, app_args = app_args}
- -> (App app, examine_calls context_args { ui & ui_var_heap = ui_var_heap })
+ -> (select_expr, { ui & ui_var_heap = ui_var_heap, ui_error = ui_error })
+ -> (select_expr @ all_args, examine_calls context_args { ui & ui_var_heap = ui_var_heap, ui_error = ui_error })
where
- build_context_arg var_info_ptr (arity, args, var_heap)
- # (var_name, var_info_ptr, var_heap) = getClassVariable var_info_ptr var_heap
- = (inc arity, [ Var { var_name = var_name, var_info_ptr = var_info_ptr, var_expr_ptr = nilPtr } : args ], var_heap)
+ build_context_arg symb {tc_var} (var_heap, error)
+ # (var_info, var_heap) = readPtr tc_var var_heap
+ = case var_info of
+ VI_ForwardClassVar var_info_ptr
+ # (var_name, var_info_ptr, var_heap, error) = getClassVariable symb var_info_ptr var_heap error
+ -> (Var { var_name = var_name, var_info_ptr = var_info_ptr, var_expr_ptr = nilPtr }, (var_heap, error))
+ VI_ClassVar var_name new_info_ptr count
+ -> (Var { var_name = var_name, var_info_ptr = new_info_ptr, var_expr_ptr = nilPtr },
+ (var_heap <:= (tc_var, VI_ClassVar var_name new_info_ptr (inc count)), error))
+ _
+ -> abort "build_context_arg (overloading.icl)"
- is_recursive_call group_index (SK_Function {glob_module,glob_object}) fun_defs
+ get_recursive_fun_index group_index (SK_Function {glob_module,glob_object}) fun_defs
| glob_module == cIclModIndex
- #! fun_def = fun_defs.[glob_object]
- = fun_def.fun_info.fi_group_index == group_index
- = False
- is_recursive_call group_index _ fun_defs
- = False
+ # ({fun_info={fi_group_index}, fun_index}, fun_defs) = fun_defs![glob_object]
+ | fi_group_index == group_index
+ = fun_index
+ = NoIndex
+ = NoIndex
+ get_recursive_fun_index group_index _ fun_defs
+ = NoIndex
build_application def_symbol=:{glob_object} context_args orig_args nr_of_orig_args app_info_ptr
= App {app_symb = { symb_name = glob_object.ds_ident,
@@ -1022,134 +1067,134 @@ where
= ui
- updateExpression group_index type_contexts (expr @ exprs) ui
- # ((expr, exprs), ui) = updateExpression group_index type_contexts (expr, exprs) ui
+ updateExpression group_index (expr @ exprs) ui
+ # ((expr, exprs), ui) = updateExpression group_index (expr, exprs) ui
= (expr @ exprs, ui)
- updateExpression group_index type_contexts (Let lad=:{let_lazy_binds, let_strict_binds, let_expr}) ui
- # (let_lazy_binds, ui) = updateExpression group_index type_contexts let_lazy_binds ui
- # (let_strict_binds, ui) = updateExpression group_index type_contexts let_strict_binds ui
- # (let_expr, ui) = updateExpression group_index type_contexts let_expr ui
+ updateExpression group_index (Let lad=:{let_lazy_binds, let_strict_binds, let_expr}) ui
+ # (let_lazy_binds, ui) = updateExpression group_index let_lazy_binds ui
+ # (let_strict_binds, ui) = updateExpression group_index let_strict_binds ui
+ # (let_expr, ui) = updateExpression group_index let_expr ui
= (Let {lad & let_lazy_binds = let_lazy_binds, let_strict_binds = let_strict_binds, let_expr = let_expr}, ui)
- updateExpression group_index type_contexts (Case kees=:{case_expr,case_guards,case_default}) ui
- # ((case_expr,(case_guards,case_default)), ui) = updateExpression group_index type_contexts (case_expr,(case_guards,case_default)) ui
+ updateExpression group_index (Case kees=:{case_expr,case_guards,case_default}) ui
+ # ((case_expr,(case_guards,case_default)), ui) = updateExpression group_index (case_expr,(case_guards,case_default)) ui
= (Case { kees & case_expr = case_expr, case_guards = case_guards, case_default = case_default }, ui)
- updateExpression group_index type_contexts (Selection is_unique expr selectors) ui
- # (expr, ui) = updateExpression group_index type_contexts expr ui
- (selectors, ui) = updateExpression group_index type_contexts selectors ui
+ updateExpression group_index (Selection is_unique expr selectors) ui
+ # (expr, ui) = updateExpression group_index expr ui
+ (selectors, ui) = updateExpression group_index selectors ui
= (Selection is_unique expr selectors, ui)
- updateExpression group_index type_contexts (Update expr1 selectors expr2) ui
- # (expr1, ui) = updateExpression group_index type_contexts expr1 ui
- (selectors, ui) = updateExpression group_index type_contexts selectors ui
- (expr2, ui) = updateExpression group_index type_contexts expr2 ui
+ updateExpression group_index (Update expr1 selectors expr2) ui
+ # (expr1, ui) = updateExpression group_index expr1 ui
+ (selectors, ui) = updateExpression group_index selectors ui
+ (expr2, ui) = updateExpression group_index expr2 ui
= (Update expr1 selectors expr2, ui)
- updateExpression group_index type_contexts (RecordUpdate cons_symbol expression expressions) ui
- # (expression, ui) = updateExpression group_index type_contexts expression ui
- (expressions, ui) = updateExpression group_index type_contexts expressions ui
+ updateExpression group_index (RecordUpdate cons_symbol expression expressions) ui
+ # (expression, ui) = updateExpression group_index expression ui
+ (expressions, ui) = updateExpression group_index expressions ui
= (RecordUpdate cons_symbol expression expressions, ui)
- updateExpression group_index type_contexts (DynamicExpr dyn=:{dyn_expr,dyn_info_ptr}) ui
- # (dyn_expr, ui) = updateExpression group_index type_contexts dyn_expr ui
+ updateExpression group_index (DynamicExpr dyn=:{dyn_expr,dyn_info_ptr}) ui
+ # (dyn_expr, ui) = updateExpression group_index dyn_expr ui
(EI_TypeOfDynamic uni_vars type_code, ui_symbol_heap) = readPtr dyn_info_ptr ui.ui_symbol_heap
= (DynamicExpr { dyn & dyn_expr = dyn_expr, dyn_type_code = type_code, dyn_uni_vars = uni_vars }, { ui & ui_symbol_heap = ui_symbol_heap })
- updateExpression group_index type_contexts (MatchExpr opt_tuple cons_symbol expr) ui
- # (expr, ui) = updateExpression group_index type_contexts expr ui
+ updateExpression group_index (MatchExpr opt_tuple cons_symbol expr) ui
+ # (expr, ui) = updateExpression group_index expr ui
= (MatchExpr opt_tuple cons_symbol expr, ui)
- updateExpression group_index type_contexts (TupleSelect symbol argn_nr expr) ui
- # (expr, ui) = updateExpression group_index type_contexts expr ui
+ updateExpression group_index (TupleSelect symbol argn_nr expr) ui
+ # (expr, ui) = updateExpression group_index expr ui
= (TupleSelect symbol argn_nr expr, ui)
- updateExpression group_index type_contexts expr ui
+ updateExpression group_index expr ui
= (expr, ui)
instance updateExpression Bind a b | updateExpression a
where
- updateExpression group_index type_contexts bind=:{bind_src} ui
- # (bind_src, ui) = updateExpression group_index type_contexts bind_src ui
+ updateExpression group_index bind=:{bind_src} ui
+ # (bind_src, ui) = updateExpression group_index bind_src ui
= ({bind & bind_src = bind_src }, ui)
instance updateExpression Optional a | updateExpression a
where
- updateExpression group_index type_contexts (Yes x) ui
- # (x, ui) = updateExpression group_index type_contexts x ui
+ updateExpression group_index (Yes x) ui
+ # (x, ui) = updateExpression group_index x ui
= (Yes x, ui)
- updateExpression group_index type_contexts No ui
+ updateExpression group_index No ui
= (No, ui)
instance updateExpression CasePatterns
where
- updateExpression group_index type_contexts (AlgebraicPatterns type patterns) ui
- # (patterns, ui) = updateExpression group_index type_contexts patterns ui
+ updateExpression group_index (AlgebraicPatterns type patterns) ui
+ # (patterns, ui) = updateExpression group_index patterns ui
= (AlgebraicPatterns type patterns, ui)
- updateExpression group_index type_contexts (BasicPatterns type patterns) ui
- # (patterns, ui) = updateExpression group_index type_contexts patterns ui
+ updateExpression group_index (BasicPatterns type patterns) ui
+ # (patterns, ui) = updateExpression group_index patterns ui
= (BasicPatterns type patterns, ui)
- updateExpression group_index type_contexts (DynamicPatterns patterns) ui
- # (patterns, ui) = updateExpression group_index type_contexts patterns ui
+ updateExpression group_index (DynamicPatterns patterns) ui
+ # (patterns, ui) = updateExpression group_index patterns ui
= (DynamicPatterns patterns, ui)
instance updateExpression AlgebraicPattern
where
- updateExpression group_index type_contexts pattern=:{ap_vars,ap_expr} ui
- # (ap_expr, ui) = updateExpression group_index type_contexts ap_expr ui
+ updateExpression group_index pattern=:{ap_vars,ap_expr} ui
+ # (ap_expr, ui) = updateExpression group_index ap_expr ui
= ({ pattern & ap_expr = ap_expr }, ui)
instance updateExpression BasicPattern
where
- updateExpression group_index type_contexts pattern=:{bp_expr} ui
- # (bp_expr, ui) = updateExpression group_index type_contexts bp_expr ui
+ updateExpression group_index pattern=:{bp_expr} ui
+ # (bp_expr, ui) = updateExpression group_index bp_expr ui
= ({ pattern & bp_expr = bp_expr }, ui)
instance updateExpression Selection
where
- updateExpression group_index type_contexts (ArraySelection selector expr_ptr index_expr) ui
- # (index_expr, ui) = updateExpression group_index type_contexts index_expr ui
+ updateExpression group_index (ArraySelection selector=:{glob_object={ds_ident}} expr_ptr index_expr) ui
+ # (index_expr, ui) = updateExpression group_index index_expr ui
#! symb_info = sreadPtr expr_ptr ui.ui_symbol_heap
= case symb_info of
EI_Instance array_select []
-> (ArraySelection array_select expr_ptr index_expr, ui)
EI_Selection selectors record_var context_args
- # (var_name, var_info_ptr, ui_var_heap) = getClassVariable record_var ui.ui_var_heap
+ # (var_name, var_info_ptr, ui_var_heap, ui_error) = getClassVariable ds_ident record_var ui.ui_var_heap ui.ui_error
-> (DictionarySelection { var_name = var_name, var_info_ptr = var_info_ptr, var_expr_ptr = nilPtr } selectors expr_ptr index_expr,
- { ui & ui_var_heap = ui_var_heap })
- updateExpression group_index type_contexts selection ui
+ { ui & ui_var_heap = ui_var_heap, ui_error = ui_error })
+ updateExpression group_index selection ui
= (selection, ui)
instance updateExpression TypeCase
where
- updateExpression group_index type_contexts type_case=:{type_case_dynamic,type_case_patterns,type_case_default} ui
- # ((type_case_dynamic,(type_case_patterns,type_case_default)), ui) = updateExpression group_index type_contexts
+ updateExpression group_index type_case=:{type_case_dynamic,type_case_patterns,type_case_default} ui
+ # ((type_case_dynamic,(type_case_patterns,type_case_default)), ui) = updateExpression group_index
(type_case_dynamic,(type_case_patterns,type_case_default)) ui
= ({ type_case & type_case_dynamic = type_case_dynamic, type_case_patterns = type_case_patterns, type_case_default = type_case_default }, ui)
instance updateExpression DynamicPattern
where
- updateExpression group_index type_contexts dp=:{dp_type,dp_rhs} ui
- # (dp_rhs, ui) = updateExpression group_index type_contexts dp_rhs ui
+ updateExpression group_index dp=:{dp_type,dp_rhs} ui
+ # (dp_rhs, ui) = updateExpression group_index dp_rhs ui
(EI_TypeOfDynamicPattern type_pattern_vars type_code, ui_symbol_heap) = readPtr dp_type ui.ui_symbol_heap
= ({ dp & dp_rhs = dp_rhs, dp_type_patterns_vars = type_pattern_vars, dp_type_code = type_code }, { ui & ui_symbol_heap = ui_symbol_heap })
instance updateExpression (a,b) | updateExpression a & updateExpression b
where
- updateExpression group_index type_contexts t ui
- = app2St (updateExpression group_index type_contexts,updateExpression group_index type_contexts) t ui
+ updateExpression group_index t ui
+ = app2St (updateExpression group_index,updateExpression group_index) t ui
instance updateExpression [e] | updateExpression e
where
- updateExpression group_index type_contexts l ui
- = mapSt (updateExpression group_index type_contexts) l ui
+ updateExpression group_index l ui
+ = mapSt (updateExpression group_index) l ui
-adjustClassExpressions exprs tail_exprs var_heap
- = mapAppendSt adjustClassExpression exprs tail_exprs var_heap
+adjustClassExpressions symb_name exprs tail_exprs var_heap_error
+ = mapAppendSt (adjustClassExpression symb_name) exprs tail_exprs var_heap_error
where
- adjustClassExpression (App app=:{app_args}) var_heap
- # (app_args, var_heap) = adjustClassExpressions app_args [] var_heap
- = (App { app & app_args = app_args }, var_heap)
- adjustClassExpression (ClassVariable var_info_ptr) var_heap
- # (var_name, var_info_ptr, var_heap) = getClassVariable var_info_ptr var_heap
- = (Var { var_name = var_name, var_info_ptr = var_info_ptr, var_expr_ptr = nilPtr }, var_heap)
- adjustClassExpression (Selection opt_type expr selectors) var_heap
- # (expr, var_heap) = adjustClassExpression expr var_heap
- = (Selection opt_type expr selectors, var_heap)
- adjustClassExpression expr var_heap
- = (expr, var_heap)
+ adjustClassExpression symb_name (App app=:{app_args}) var_heap_error
+ # (app_args, var_heap_error) = adjustClassExpressions symb_name app_args [] var_heap_error
+ = (App { app & app_args = app_args }, var_heap_error)
+ adjustClassExpression symb_name (ClassVariable var_info_ptr) (var_heap, error)
+ # (var_name, var_info_ptr, var_heap, error) = getClassVariable symb_name var_info_ptr var_heap error
+ = (Var { var_name = var_name, var_info_ptr = var_info_ptr, var_expr_ptr = nilPtr }, (var_heap, error))
+ adjustClassExpression symb_name (Selection opt_type expr selectors) var_heap_error
+ # (expr, var_heap_error) = adjustClassExpression symb_name expr var_heap_error
+ = (Selection opt_type expr selectors, var_heap_error)
+ adjustClassExpression symb_name expr var_heap_error
+ = (expr, var_heap_error)
class equalTypes a :: !a !a !*TypeVarHeap -> (!Bool, !*TypeVarHeap)
diff --git a/frontend/refmark.icl b/frontend/refmark.icl
index 5ff60bc..abe40c7 100644
--- a/frontend/refmark.icl
+++ b/frontend/refmark.icl
@@ -335,6 +335,7 @@ refMarkOfCase free_vars sel expr (BasicPatterns type patterns) defaul var_heap
(local_lets, var_heap) = collectLocalLetVars free_vars var_heap
(pattern_depth, used_lets, var_heap) = foldSt (ref_mark_of_basic_pattern free_vars sel local_lets) patterns (0, [], var_heap)
= refMarkOfDefault False pattern_depth free_vars sel defaul used_lets var_heap
+// ---> ("refMarkOfCase", expr, [ (bp_value, bp_expr) \\ {bp_value, bp_expr} <- patterns])
where
ref_mark_of_basic_pattern free_vars sel local_lets {bp_expr} (pattern_depth, used_lets, var_heap)
# pattern_depth = inc pattern_depth
@@ -394,10 +395,10 @@ where
| do_par_combine
# new_comb_ref_count = parCombineRefCount comb_ref_count occ_ref_count
= (new_comb_ref_count, occ_previous)
- // ---> ("parCombineRefCount", comb_ref_count, occ_ref_count, new_comb_ref_count)
+// ---> ("parCombineRefCount", comb_ref_count, occ_ref_count, new_comb_ref_count)
# new_comb_ref_count = seqCombineRefCount comb_ref_count occ_ref_count
= (new_comb_ref_count, occ_previous)
- // ---> ("seqCombineRefCount", comb_ref_count, occ_ref_count, new_comb_ref_count)
+// ---> ("seqCombineRefCount", comb_ref_count, occ_ref_count, new_comb_ref_count)
case_combine_ref_counts do_par_combine comb_ref_count [occ_ref_count:occ_previous] depth
# new_comb_ref_count = case_combine_ref_count comb_ref_count occ_ref_count
= case_combine_ref_counts do_par_combine new_comb_ref_count occ_previous (dec depth)
diff --git a/frontend/syntax.dcl b/frontend/syntax.dcl
index 02a6191..816ffce 100644
--- a/frontend/syntax.dcl
+++ b/frontend/syntax.dcl
@@ -447,7 +447,8 @@ cIsALocalVar :== False
VI_Alias !BoundVar /* used for resolving aliases just before type checking (in transform) */ |
/* used during elimination and lifting of cases */
VI_FreeVar !Ident !VarInfoPtr !Int !AType | VI_BoundVar !AType | VI_LocalVar |
- VI_ClassVar !Ident !VarInfoPtr !Int /* used to hold dictionary variables during overloading */ |
+ VI_ClassVar !Ident !VarInfoPtr !Int | /* to hold dictionary variables during overloading */
+ VI_ForwardClassVar !VarInfoPtr | /* to hold the dictionary variable generated during overloading */
VI_Forward !BoundVar | VI_LetVar !LetVarInfo | VI_LetExpression !LetExpressionInfo | VI_CaseVar !VarInfoPtr |
VI_CorrespondenceNumber !Int | VI_SequenceNumber !Int |
VI_Used | /* for indicating that an imported function has been used */
@@ -812,7 +813,8 @@ cNonRecursiveAppl :== False
}
:: TypeAttribute = TA_Unique | TA_Multi | TA_Var !AttributeVar | TA_RootVar AttributeVar | TA_TempVar !Int | TA_TempExVar
- | TA_Anonymous | TA_None | TA_List !Int !TypeAttribute
+ | TA_Anonymous | TA_None
+ | TA_List !Int !TypeAttribute | TA_Locked !TypeAttribute
:: AttributeVar =
{ av_name :: !Ident
diff --git a/frontend/syntax.icl b/frontend/syntax.icl
index 4d7f79f..548f3fd 100644
--- a/frontend/syntax.icl
+++ b/frontend/syntax.icl
@@ -424,7 +424,8 @@ cIsALocalVar :== False
VI_Alias !BoundVar /* used for resolving aliases just before type checking (in transform) */ |
/* used during elimination and lifting of cases */
VI_FreeVar !Ident !VarInfoPtr !Int !AType | VI_BoundVar !AType | VI_LocalVar |
- VI_ClassVar !Ident !VarInfoPtr !Int /* used to hold dictionary variables during overloading */ |
+ VI_ClassVar !Ident !VarInfoPtr !Int | /* to hold dictionary variables during overloading */
+ VI_ForwardClassVar !VarInfoPtr | /* to hold the dictionary variable generated during overloading */
VI_Forward !BoundVar | VI_LetVar !LetVarInfo | VI_LetExpression !LetExpressionInfo | VI_CaseVar !VarInfoPtr |
VI_CorrespondenceNumber !Int | VI_SequenceNumber !Int |
VI_Used | /* for indicating that an imported function has been used */
@@ -772,7 +773,8 @@ cNotVarNumber :== -1
}
:: TypeAttribute = TA_Unique | TA_Multi | TA_Var !AttributeVar | TA_RootVar AttributeVar | TA_TempVar !Int | TA_TempExVar
- | TA_Anonymous | TA_None | TA_List !Int !TypeAttribute
+ | TA_Anonymous | TA_None
+ | TA_List !Int !TypeAttribute | TA_Locked !TypeAttribute
:: AttributeVar =
{ av_name :: !Ident
@@ -1153,7 +1155,7 @@ where
toString (TA_Var avar)
= toString avar + ": "
toString TA_TempExVar
- = "E"
+ = "(E)"
toString (TA_RootVar avar)
= toString avar + ": "
toString (TA_Anonymous)
@@ -1256,14 +1258,14 @@ where
instance <<< SymbIdent
where
- (<<<) file symb=:{symb_kind = SK_Function symb_index } = file <<< symb.symb_name <<< '.' <<< symb_index
- (<<<) file symb=:{symb_kind = SK_GeneratedFunction _ symb_index } = file <<< symb.symb_name <<< '.' <<< symb_index
- (<<<) file symb=:{symb_kind = SK_OverloadedFunction symb_index } = file <<< symb.symb_name <<< "OL"
+ (<<<) file symb=:{symb_kind = SK_Function symb_index } = file <<< symb.symb_name <<< '@' <<< symb_index
+ (<<<) file symb=:{symb_kind = SK_GeneratedFunction _ symb_index } = file <<< symb.symb_name <<< '@' <<< symb_index
+ (<<<) file symb=:{symb_kind = SK_OverloadedFunction symb_index } = file <<< symb.symb_name <<< "[o]@" <<< symb_index
(<<<) file symb = file <<< symb.symb_name
instance <<< TypeSymbIdent
where
- (<<<) file symb = file <<< symb.type_name <<< '.' <<< symb.type_arity
+ (<<<) file symb = file <<< symb.type_name <<< '.' <<< symb.type_index
instance <<< ClassSymbIdent
where
@@ -1272,7 +1274,7 @@ where
instance <<< BoundVar
where
(<<<) file {var_name,var_info_ptr,var_expr_ptr}
- = file <<< var_name <<< '<' <<< ptrToInt var_info_ptr /*<<< ',' <<< ptrToInt var_expr_ptr*/ <<< '>'
+ = file <<< var_name <<< '<' <<< ptrToInt var_info_ptr <<< ',' <<< ptrToInt var_expr_ptr <<< '>'
instance <<< Bind a b | <<< a & <<< b
where
@@ -1513,6 +1515,8 @@ where
// <<< fun_index <<< '.' <<< fi_def_level <<< ' ' <<< '[' <<< fi_free_vars <<< ']' <<< tb_args <<< " = " <<< tb_rhs
(<<<) file {fun_symb,fun_index,fun_body=BackendBody body,fun_type=Yes type} = file <<< type <<< '\n' <<< fun_symb <<< '.'
<<< fun_index <<< body <<< '\n'
+ (<<<) file {fun_symb,fun_index,fun_body=NoBody,fun_type=Yes type} = file <<< type <<< '\n' <<< fun_symb <<< '.'
+ <<< fun_index <<< "Array function\n"
instance <<< FunCall
where
@@ -1698,7 +1702,7 @@ where
instance <<< Global a | <<< a
where
- (<<<) file {glob_object,glob_module} = file <<< glob_object <<< '.' <<< glob_module
+ (<<<) file {glob_object,glob_module} = file <<< glob_object <<< "M:" <<< glob_module
instance <<< Position
where
diff --git a/frontend/trans.dcl b/frontend/trans.dcl
index 1bed708..b9d252d 100644
--- a/frontend/trans.dcl
+++ b/frontend/trans.dcl
@@ -10,7 +10,7 @@ cAccumulating :== -3
:: CleanupInfo
-analyseGroups :: !{# CommonDefs} !*{! Group} !*{#FunDef} !*VarHeap !*ExpressionHeap
+analyseGroups :: !{# CommonDefs} !IndexRange !*{! Group} !*{#FunDef} !*VarHeap !*ExpressionHeap
-> (!CleanupInfo, !*{! ConsClasses}, !*{! Group}, !*{#FunDef}, !*VarHeap, !*ExpressionHeap)
transformGroups :: !CleanupInfo !*{! Group} !*{#FunDef} !{!.ConsClasses} !{# CommonDefs} !{# {# FunType} }
diff --git a/frontend/trans.icl b/frontend/trans.icl
index c72afbc..517eb34 100644
--- a/frontend/trans.icl
+++ b/frontend/trans.icl
@@ -497,10 +497,10 @@ independentConsumerRequirements exprs common_defs ai=:{ai_cur_ref_counts}
unify_ref_counts 2 _ = 2
-analyseGroups :: !{# CommonDefs} !*{! Group} !*{#FunDef} !*VarHeap !*ExpressionHeap
+analyseGroups :: !{# CommonDefs} !IndexRange !*{! Group} !*{#FunDef} !*VarHeap !*ExpressionHeap
-> (!CleanupInfo, !*{! ConsClasses}, !*{! Group}, !*{#FunDef}, !*VarHeap, !*ExpressionHeap)
-analyseGroups common_defs groups fun_defs var_heap expr_heap
- #! nr_of_funs = size fun_defs
+analyseGroups common_defs {ir_from, ir_to} groups fun_defs var_heap expr_heap
+ #! nr_of_funs = size fun_defs + ir_from - ir_to /* Sjaak */
nr_of_groups = size groups
= iFoldSt (analyse_group common_defs) 0 nr_of_groups
([], createArray nr_of_funs { cc_size = 0, cc_args = [], cc_linear_bits = []}, groups, fun_defs, var_heap, expr_heap)
@@ -1242,6 +1242,7 @@ generateFunction fd=:{fun_body = TransformedBody {tb_args,tb_rhs},fun_info = {fi
th_attrs = foldSt (\av attr_var_heap -> attr_var_heap <:= (av.av_info_ptr, SwitchFusion AVI_Empty (AVI_Attr (TA_Var av)))) st_attr_vars ti_type_heaps.th_attrs
(new_fun_args, new_arg_types, new_linear_bits, new_cons_args, th_vars, ti_symbol_heap, ti_fun_defs, ti_fun_heap, ti_var_heap)
+// = determine_args cc_linear_bits cc_args 0 prods tb_args (st_args ---> ("generateFunction", fd.fun_symb, fd.fun_index, fun_type)) (st_vars, ti_cons_args, tb_rhs) th_vars
= determine_args cc_linear_bits cc_args 0 prods tb_args st_args (st_vars, ti_cons_args, tb_rhs) th_vars
ti_symbol_heap ti_fun_defs ti_fun_heap ti_var_heap
(fresh_arg_types, ti_type_heaps) = substitute new_arg_types { ti_type_heaps & th_vars = th_vars, th_attrs = th_attrs }
@@ -1309,6 +1310,7 @@ where
, mapAppend (\_ -> { at_attribute = TA_Multi, at_annotation = AN_None, at_type = TE }) free_vars types
, mapAppend (\_ -> True) free_vars new_linear_bits
, mapAppend (\_ -> cActive) free_vars new_cons_args
+// , bind_class_types type.at_type (class_types ---> ("determine_arg", (class_app.app_symb.symb_name, class_app.app_args), type.at_type, class_types)) type_var_heap
, bind_class_types type.at_type class_types type_var_heap
, symbol_heap
, fun_defs
@@ -1379,8 +1381,14 @@ where
bind_type (TV {tv_info_ptr}) type type_var_heap
= type_var_heap <:= (tv_info_ptr, TVI_Type type)
- bind_type (TA _ arg_types1) (TA _ arg_types2) type_var_heap
- = bind_types arg_types1 arg_types2 type_var_heap
+ bind_type (TA {type_name} arg_types1) (TA _ arg_types2) type_var_heap
+ | length arg_types1 == length arg_types2
+ = bind_types arg_types1 arg_types2 type_var_heap
+ = abort ("bind_type (trans.icl)" ---> (type_name, arg_types1, arg_types2))
+ bind_type (CV {tv_info_ptr} :@: arg_types1) (TA type_cons arg_types2) type_var_heap
+ # type_arity = type_cons.type_arity - length arg_types1
+ type_var_heap = type_var_heap <:= (tv_info_ptr, TVI_Type (TA {type_cons & type_arity = type_arity} (take type_arity arg_types2)))
+ = bind_types arg_types1 (drop type_arity arg_types2) type_var_heap
bind_type _ _ type_var_heap
= type_var_heap
@@ -1729,7 +1737,8 @@ where
= (Var var, writeVarInfo var_info_ptr VI_Empty (writeVarInfo var.var_info_ptr VI_Empty var_heap))
determineProducer is_applied_to_macro_fun linear_bit app=:{app_symb = symb=:{symb_kind = SK_Function { glob_module, glob_object }}, app_args} _
new_args prod_index producers ti
- | glob_module <> cIclModIndex
+ #! max_index = size ti.ti_cons_args
+ | glob_module <> cIclModIndex || glob_object >= max_index /* Sjaak, to skip array functions */
= (producers, [App app : new_args ], ti)
# (fun_def, ti_fun_defs) = (ti.ti_fun_defs)![glob_object]
ti = { ti & ti_fun_defs=ti_fun_defs }
@@ -1932,7 +1941,6 @@ convertSymbolType common_defs st imported_types collected_imports type_heaps va
{ ets_type_defs = imported_types, ets_collected_conses = collected_imports, ets_type_heaps= type_heaps, ets_var_heap = var_heap }
= (st, ets_type_defs, ets_collected_conses, ets_type_heaps, ets_var_heap)
-
:: ExpandTypeState =
{ ets_type_defs :: !.{#{#CheckedTypeDef}}
, ets_collected_conses :: !ImportedConstructors
@@ -1961,25 +1969,55 @@ where
instance expandSynTypes Type
where
- expandSynTypes common_defs (TA type_symb=:{type_index={glob_object,glob_module},type_name} types) ets=:{ets_type_defs}
- # ({td_rhs,td_name,td_args},ets_type_defs) = ets_type_defs![glob_module].[glob_object]
- ets = { ets & ets_type_defs = ets_type_defs }
- = case td_rhs of
- SynType rhs_type
- # (type, ets_type_heaps) = substitute rhs_type.at_type (fold2St bind_var_and_attr td_args types ets.ets_type_heaps)
- // ---> (td_name, td_args, rhs_type.at_type))
- -> expandSynTypes common_defs type { ets & ets_type_heaps = ets_type_heaps }
- _
- # (types, ets) = expandSynTypes common_defs types ets
- | glob_module == cIclModIndex
- -> (TA type_symb types, ets)
- -> (TA type_symb types, collect_imported_constructors common_defs glob_module td_rhs ets)
- where
+ expandSynTypes common_defs (arg_type --> res_type) ets
+ # ((arg_type, res_type), ets) = expandSynTypes common_defs (arg_type, res_type) ets
+ = (arg_type --> res_type, ets)
+ expandSynTypes common_defs type=:(TB _) ets
+ = (type, ets)
+ expandSynTypes common_defs (cons_var :@: types) ets
+ # (types, ets) = expandSynTypes common_defs types ets
+ = (cons_var :@: types, ets)
+ expandSynTypes common_defs type=:(TA type_symb types) ets
+ = expand_syn_types_in_TA common_defs type_symb types TA_Multi ets
+ expandSynTypes common_defs type ets
+ = (type, ets)
+
+instance expandSynTypes [a] | expandSynTypes a
+where
+ expandSynTypes common_defs list ets
+ = mapSt (expandSynTypes common_defs) list ets
+
+
+instance expandSynTypes (a,b) | expandSynTypes a & expandSynTypes b
+where
+ expandSynTypes common_defs tuple ets
+ = app2St (expandSynTypes common_defs, expandSynTypes common_defs) tuple ets
+
+expand_syn_types_in_TA common_defs type_symb=:{type_index={glob_object,glob_module},type_name} types attribute ets=:{ets_type_defs}
+ # ({td_rhs,td_name,td_args,td_attribute},ets_type_defs) = ets_type_defs![glob_module].[glob_object]
+ ets = { ets & ets_type_defs = ets_type_defs }
+ = case td_rhs of
+ SynType rhs_type
+ # ets_type_heaps = bind_attr td_attribute attribute ets.ets_type_heaps
+ ets_type_heaps = (fold2St bind_var_and_attr td_args types ets_type_heaps)
+ (type, ets_type_heaps) = substitute rhs_type.at_type ets_type_heaps
+ -> expandSynTypes common_defs type { ets & ets_type_heaps = ets_type_heaps }
+ _
+ # (types, ets) = expandSynTypes common_defs types ets
+ | glob_module == cIclModIndex
+ -> ( TA type_symb types, ets)
+ -> ( TA type_symb types, collect_imported_constructors common_defs glob_module td_rhs ets)
+where
bind_var_and_attr { atv_attribute = TA_Var {av_info_ptr}, atv_variable = {tv_info_ptr} } {at_attribute,at_type} type_heaps=:{th_vars,th_attrs}
= { type_heaps & th_vars = th_vars <:= (tv_info_ptr, TVI_Type at_type), th_attrs = th_attrs <:= (av_info_ptr, AVI_Attr at_attribute) }
bind_var_and_attr { atv_variable = {tv_info_ptr}} {at_type} type_heaps=:{th_vars}
= { type_heaps & th_vars = th_vars <:= (tv_info_ptr, TVI_Type at_type) }
+ bind_attr (TA_Var {av_info_ptr}) attribute type_heaps=:{th_attrs}
+ = { type_heaps & th_attrs = th_attrs <:= (av_info_ptr, AVI_Attr attribute) }
+ bind_attr _ attribute type_heaps
+ = type_heaps
+
collect_imported_constructors common_defs mod_index (RecordType {rt_constructor}) ets=:{ets_collected_conses,ets_var_heap}
# (ets_collected_conses, ets_var_heap)
= collect_imported_constructor mod_index common_defs.[mod_index].com_cons_defs rt_constructor (ets_collected_conses, ets_var_heap)
@@ -2003,32 +2041,17 @@ where
has_been_collected _ = False
- expandSynTypes common_defs (arg_type --> res_type) ets
- # ((arg_type, res_type), ets) = expandSynTypes common_defs (arg_type, res_type) ets
- = (arg_type --> res_type, ets)
- expandSynTypes common_defs (cons_var :@: types) ets
- # (types, ets) = expandSynTypes common_defs types ets
- = (cons_var :@: types, ets)
- expandSynTypes common_defs type ets
- = (type, ets)
-
-instance expandSynTypes [a] | expandSynTypes a
-where
- expandSynTypes common_defs list ets
- = mapSt (expandSynTypes common_defs) list ets
-
-
-instance expandSynTypes (a,b) | expandSynTypes a & expandSynTypes b
-where
- expandSynTypes common_defs tuple ets
- = app2St (expandSynTypes common_defs, expandSynTypes common_defs) tuple ets
-
instance expandSynTypes AType
where
- expandSynTypes common_defs atype=:{at_type} ets
- # (at_type, ets) = expandSynTypes common_defs at_type ets
- = ({ atype & at_type = at_type }, ets)
-
+ expandSynTypes common_defs atype ets
+ = expand_syn_types_in_a_type common_defs atype ets
+ where
+ expand_syn_types_in_a_type common_defs atype=:{at_type = TA type_symb types, at_attribute} ets
+ # (at_type, ets) = expand_syn_types_in_TA common_defs type_symb types at_attribute ets
+ = ({ atype & at_type = at_type }, ets)
+ expand_syn_types_in_a_type common_defs atype ets
+ # (at_type, ets) = expandSynTypes common_defs atype.at_type ets
+ = ({ atype & at_type = at_type }, ets)
:: FreeVarInfo =
{ fvi_var_heap :: !.VarHeap