aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--frontend/analtypes.icl40
-rw-r--r--frontend/check.dcl4
-rw-r--r--frontend/check.icl143
-rw-r--r--frontend/checkFunctionBodies.icl5
-rw-r--r--frontend/checksupport.icl17
-rw-r--r--frontend/comparedefimp.icl10
-rw-r--r--frontend/convertDynamics.icl2
-rw-r--r--frontend/convertcases.icl11
-rw-r--r--frontend/explicitimports.icl2
-rw-r--r--frontend/frontend.icl1
-rw-r--r--frontend/general.dcl2
-rw-r--r--frontend/general.icl2
-rw-r--r--frontend/generics.icl11
-rw-r--r--frontend/overloading.icl2
-rw-r--r--frontend/refmark.icl415
-rw-r--r--frontend/syntax.dcl46
-rw-r--r--frontend/syntax.icl39
-rw-r--r--frontend/trans.icl2
-rw-r--r--frontend/type.icl79
-rw-r--r--frontend/typesupport.icl8
-rw-r--r--frontend/unitype.icl4
21 files changed, 483 insertions, 362 deletions
diff --git a/frontend/analtypes.icl b/frontend/analtypes.icl
index 3724b07..b7e2281 100644
--- a/frontend/analtypes.icl
+++ b/frontend/analtypes.icl
@@ -653,29 +653,17 @@ determine_kinds_of_type_contexts modules type_contexts class_infos as
where
determine_kinds_of_type_context :: !{#CommonDefs} !TypeContext !(!*ClassDefInfos, !*AnalyseState) -> (!*ClassDefInfos, !*AnalyseState)
determine_kinds_of_type_context modules {tc_class={glob_module,glob_object={ds_ident,ds_index}},tc_types} (class_infos, as)
-// # (class_kinds, class_infos) = myselect ds_ident class_infos glob_module ds_index
# (class_kinds, class_infos) = class_infos![glob_module,ds_index]
- as = fold2St (verify_kind_of_type modules) class_kinds tc_types as
- = (class_infos, as)
-
+ | length class_kinds == length tc_types
+ # as = fold2St (verify_kind_of_type modules) class_kinds tc_types as
+ = (class_infos, as)
+ = abort ("determine_kinds_of_type_context" ---> (ds_ident, class_kinds, tc_types))
+
verify_kind_of_type modules req_kind type as
# (kind_of_type, as=:{as_kind_heap,as_error}) = determineKind modules type as
{uki_kind_heap, uki_error} = unifyKinds kind_of_type (kindToKindInfo req_kind) {uki_kind_heap = as_kind_heap, uki_error = as_error}
= { as & as_kind_heap = uki_kind_heap, as_error = uki_error }
-/*
-import cheat
-
-myselect name array i j
- # (copy, array) = uniqueCopy array
- #! i_size = size copy
- | i < i_size
- #! j_size = size copy.[i]
- | j < j_size
- = array![i].[j]
- = abort (("second index out of range " +++ toString j +++ ">=" +++ toString j_size) ---> ("myselect", name, i))
- = abort (("first index out of range " +++ toString i +++ ">=" +++ toString i_size) ---> ("myselect", name, j))
-*/
determine_kinds_type_list :: !{#CommonDefs} [AType] !*AnalyseState -> *AnalyseState
determine_kinds_type_list modules types as
= foldSt (force_star_kind modules) types as
@@ -684,7 +672,6 @@ where
# (off_kind, as=:{as_kind_heap,as_error}) = determineKind modules type as
{uki_kind_heap, uki_error} = unifyKinds off_kind KI_Const {uki_kind_heap = as_kind_heap, uki_error = as_error}
= { as & as_kind_heap = uki_kind_heap, as_error = uki_error }
-
class_def_error = "cyclic dependencies between type classes"
type_appl_error = "type constructor has too many arguments"
@@ -727,13 +714,14 @@ where
as_type_var_heap = bind_kind_vars class_args class_kind_vars as.as_type_var_heap
as_error = pushErrorAdmin (newPosition class_name class_pos) as.as_error
class_infos = { class_infos & [class_module,class_index] = cyclicClassInfoMark }
- (class_infos, as) = foldSt (determine_kinds_of_context_class modules) class_context (class_infos,
+ (class_infos, as) = determine_kinds_of_context_classes class_context (class_infos,
{ as & as_kind_heap = as_kind_heap, as_type_var_heap = as_type_var_heap, as_error = as_error })
| as.as_error.ea_ok
# (class_infos, as) = determine_kinds_of_type_contexts modules class_context class_infos as
(class_infos, as) = determine_kinds_of_members modules class_members com_member_defs class_kind_vars (class_infos, as)
(class_kinds, as_kind_heap) = retrieve_class_kinds class_kind_vars as.as_kind_heap
= ({class_infos & [class_module,class_index] = class_kinds }, { as & as_kind_heap = as_kind_heap, as_error = popErrorAdmin as.as_error})
+// ---> ("determine_kinds_of_class", class_name, class_kinds)
= ({class_infos & [class_module,class_index] = [ KindConst \\ _ <- [1..class_arity]] }, { as & as_error = popErrorAdmin as.as_error })
| isCyclicClass class_infos.[class_module,class_index]
# class_name = modules.[class_module].com_class_defs.[class_index].class_name
@@ -746,12 +734,16 @@ where
= fresh_kind_vars (dec nr_of_vars) [ kind_info_ptr : fresh_vars] (kind_heap <:= (kind_info_ptr, KI_Var kind_info_ptr))
= (fresh_vars, kind_heap)
- determine_kinds_of_context_class modules {tc_class={glob_module,glob_object={ds_index}}} infos_and_as
- = determine_kinds_of_class modules glob_module ds_index infos_and_as
isCyclicClass [ KindCycle : _ ] = True
isCyclicClass _ = False
+ determine_kinds_of_context_classes contexts class_infos_and_as
+ = foldSt (determine_kinds_of_context_class modules) contexts class_infos_and_as
+ where
+ determine_kinds_of_context_class modules {tc_class={glob_module,glob_object={ds_index}}} infos_and_as
+ = determine_kinds_of_class modules glob_module ds_index infos_and_as
+
bind_kind_vars type_vars kind_ptrs type_var_heap
= fold2St bind_kind_var type_vars kind_ptrs type_var_heap
where
@@ -767,14 +759,16 @@ where
determine_kinds_of_members modules members member_defs class_kind_vars (class_infos, as)
= iFoldSt (determine_kind_of_member modules members member_defs class_kind_vars) 0 (size members) (class_infos, as)
- determine_kind_of_member modules members member_defs class_kind_vars loc_member_index (class_infos, as)
+ determine_kind_of_member modules members member_defs class_kind_vars loc_member_index class_infos_and_as
# glob_member_index = members.[loc_member_index].ds_index
{me_class_vars,me_type={st_vars,st_args,st_result,st_context}} = member_defs.[glob_member_index]
+ other_contexts = (tl st_context)
+ (class_infos, as) = determine_kinds_of_context_classes other_contexts class_infos_and_as
as_type_var_heap = clear_variables st_vars as.as_type_var_heap
as_type_var_heap = bind_kind_vars me_class_vars class_kind_vars as_type_var_heap
(as_type_var_heap, as_kind_heap) = fresh_kind_vars_for_unbound_vars st_vars as_type_var_heap as.as_kind_heap
as = determine_kinds_type_list modules [st_result:st_args] { as & as_type_var_heap = as_type_var_heap, as_kind_heap = as_kind_heap}
- (class_infos, as) = determine_kinds_of_type_contexts modules (tl st_context) class_infos as
+ (class_infos, as) = determine_kinds_of_type_contexts modules other_contexts class_infos as
= (class_infos, as)
where
fresh_kind_vars_for_unbound_vars type_vars type_var_heap kind_heap
diff --git a/frontend/check.dcl b/frontend/check.dcl
index 1f5129a..8f9a018 100644
--- a/frontend/check.dcl
+++ b/frontend/check.dcl
@@ -7,8 +7,8 @@ checkModule :: !ScannedModule !IndexRange ![FunDef] !Int !Int !(Optional Scanned
checkFunctions :: !Index !Level !Index !Index !*{#FunDef} !*ExpressionInfo !*Heaps !*CheckState -> (!*{#FunDef}, !*ExpressionInfo, !*Heaps, !*CheckState)
-determineTypeOfMemberInstance :: !SymbolType ![TypeVar] !InstanceType !Specials !*TypeHeaps !u:(Optional (v:{#DclModule}, w:{#CheckedTypeDef}, Index)) !(Optional *ErrorAdmin)
- -> (!SymbolType, !Specials, !*TypeHeaps, !u:Optional (v:{#DclModule}, w:{#CheckedTypeDef}), !Optional *ErrorAdmin)
+determineTypeOfMemberInstance :: !SymbolType ![TypeVar] !InstanceType !Specials !*TypeHeaps !u:(Optional (v:{#DclModule}, w:{#CheckedTypeDef}, Index)) !*ErrorAdmin
+ -> (!SymbolType, !Specials, !*TypeHeaps, !u:Optional (v:{#DclModule}, w:{#CheckedTypeDef}), !*ErrorAdmin)
arrayFunOffsetToPD_IndexTable :: !w:{# MemberDef} !v:{# PredefinedSymbol} -> (!{# Index}, !x:{#MemberDef}, !v:{#PredefinedSymbol}) , [w<=x]
diff --git a/frontend/check.icl b/frontend/check.icl
index 1ddda1f..1a02ac3 100644
--- a/frontend/check.icl
+++ b/frontend/check.icl
@@ -109,8 +109,8 @@ checkSpecial mod_index fun_type=:{ft_type} fun_index subst (next_inst_index, spe
{ heaps & hp_type_heaps = hp_type_heaps, hp_var_heap = hp_var_heap }, predef_symbols, error))
where
substitute_type st=:{st_vars,st_attr_vars,st_args,st_result,st_context,st_attr_env} environment type_heaps error
- # (st_vars, st_attr_vars, [st_result : st_args], st_context, st_attr_env, _, type_heaps, Yes error)
- = instantiateTypes st_vars st_attr_vars [ st_result : st_args ] st_context st_attr_env environment [] type_heaps (Yes error)
+ # (st_vars, st_attr_vars, [st_result : st_args], st_context, st_attr_env, _, type_heaps, error)
+ = instantiateTypes st_vars st_attr_vars [ st_result : st_args ] st_context st_attr_env environment [] type_heaps error
= ({st & st_vars = st_vars, st_args = st_args, st_result = st_result, st_attr_vars = st_attr_vars,
st_context = st_context, st_attr_env = st_attr_env }, type_heaps, error)
@@ -399,8 +399,8 @@ where
instance_types member_defs type_defs modules var_heap type_heaps
{ cs & cs_error = checkError class_member.ds_ident "used with wrong arity" cs.cs_error}
# ({me_symb, me_type,me_class_vars,me_pos}, member_defs, modules) = getMemberDef member_mod_index class_member.ds_index module_index member_defs modules
- (instance_type, _, type_heaps, Yes (modules, type_defs), Yes cs_error)
- = determineTypeOfMemberInstance me_type me_class_vars ins_type SP_None type_heaps (Yes (modules, type_defs, x_main_dcl_module_n)) (Yes cs.cs_error)
+ (instance_type, _, type_heaps, Yes (modules, type_defs), cs_error)
+ = determineTypeOfMemberInstance me_type me_class_vars ins_type SP_None type_heaps (Yes (modules, type_defs, x_main_dcl_module_n)) cs.cs_error
(st_context, var_heap) = initializeContextVariables instance_type.st_context var_heap
= check_member_instances module_index member_mod_index (inc mem_offset) class_size ins_members class_members class_name ins_pos ins_type
[ (ins_member.ds_index, { instance_type & st_context = st_context }) : instance_types ] member_defs type_defs modules var_heap type_heaps { cs & cs_error = cs_error }
@@ -432,35 +432,32 @@ getGenericDef {glob_module, glob_object={ds_ident, ds_index}} mod_index generic_
= (dcl_mod.dcl_common.com_generic_defs.[ds_index], generic_defs, modules)
// ..AA
-instantiateTypes :: ![TypeVar] ![AttributeVar] !types ![TypeContext] ![AttrInequality] !SpecialSubstitution ![SpecialSubstitution] !*TypeHeaps !(Optional *ErrorAdmin)
- -> (![TypeVar], ![AttributeVar], !types , ![TypeContext], ![AttrInequality], ![SpecialSubstitution], !*TypeHeaps, !(Optional *ErrorAdmin)) | substitute types
-instantiateTypes old_type_vars old_attr_vars types type_contexts attr_env {ss_environ, ss_vars, ss_attrs, ss_context} special_subst_list type_heaps=:{th_vars, th_attrs} opt_error
+instantiateTypes :: ![TypeVar] ![AttributeVar] ![AType] ![TypeContext] ![AttrInequality] !SpecialSubstitution ![SpecialSubstitution] !*TypeHeaps !*ErrorAdmin
+ -> (![TypeVar], ![AttributeVar], ![AType], ![TypeContext], ![AttrInequality], ![SpecialSubstitution], !*TypeHeaps, !*ErrorAdmin)
+instantiateTypes old_type_vars old_attr_vars types type_contexts attr_env {ss_environ, ss_vars, ss_attrs, ss_context} special_subst_list type_heaps=:{th_vars, th_attrs} error
# th_vars = clear_vars old_type_vars th_vars
(new_type_vars, th_vars) = foldSt build_var_subst ss_vars ([], th_vars)
- (new_attr_vars, th_attrs) = foldSt build_attr_subst ss_attrs ([], th_attrs)
+ (new_attr_vars, th_attrs) = foldSt build_attr_var_subst ss_attrs ([], th_attrs)
type_heaps = foldSt build_type_subst ss_environ { type_heaps & th_vars = th_vars, th_attrs = th_attrs }
(ok1, new_ss_context, type_heaps) = substitute ss_context type_heaps
- (inst_vars, th_vars) = foldSt determine_free_var old_type_vars (new_type_vars, type_heaps.th_vars)
- (inst_attr_vars, th_attrs) = foldSt build_attr_subst old_attr_vars (new_attr_vars, type_heaps.th_attrs)
+ (inst_vars, th_vars) = foldSt determine_free_var old_type_vars (new_type_vars, type_heaps.th_vars)
+ (inst_attr_vars, th_attrs) = foldSt build_attr_var_subst old_attr_vars (new_attr_vars, type_heaps.th_attrs)
- (ok2, inst_types, type_heaps) = substitute types { type_heaps & th_vars = th_vars, th_attrs = th_attrs }
+ (inst_types, (ok2, type_heaps)) = mapSt substitue_arg_type types (True, { type_heaps & th_vars = th_vars, th_attrs = th_attrs })
+// (ok2, inst_types, type_heaps) = substitute types { type_heaps & th_vars = th_vars, th_attrs = th_attrs }
(ok3, inst_contexts, type_heaps) = substitute type_contexts type_heaps
(ok4, inst_attr_env, type_heaps) = substitute attr_env type_heaps
- (special_subst_list, th_vars) = mapSt adjust_special_subst special_subst_list type_heaps.th_vars
-
- opt_error = case ok1 && ok2 && ok3 && ok4 of
- True -> opt_error
- _ -> case opt_error of
- No -> No
- Yes error_admin
- -> Yes (checkError "instance type incompatible with class type" ""
- error_admin)
- // e.g.:class c a :: (a Int); instance c Real
-
- = (inst_vars, inst_attr_vars, inst_types, inst_contexts ++ new_ss_context, inst_attr_env, special_subst_list, { type_heaps & th_vars = th_vars }, opt_error)
+ (special_subst_list, th_vars) = mapSt adjust_special_subst special_subst_list type_heaps.th_vars
+ error = case ok1 && ok2 && ok3 && ok4 of
+ True
+ -> error
+ False
+ -> checkError "instance type incompatible with class type" "" error
+
+ = (inst_vars, inst_attr_vars, inst_types, inst_contexts ++ new_ss_context, inst_attr_env, special_subst_list, { type_heaps & th_vars = th_vars }, error)
where
clear_vars type_vars type_var_heap = foldSt (\tv -> writePtr tv.tv_info_ptr TVI_Empty) type_vars type_var_heap
@@ -492,12 +489,34 @@ where
// ... RWS
= { type_heaps & th_vars = writePtr bind_dst.tv_info_ptr (TVI_Type bind_src) type_heaps.th_vars}
+ substitue_arg_type at=:{at_type = TFA type_vars type} (was_ok, type_heaps)
+ # (fresh_type_vars, type_heaps) = foldSt build_avar_subst type_vars ([], type_heaps)
+ (ok, new_at, type_heaps) = substitute {at & at_type = type} type_heaps
+ = ({ new_at & at_type = TFA fresh_type_vars new_at.at_type}, (was_ok && ok, type_heaps))
+ substitue_arg_type type (was_ok, type_heaps)
+ # (ok, type, type_heaps) = substitute type type_heaps
+ = (type, (was_ok && ok, type_heaps))
+
build_var_subst var (free_vars, type_var_heap)
# (new_info_ptr, type_var_heap) = newPtr TVI_Empty type_var_heap
new_fv = { var & tv_info_ptr = new_info_ptr}
= ([ new_fv : free_vars ], writePtr var.tv_info_ptr (TVI_Type (TV new_fv)) type_var_heap)
- build_attr_subst attr (free_attrs, attr_var_heap)
+ build_avar_subst atv=:{atv_variable,atv_attribute} (free_vars, type_heaps)
+ # (new_info_ptr, th_vars) = newPtr TVI_Empty type_heaps.th_vars
+ new_fv = { atv_variable & tv_info_ptr = new_info_ptr}
+ th_vars = th_vars <:= (atv_variable.tv_info_ptr, TVI_Type (TV new_fv))
+ (new_attr, th_attrs) = build_attr_subst atv_attribute type_heaps.th_attrs
+ = ([ { atv & atv_variable = new_fv, atv_attribute = new_attr } : free_vars], { type_heaps & th_vars = th_vars, th_attrs = th_attrs })
+ where
+ build_attr_subst (TA_Var avar) attr_var_heap
+ # (new_info_ptr, attr_var_heap) = newPtr AVI_Empty attr_var_heap
+ new_attr = { avar & av_info_ptr = new_info_ptr}
+ = (TA_Var new_attr, attr_var_heap <:= (avar.av_info_ptr, AVI_Attr (TA_Var new_attr)))
+ build_attr_subst attr attr_var_heap
+ = (attr, attr_var_heap)
+
+ build_attr_var_subst attr (free_attrs, attr_var_heap)
# (new_info_ptr, attr_var_heap) = newPtr AVI_Empty attr_var_heap
new_attr = { attr & av_info_ptr = new_info_ptr}
= ([new_attr : free_attrs], writePtr attr.av_info_ptr (AVI_Attr (TA_Var new_attr)) attr_var_heap)
@@ -510,47 +529,41 @@ where
# (TVI_Type (TV new_tv), type_var_heap) = readPtr tv_info_ptr type_var_heap
= ({ bind & bind_dst = new_tv }, type_var_heap)
-substituteInstanceType :: !InstanceType !SpecialSubstitution !*TypeHeaps !*ErrorAdmin -> (!InstanceType,!*TypeHeaps,!.ErrorAdmin)
-substituteInstanceType it=:{it_vars,it_attr_vars,it_types,it_context} environment type_heaps cs_error
- # (it_vars, it_attr_vars, it_types, it_context, _, _, type_heaps, Yes cs_error)
- = instantiateTypes it_vars it_attr_vars it_types it_context [] environment [] type_heaps (Yes cs_error)
- = ({it & it_vars = it_vars, it_types = it_types, it_attr_vars = it_attr_vars, it_context = it_context }, type_heaps, cs_error)
-
-determineTypeOfMemberInstance :: !SymbolType ![TypeVar] !InstanceType !Specials !*TypeHeaps !u:(Optional (v:{#DclModule}, w:{#CheckedTypeDef}, Index)) !(Optional *ErrorAdmin)
- -> (!SymbolType, !Specials, !*TypeHeaps, !u:Optional (v:{#DclModule}, w:{#CheckedTypeDef}), !Optional *ErrorAdmin)
-determineTypeOfMemberInstance mem_st class_vars {it_types,it_vars,it_attr_vars,it_context} specials type_heaps opt_modules opt_error
+determineTypeOfMemberInstance :: !SymbolType ![TypeVar] !InstanceType !Specials !*TypeHeaps !u:(Optional (v:{#DclModule}, w:{#CheckedTypeDef}, Index)) !*ErrorAdmin
+ -> (!SymbolType, !Specials, !*TypeHeaps, !u:Optional (v:{#DclModule}, w:{#CheckedTypeDef}), !*ErrorAdmin)
+determineTypeOfMemberInstance mem_st class_vars {it_types,it_vars,it_attr_vars,it_context} specials type_heaps opt_modules error
# env = { ss_environ = foldl2 (\binds var type -> [ {bind_src = type, bind_dst = var} : binds]) [] class_vars it_types,
ss_context = it_context, ss_vars = it_vars, ss_attrs = it_attr_vars}
- (st, specials, type_heaps, opt_error)
- = determine_type_of_member_instance mem_st env specials type_heaps opt_error
- (type_heaps, opt_modules, opt_error)
- = check_attribution_consistency mem_st type_heaps opt_modules opt_error
- = (st, specials, type_heaps, opt_modules, opt_error)
+ (st, specials, type_heaps, error)
+ = determine_type_of_member_instance mem_st env specials type_heaps error
+ (type_heaps, opt_modules, error)
+ = check_attribution_consistency mem_st type_heaps opt_modules error
+ = (st, specials, type_heaps, opt_modules, error)
where
- determine_type_of_member_instance mem_st=:{st_context} env (SP_Substitutions substs) type_heaps opt_error
- # (mem_st, substs, type_heaps, opt_error)
- = substitute_symbol_type { mem_st & st_context = tl st_context } env substs type_heaps opt_error
- = (mem_st, SP_Substitutions substs, type_heaps, opt_error)
- determine_type_of_member_instance mem_st=:{st_context} env SP_None type_heaps opt_error
- # (mem_st, _, type_heaps, opt_error)
- = substitute_symbol_type { mem_st & st_context = tl st_context } env [] type_heaps opt_error
- = (mem_st, SP_None, type_heaps, opt_error)
-
- substitute_symbol_type st=:{st_vars,st_attr_vars,st_args,st_result,st_context,st_attr_env} environment specials type_heaps opt_error
- # (st_vars, st_attr_vars, [st_result : st_args], st_context, st_attr_env, specials, type_heaps, opt_error)
- = instantiateTypes st_vars st_attr_vars [ st_result : st_args ] st_context st_attr_env environment specials type_heaps opt_error
+ determine_type_of_member_instance mem_st=:{st_context} env (SP_Substitutions substs) type_heaps error
+ # (mem_st, substs, type_heaps, error)
+ = substitute_symbol_type { mem_st & st_context = tl st_context } env substs type_heaps error
+ = (mem_st, SP_Substitutions substs, type_heaps, error)
+ determine_type_of_member_instance mem_st=:{st_context} env SP_None type_heaps error
+ # (mem_st, _, type_heaps, error)
+ = substitute_symbol_type { mem_st & st_context = tl st_context } env [] type_heaps error
+ = (mem_st, SP_None, type_heaps, error)
+
+ substitute_symbol_type st=:{st_vars,st_attr_vars,st_args,st_result,st_context,st_attr_env} environment specials type_heaps error
+ # (st_vars, st_attr_vars, [st_result : st_args], st_context, st_attr_env, specials, type_heaps, error)
+ = instantiateTypes st_vars st_attr_vars [ st_result : st_args ] st_context st_attr_env environment specials type_heaps error
= ({st & st_vars = st_vars, st_args = st_args, st_result = st_result, st_attr_vars = st_attr_vars,
- st_context = st_context, st_attr_env = st_attr_env }, specials, type_heaps, opt_error)
+ st_context = st_context, st_attr_env = st_attr_env }, specials, type_heaps, error)
- check_attribution_consistency {st_args, st_result} type_heaps No No
- = (type_heaps, No, No)
- check_attribution_consistency {st_args, st_result} type_heaps=:{th_vars} (Yes (modules, type_defs, x_main_dcl_module_n)) (Yes error)
+ check_attribution_consistency {st_args, st_result} type_heaps No error
+ = (type_heaps, No, error)
+ check_attribution_consistency {st_args, st_result} type_heaps=:{th_vars} (Yes (modules, type_defs, x_main_dcl_module_n)) error
// it is assumed that all type vars bindings done in instantiateTypes are still valid
# (_, th_vars, modules, type_defs, error)
= foldSt (foldATypeSt (check_it x_main_dcl_module_n) (\_ st -> st))
[st_result:st_args]
(False, th_vars, modules, type_defs, error)
- = ({ type_heaps & th_vars = th_vars }, Yes (modules, type_defs), Yes error)
+ = ({ type_heaps & th_vars = th_vars }, Yes (modules, type_defs), error)
check_it _ {at_attribute} (error_already_given, th_vars, modules, type_defs, error)
| at_attribute==TA_Unique || error_already_given
@@ -639,8 +652,6 @@ where
(next_mem_inst_index + class_size) mod_index all_class_specials class_defs member_defs generic_defs modules
{ instance_defs & [inst_index] = { instance_def & ins_specials = ins_specials }} type_heaps var_heap predef_symbols error
= (memb_inst_defs1 ++ memb_inst_defs2, next_mem_inst_index, all_class_specials, class_defs, member_defs, generic_defs, modules, instance_defs, type_heaps, var_heap ,predef_symbols,error)
- //---> ("determine_types_of_instances: generic ", gen_name, mod_index, inst_index, x_main_dcl_module_n)
-// = abort "exporting generics is not yet supported\n"
# ({class_name, class_members}, class_defs, modules) = getClassDef ins_class mod_index class_defs modules
class_size = size class_members
(ins_members, memb_inst_defs1, member_defs, modules, type_heaps, var_heap, error)
@@ -667,8 +678,8 @@ where
({me_symb,me_type,me_priority,me_class_vars}, member_defs, modules) = getMemberDef member_mod_index class_member.ds_index module_index member_defs modules
cs_error
= pushErrorAdmin (newPosition class_name ins_pos) cs_error
- (instance_type, new_ins_specials, type_heaps, Yes (modules, _), Yes cs_error)
- = determineTypeOfMemberInstance me_type me_class_vars ins_type ins_specials type_heaps (Yes (modules, {}, cUndef)) (Yes cs_error)
+ (instance_type, new_ins_specials, type_heaps, Yes (modules, _), cs_error)
+ = determineTypeOfMemberInstance me_type me_class_vars ins_type ins_specials type_heaps (Yes (modules, {}, cUndef)) cs_error
cs_error
= popErrorAdmin cs_error
(new_info_ptr, var_heap) = newPtr VI_Empty var_heap
@@ -686,12 +697,20 @@ where
= (SP_ContextTypes list_of_specials, next_inst_index, all_instances, type_heaps, predef_symbols, error)
where
check_specials mod_index inst=:{ins_type} type_offset [ subst : substs ] list_of_specials next_inst_index all_instances type_heaps predef_symbols error
- # (special_type, type_heaps, error) = substituteInstanceType ins_type subst type_heaps error
+ # (special_type, type_heaps, error) = substitute_instance_type ins_type subst type_heaps error
(spec_types, predef_symbols,error) = checkAndCollectTypesOfContextsOfSpecials special_type.it_context predef_symbols error
special = { spec_index = { glob_module = mod_index, glob_object = next_inst_index }, spec_types = spec_types,
spec_vars = subst.ss_vars, spec_attrs = subst.ss_attrs }
= check_specials mod_index inst (inc type_offset) substs [ special : list_of_specials ] (inc next_inst_index)
[{ inst & ins_type = { special_type & it_context = [] }, ins_specials = SP_TypeOffset type_offset} : all_instances ] type_heaps predef_symbols error
+ where
+ substitute_instance_type :: !InstanceType !SpecialSubstitution !*TypeHeaps !*ErrorAdmin -> (!InstanceType,!*TypeHeaps,!.ErrorAdmin)
+ substitute_instance_type it=:{it_vars,it_attr_vars,it_types,it_context} environment type_heaps cs_error
+ # (it_vars, it_attr_vars, it_atypes, it_context, _, _, type_heaps, cs_error)
+ = instantiateTypes it_vars it_attr_vars [MakeAttributedType type \\ type <- it_types] it_context [] environment [] type_heaps cs_error
+ = ({it & it_vars = it_vars, it_types = [ at_type \\ {at_type} <- it_atypes ], it_attr_vars = it_attr_vars, it_context = it_context }, type_heaps, cs_error)
+
+
check_specials mod_index inst=:{ins_type} type_offset [] list_of_specials next_inst_index all_instances type_heaps predef_symbols error
= (list_of_specials, next_inst_index, all_instances, type_heaps, predef_symbols, error)
check_instance_specials mod_index fun_type fun_index SP_None next_inst_index all_instances type_heaps predef_symbols error
@@ -2147,9 +2166,9 @@ check_needed_modules_are_imported mod_name extension cs=:{cs_x={x_needed_modules
= cs
where
check_it pd mod_name explanation extension cs=:{cs_predef_symbols, cs_symbol_table}
- #! {pds_ident} = cs_predef_symbols.[pd]
+ # (pds_ident, cs_predef_symbols) = cs_predef_symbols![pd].pds_ident
# ({ste_kind}, cs_symbol_table) = readPtr pds_ident.id_info cs_symbol_table
- cs = { cs & cs_symbol_table = cs_symbol_table }
+ cs = { cs & cs_symbol_table = cs_symbol_table, cs_predef_symbols = cs_predef_symbols }
= case ste_kind of
STE_ClosedModule
-> cs
diff --git a/frontend/checkFunctionBodies.icl b/frontend/checkFunctionBodies.icl
index 99248f1..93afa69 100644
--- a/frontend/checkFunctionBodies.icl
+++ b/frontend/checkFunctionBodies.icl
@@ -1945,12 +1945,11 @@ where
determine_selector mod_index type_mod_index type_index [{glob_module, glob_object} : selectors] selector_defs modules
| type_mod_index == glob_module
| type_mod_index == mod_index
- #! selector_def = selector_defs.[glob_object]
+ # (selector_def,selector_defs) = selector_defs![glob_object]
| selector_def.sd_type_index == type_index
= (glob_object, selector_def.sd_field_nr, selector_defs, modules)
= determine_selector mod_index type_mod_index type_index selectors selector_defs modules
- #! {dcl_common={com_selector_defs}} = modules.[glob_module]
- #! selector_def = com_selector_defs.[glob_object]
+ # (selector_def, modules) = modules![glob_module].dcl_common.com_selector_defs.[glob_object]
| selector_def.sd_type_index == type_index
= (glob_object, selector_def.sd_field_nr, selector_defs, modules)
= determine_selector mod_index type_mod_index type_index selectors selector_defs modules
diff --git a/frontend/checksupport.icl b/frontend/checksupport.icl
index 223da52..0fb2843 100644
--- a/frontend/checksupport.icl
+++ b/frontend/checksupport.icl
@@ -289,9 +289,9 @@ where
remove_declared_symbols_in_array :: !Int !{!Declaration} !*SymbolTable -> !*SymbolTable
remove_declared_symbols_in_array symbol_index symbols symbol_table
| symbol_index<size symbols
- #! (symbol,symbols) = symbols![symbol_index]
+ # symbol = symbols.[symbol_index]
# (Declaration {decl_ident={id_info}})=symbol
- #! entry = sreadPtr id_info symbol_table
+ # (entry, symbol_table) = readPtr id_info symbol_table
# {ste_kind,ste_def_level} = entry
| ste_kind == STE_Empty || ste_def_level > cModuleScope
= remove_declared_symbols_in_array (symbol_index+1) symbols symbol_table
@@ -325,7 +325,7 @@ NewEntry symbol_table symb_ptr def_kind def_index level previous :==
addDefToSymbolTable :: !Level !Index !Ident !STE_Kind !*SymbolTable !*ErrorAdmin -> (!* SymbolTable, !*ErrorAdmin)
addDefToSymbolTable level def_index def_ident=:{id_info} def_kind symbol_table error
- #! entry = sreadPtr id_info symbol_table
+ # (entry, symbol_table) = readPtr id_info symbol_table
| entry.ste_kind == STE_Empty || entry.ste_def_level <> level
# entry = {ste_index = def_index, ste_kind = def_kind, ste_def_level = level, ste_previous = entry }
= (symbol_table <:= (id_info,entry), error)
@@ -373,7 +373,8 @@ addDeclarationsOfDclModToSymbolTable ste_index locals imported cs
addImportedFunctionOrMacro :: !(Optional IndexRange) !Ident !Int !*CheckState -> (!Bool, !.CheckState)
addImportedFunctionOrMacro opt_dcl_macro_range ident=:{id_info} def_index cs=:{cs_symbol_table}
- #! entry = sreadPtr id_info cs_symbol_table
+ # (entry, cs_symbol_table) = readPtr id_info cs_symbol_table
+ cs = { cs & cs_symbol_table = cs_symbol_table }
= case entry.ste_kind of
STE_Empty
-> (True, { cs & cs_symbol_table = NewEntry cs.cs_symbol_table id_info (STE_FunctionOrMacro [])
@@ -432,7 +433,7 @@ addGlobalDefinitionsToSymbolTable decls cs
= foldSt add_global_definition decls cs
where
add_global_definition (Declaration {decl_ident=ident=:{id_info},decl_pos,decl_kind,decl_index}) cs=:{cs_symbol_table}
- #! entry = sreadPtr id_info cs_symbol_table
+ # (entry, cs_symbol_table) = readPtr id_info cs_symbol_table
| entry.ste_def_level < cGlobalScope
# cs = { cs & cs_symbol_table = NewEntry cs_symbol_table id_info decl_kind decl_index cGlobalScope entry }
= case decl_kind of
@@ -440,7 +441,7 @@ where
-> addFieldToSelectorDefinition selector_id { glob_module = NoIndex, glob_object = decl_index } cs
_
-> cs
- = { cs & cs_error = checkErrorWithIdentPos (newPosition ident decl_pos) "multiply defined" cs.cs_error}
+ = { cs & cs_symbol_table = cs_symbol_table, cs_error = checkErrorWithIdentPos (newPosition ident decl_pos) "multiply defined" cs.cs_error}
removeImportedSymbolsFromSymbolTable :: Declaration !*SymbolTable -> .SymbolTable
removeImportedSymbolsFromSymbolTable (Declaration {decl_ident=decl_ident=:{id_info}, decl_index}) symbol_table
@@ -495,7 +496,7 @@ removeLocalIdentsFromSymbolTable level idents symbol_table
removeIdentFromSymbolTable :: !.Int !Ident !*(Heap SymbolTableEntry) -> .Heap SymbolTableEntry;
removeIdentFromSymbolTable level {id_name,id_info} symbol_table
- #! {ste_previous,ste_def_level} = sreadPtr id_info symbol_table
+ # ({ste_previous,ste_def_level}, symbol_table) = readPtr id_info symbol_table
| level <= ste_def_level
= symbol_table <:= (id_info,ste_previous) // ---> ("removeIdentFromSymbolTable", id_name)
= symbol_table // ---> ("NO removeIdentFromSymbolTable", id_name)
@@ -510,7 +511,7 @@ where
= (defs, symbol_table)
#! def = defs.[from_index]
id_info = (toIdent def).id_info
- entry = sreadPtr id_info symbol_table
+ # (entry, symbol_table) = readPtr id_info symbol_table
| level == entry.ste_def_level
= remove_defs_from_symbol_table level (inc from_index) to_index defs (symbol_table <:= (id_info, entry.ste_previous))
= remove_defs_from_symbol_table level (inc from_index) to_index defs symbol_table
diff --git a/frontend/comparedefimp.icl b/frontend/comparedefimp.icl
index 2959e4e..a4baf5d 100644
--- a/frontend/comparedefimp.icl
+++ b/frontend/comparedefimp.icl
@@ -1114,10 +1114,10 @@ instance e_corresponds DynamicPattern where
o` e_corresponds_dp_type dcl.dp_type icl.dp_type
where
e_corresponds_dp_type dcl_expr_ptr icl_expr_ptr ec_state=:{ec_expr_heap, ec_tc_state}
- #! dcl_type
- = sreadPtr dcl_expr_ptr ec_expr_heap
- icl_type
- = sreadPtr icl_expr_ptr ec_expr_heap
+ # (dcl_type, ec_expr_heap)
+ = readPtr dcl_expr_ptr ec_expr_heap
+ (icl_type, ec_expr_heap)
+ = readPtr icl_expr_ptr ec_expr_heap
# (EI_DynamicTypeWithVars _ dcl_dyn_type _)
= dcl_type
(EI_DynamicTypeWithVars _ icl_dyn_type _)
@@ -1125,7 +1125,7 @@ instance e_corresponds DynamicPattern where
(corresponds, ec_tc_state)
= t_corresponds dcl_dyn_type icl_dyn_type ec_tc_state
ec_state
- = { ec_state & ec_tc_state = ec_tc_state }
+ = { ec_state & ec_tc_state = ec_tc_state, ec_expr_heap = ec_expr_heap }
| corresponds
= ec_state
= give_error "" ec_state
diff --git a/frontend/convertDynamics.icl b/frontend/convertDynamics.icl
index a25e048..9e46335 100644
--- a/frontend/convertDynamics.icl
+++ b/frontend/convertDynamics.icl
@@ -622,7 +622,7 @@ determine_defaults :: case_default default_expr varheap -> (this_case_default, n
2nd = directly surrounding default
*/
determine_defaults No default_expr=:(Yes (var=:{var_info_ptr}, indirection_var_list)) ci=:{ci_var_heap}
- #! var_info = sreadPtr var_info_ptr ci_var_heap
+ # (var_info, ci_var_heap) = readPtr var_info_ptr ci_var_heap
# (expression, ci) = toExpression default_expr {ci & ci_var_heap = ci_var_heap}
# expression
= expression// ---> expression
diff --git a/frontend/convertcases.icl b/frontend/convertcases.icl
index 3cf2454..b1de953 100644
--- a/frontend/convertcases.icl
+++ b/frontend/convertcases.icl
@@ -123,7 +123,7 @@ convertCasesInBody (TransformedBody body) (Yes type) group_index common_defs cs
checkImportedSymbol :: SymbKind VarInfoPtr ([SymbKind], *VarHeap) -> ([SymbKind], *VarHeap)
checkImportedSymbol symb_kind symb_type_ptr (collected_imports, var_heap)
- #! type_info = sreadPtr symb_type_ptr var_heap
+ # (type_info, var_heap) = readPtr symb_type_ptr var_heap
= case type_info of
VI_Used
-> (collected_imports, var_heap)
@@ -144,11 +144,12 @@ class weightedRefCount e :: RCInfo !e !*RCState -> *RCState
instance weightedRefCount BoundVar
where
- weightedRefCount rci=:{rci_depth} {var_name,var_info_ptr} rs=:{rcs_var_heap,rcs_free_vars}
- #! var_info = sreadPtr var_info_ptr rcs_var_heap
+ weightedRefCount rci=:{rci_depth} {var_name,var_info_ptr} rs=:{rcs_var_heap}
+ # (var_info, rcs_var_heap) = readPtr var_info_ptr rcs_var_heap
+ rs = { rs & rcs_var_heap = rcs_var_heap }
= case var_info of
VI_LetVar lvi
- # (is_new, lvi=:{lvi_expression}, rcs_free_vars) = weightedRefCountOfVariable rci_depth var_info_ptr lvi 1 rcs_free_vars
+ # (is_new, lvi=:{lvi_expression}, rcs_free_vars) = weightedRefCountOfVariable rci_depth var_info_ptr lvi 1 rs.rcs_free_vars
| is_new
# rs = weightedRefCount rci lvi_expression
{ rs & rcs_free_vars = rcs_free_vars,
@@ -234,7 +235,7 @@ where
= abort ("weightedRefCount [Expression] (convertcases, 864))" -*-> expr)
addPatternVariable depth {cv_variable = var_info_ptr, cv_count = ref_count} (free_vars, var_heap)
- #! var_info = sreadPtr var_info_ptr var_heap
+ # (var_info, var_heap) = readPtr var_info_ptr var_heap
= case var_info of
VI_LetVar lvi
# (_, lvi, free_vars) = weightedRefCountOfVariable depth var_info_ptr lvi ref_count free_vars
diff --git a/frontend/explicitimports.icl b/frontend/explicitimports.icl
index 99f5646..ae94b7e 100644
--- a/frontend/explicitimports.icl
+++ b/frontend/explicitimports.icl
@@ -790,7 +790,7 @@ instance check_completeness SymbIdent where
// otherwise the function was defined locally in a macro
// it is not a consequence, but it's type and body are consequences !
#! (already_visited, ccs) = ccs!box_ccs.ccs_set_of_visited_icl_funs.[glob_object]
- | already_visited
+ | /* ccs.box_ccs.ccs_set_of_visited_icl_funs.[glob_object] */ already_visited
= ccs
#! ccs = { ccs & box_ccs.ccs_set_of_visited_icl_funs.[glob_object] = True }
= check_completeness fun_def cci ccs
diff --git a/frontend/frontend.icl b/frontend/frontend.icl
index 24fd0a4..b76c653 100644
--- a/frontend/frontend.icl
+++ b/frontend/frontend.icl
@@ -87,7 +87,6 @@ frontEndInterface :: !FrontEndOptions !Ident !SearchPaths !{#DclModule} !{#FunDe
-> ( !Optional *FrontEndSyntaxTree,!*{# FunDef },!{#DclModule},!Int,!Int,!*PredefinedSymbols, !*HashTable, !*Files, !*File, !*File, !*File, !Optional !*File, !*Heaps)
frontEndInterface options mod_ident search_paths cached_dcl_modules functions_and_macros list_inferred_types predef_symbols hash_table modtimefunction files error io out tcl_file heaps
// # files = trace_n ("Compiling "+++mod_ident.id_name) files
-
# (ok, mod, hash_table, error, predef_symbols, files)
= wantModule cWantIclFile mod_ident NoPos options.feo_generics(hash_table /* ---> ("Parsing:", mod_ident)*/) error search_paths predef_symbols modtimefunction files
| not ok
diff --git a/frontend/general.dcl b/frontend/general.dcl
index ac5e052..6ee3b29 100644
--- a/frontend/general.dcl
+++ b/frontend/general.dcl
@@ -20,6 +20,8 @@ instance <<< [a] | <<< a
:: Optional x = Yes !x | No
+:: Choice a b = Either a | Or b
+
(--->) infix :: .a !b -> .a | <<< b
(-?->) infix :: .a !(!Bool, !b) -> .a | <<< b
diff --git a/frontend/general.icl b/frontend/general.icl
index 5b3bb1a..b542268 100644
--- a/frontend/general.icl
+++ b/frontend/general.icl
@@ -11,6 +11,8 @@ import StdEnv
:: Optional x = Yes !x | No
+:: Choice a b = Either a | Or b
+
cMAXINT :== 2147483647
:: BITVECT :== Int
diff --git a/frontend/generics.icl b/frontend/generics.icl
index ffbfe14..50b5670 100644
--- a/frontend/generics.icl
+++ b/frontend/generics.icl
@@ -1677,15 +1677,16 @@ where
gs_heaps=gs_heaps=:{hp_var_heap, hp_type_heaps},
gs_dcl_modules,
gs_main_dcl_module_n,
- gs_opt_dcl_icl_conversions}
+ gs_opt_dcl_icl_conversions,
+ gs_error}
#! (class_def, gs_modules) = getClassDef ins_class.glob_module ins_class.glob_object.ds_index gs_modules
#! (member_def, gs_modules) = getMemberDef ins_class.glob_module class_def.class_members.[0].ds_index gs_modules
#! {me_type, me_class_vars} = member_def
// determine type of the instance function
- #! (symbol_type, _, hp_type_heaps, _, _) =
- determineTypeOfMemberInstance me_type me_class_vars ins_type SP_None hp_type_heaps No No
+ #! (symbol_type, _, hp_type_heaps, _, gs_error) =
+ determineTypeOfMemberInstance me_type me_class_vars ins_type SP_None hp_type_heaps No gs_error
#! (st_context, hp_var_heap) = initializeContextVariables symbol_type.st_context hp_var_heap
#! symbol_type = {symbol_type & st_context = st_context}
@@ -1729,7 +1730,8 @@ where
, gs_fun_defs = gs_fun_defs
, gs_dcl_modules = gs_dcl_modules
, gs_opt_dcl_icl_conversions = gs_opt_dcl_icl_conversions
- , gs_heaps = {gs_heaps & hp_type_heaps = hp_type_heaps, hp_var_heap = hp_var_heap}
+ , gs_heaps = {gs_heaps & hp_type_heaps = hp_type_heaps, hp_var_heap = hp_var_heap}
+ , gs_error = gs_error
}
| otherwise // dcl module
@@ -1739,6 +1741,7 @@ where
& gs_modules = gs_modules
, gs_dcl_modules = gs_dcl_modules
, gs_heaps = {gs_heaps & hp_type_heaps = hp_type_heaps, hp_var_heap = hp_var_heap}
+ , gs_error = gs_error
}
update_dcl_fun_type module_index fun_index symbol_type dcl_modules
diff --git a/frontend/overloading.icl b/frontend/overloading.icl
index 3218836..e72560f 100644
--- a/frontend/overloading.icl
+++ b/frontend/overloading.icl
@@ -1684,7 +1684,7 @@ where
= equalTypes atype1.at_type atype2.at_type type_var_heap
equalTypeVars {tv_info_ptr} temp_var_id type_var_heap
- #! tv_info = sreadPtr tv_info_ptr type_var_heap
+ # (tv_info, type_var_heap) = readPtr tv_info_ptr type_var_heap
= case tv_info of
TVI_Forward forw_var_number
-> (forw_var_number == temp_var_id, type_var_heap)
diff --git a/frontend/refmark.icl b/frontend/refmark.icl
index f607bc1..b77ae39 100644
--- a/frontend/refmark.icl
+++ b/frontend/refmark.icl
@@ -6,8 +6,7 @@ import syntax, Heap, typesupport, check, overloading, unitype, utilities //, RWS
NotASelector :== -1
-class refMark expr :: ![[FreeVar]] !Int !(Optional [(FreeVar,ReferenceCount)]) !expr !*VarHeap -> *VarHeap
-
+class refMark expr :: ![[FreeVar]] !Int !(Optional [CountedFreeVar]) !expr !*VarHeap -> *VarHeap
instance refMark [a] | refMark a
where
@@ -27,13 +26,32 @@ addSelection var_expr_ptr sel sels=:[selection=:{ su_field,su_multiply,su_unique
| sel < su_field
= [ { su_field = sel, su_multiply = [], su_uniquely = [var_expr_ptr] } : sels ]
= [ selection : addSelection var_expr_ptr sel selections ]
+
+/*
+saveOccurrencesWhenNeeded pattern_nr free_vars var_heap
+ | pattern_nr == 0
+ = var_heap
+ = saveOccurrences free_vars var_heap
+*/
saveOccurrences free_vars var_heap
- = foldSt (foldSt save_occurrence) free_vars var_heap
+ = foldSt (foldSt save_occurrence) free_vars var_heap // (free_vars ---> ("saveOccurrences", free_vars)) var_heap
where
save_occurrence {fv_name,fv_info_ptr} var_heap
# (VI_Occurrence old_occ=:{occ_ref_count,occ_previous}, var_heap) = readPtr fv_info_ptr var_heap
= var_heap <:= (fv_info_ptr, VI_Occurrence {old_occ & occ_ref_count = RC_Unused, occ_previous = [occ_ref_count : occ_previous] } )
+// ---> ("save_occurrence", fv_name, occ_ref_count, length occ_previous)
+restoreOccurrences free_vars var_heap
+ = foldSt (foldSt restore_occurrence) (free_vars /* ---> ("restoreOccurrences", free_vars) */) ([], var_heap)
+where
+ restore_occurrence fv=:{fv_name,fv_info_ptr} (occurrences, var_heap)
+ # (VI_Occurrence old_occ=:{occ_ref_count,occ_previous = [prev_ref_count : occ_previous]}, var_heap) = readPtr fv_info_ptr var_heap
+ var_heap = var_heap <:= (fv_info_ptr, VI_Occurrence {old_occ & occ_ref_count = prev_ref_count, occ_previous = occ_previous })
+ = case occ_ref_count of // ---> ("restore_occurrence", fv_name, prev_ref_count, occ_previous) of
+ RC_Unused
+ -> (occurrences, var_heap)
+ _
+ -> ([{cfv_var = fv,cfv_count = occ_ref_count} : occurrences ], var_heap)
adjustRefCount sel RC_Unused var_expr_ptr
| sel == NotASelector
@@ -48,19 +66,22 @@ adjustRefCount sel (RC_Used {rcu_multiply,rcu_uniquely,rcu_selectively}) var_exp
rcu_multiply = rcu_uniquely ++ rcu_multiply
= RC_Used {rcu_multiply = rcu_multiply, rcu_uniquely = [], rcu_selectively = rcu_selectively }
-markPatternVariables sel used_pattern_vars var_heap
- | sel == NotASelector
- = foldSt mark_variable [ fv \\ (fv,_) <- used_pattern_vars ] var_heap
- = mark_pattern_variable sel used_pattern_vars var_heap
+markPatternVariables sel list_of_used_pattern_vars var_heap
+ = foldSt (mark_pattern_variables sel) list_of_used_pattern_vars var_heap
where
- mark_pattern_variable sel [] var_heap
+ mark_pattern_variables sel used_pattern_vars var_heap
+ | sel == NotASelector
+ = foldSt mark_variable used_pattern_vars var_heap
+ = mark_selected_variable sel used_pattern_vars var_heap
+
+ mark_selected_variable sel [] var_heap
= var_heap
- mark_pattern_variable sel [(fv, var_number) : used_pattern_vars ] var_heap
- | sel == var_number
- = mark_variable fv var_heap
- = mark_pattern_variable sel used_pattern_vars var_heap
+ mark_selected_variable sel [pv=:{pv_var, pv_arg_nr} : pvs ] var_heap
+ | sel == pv_arg_nr
+ = mark_variable pv var_heap
+ = mark_selected_variable sel pvs var_heap
- mark_variable {fv_info_ptr} var_heap
+ mark_variable {pv_var={fv_info_ptr}} var_heap
# (VI_Occurrence old_occ=:{occ_ref_count}, var_heap) = readPtr fv_info_ptr var_heap
= case occ_ref_count of
RC_Unused
@@ -71,17 +92,30 @@ where
rcu_selectively = [], rcu_uniquely = [] }
-> var_heap <:= (fv_info_ptr, VI_Occurrence {old_occ & occ_ref_count = occ_ref_count } )
+closeAndMarkBinding free_vars var_info_ptr occ_ref_count var_occ let_expr=:(Either expr) var_heap
+ # var_heap = var_heap <:= (var_info_ptr, VI_Occurrence { var_occ & occ_ref_count = occ_ref_count, occ_bind = OB_LockedLet let_expr })
+ = refMark free_vars NotASelector No expr var_heap
+closeAndMarkBinding free_vars var_info_ptr occ_ref_count var_occ let_expr=:(Or ref_counts) var_heap
+ # var_heap = var_heap <:= (var_info_ptr, VI_Occurrence { var_occ & occ_ref_count = occ_ref_count, occ_bind = OB_LockedLet let_expr })
+ = addRefCounts ref_counts var_heap
+
refMarkOfVariable free_vars sel (VI_Occurrence var_occ) var_name var_info_ptr var_expr_ptr var_heap
# occ_ref_count = adjustRefCount sel var_occ.occ_ref_count var_expr_ptr
- = case var_occ.occ_bind of // ---> ("refMarkOfVariable", var_name,occ_ref_count,var_occ.occ_ref_count) of
- OB_OpenLet let_expr
- # var_heap = var_heap <:= (var_info_ptr, VI_Occurrence { var_occ & occ_ref_count = occ_ref_count, occ_bind = OB_LockedLet let_expr })
- -> refMark free_vars sel No let_expr var_heap
- OB_Pattern used_pattern_vars occ_bind
- -> markPatternVariables sel used_pattern_vars (var_heap <:= (var_info_ptr, VI_Occurrence { var_occ & occ_ref_count = occ_ref_count }))
- _
- -> var_heap <:= (var_info_ptr, VI_Occurrence { var_occ & occ_ref_count = occ_ref_count })
-
+ var_heap = markPatternVariables sel var_occ.occ_pattern_vars var_heap
+ = ref_count_of_bindings free_vars var_info_ptr occ_ref_count var_occ var_heap
+where
+ ref_count_of_bindings free_vars var_info_ptr occ_ref_count var_occ=:{occ_bind = OB_OpenLet let_expr} var_heap
+ = closeAndMarkBinding free_vars var_info_ptr occ_ref_count var_occ let_expr var_heap
+ ref_count_of_bindings free_vars var_info_ptr occ_ref_count var_occ var_heap
+ = var_heap <:= (var_info_ptr, VI_Occurrence { var_occ & occ_ref_count = occ_ref_count })
+
+addRefCounts ref_counts var_heap
+ = foldSt set_occurrence ref_counts var_heap
+where
+ set_occurrence {cfv_var = {fv_name,fv_info_ptr}, cfv_count} var_heap
+ # (VI_Occurrence occ=:{occ_ref_count}, var_heap) = readPtr fv_info_ptr var_heap
+ comb_ref_count = parCombineRefCount occ_ref_count cfv_count
+ = var_heap <:= (fv_info_ptr, VI_Occurrence { occ & occ_ref_count = comb_ref_count})
instance refMark BoundVar
where
@@ -115,9 +149,13 @@ where
var_heap = refMark new_free_vars sel def let_expr var_heap
= let_combine free_vars var_heap
= refMark new_free_vars sel def let_expr (refMark new_free_vars NotASelector No let_strict_binds var_heap)
- # new_free_vars = [ [ lb_dst \\ {lb_dst} <- let_strict_binds ++ let_lazy_binds ] : free_vars]
- var_heap = foldSt bind_variable let_strict_binds var_heap
- var_heap = foldSt bind_variable let_lazy_binds var_heap
+ # all_binds = let_strict_binds ++ let_lazy_binds
+ local_let_vars = [ lb_dst \\ {lb_dst} <- all_binds ]
+ new_free_vars = [ local_let_vars : free_vars]
+// (global_let_vars, var_heap) = collectOpenLetVars free_vars var_heap
+ var_heap = init_let_binds all_binds var_heap
+// (let_occurrences, var_heap) = ref_mark_of_lets new_free_vars local_let_vars global_let_vars all_binds var_heap
+// var_heap = finish_let_binds let_occurrences var_heap
= refMark new_free_vars sel def let_expr var_heap
where
@@ -137,10 +175,44 @@ where
comb_ref_count = parCombineRefCount (seqCombineRefCount occ_ref_count prev_ref_count) pre_pref_recount
= var_heap <:= (fv_info_ptr, VI_Occurrence { old_occ & occ_ref_count = comb_ref_count, occ_previous = occ_previouses })
- bind_variable {lb_src,lb_dst={fv_info_ptr}} var_heap
- # (VI_Occurrence occ, var_heap) = readPtr fv_info_ptr var_heap
- = var_heap <:= (fv_info_ptr, VI_Occurrence { occ & occ_ref_count = RC_Unused, occ_bind = OB_OpenLet lb_src })
+ init_let_binds let_binds var_heap
+ = foldSt bind_variable let_binds var_heap
+ where
+ bind_variable {lb_src,lb_dst={fv_info_ptr}} var_heap
+ # (VI_Occurrence occ, var_heap) = readPtr fv_info_ptr var_heap
+ = var_heap <:= (fv_info_ptr, VI_Occurrence { occ & occ_ref_count = RC_Unused, occ_bind = OB_OpenLet (Either lb_src) })
+
+ finish_let_binds let_binds var_heap
+ = foldSt finish_let_bind let_binds var_heap
+ where
+ finish_let_bind (let_var_ptr, occurrences) var_heap
+ # (VI_Occurrence occ, var_heap) = readPtr let_var_ptr var_heap
+ = var_heap <:= (let_var_ptr, VI_Occurrence { occ & occ_bind = OB_OpenLet (Or occurrences) })
+ ref_mark_of_lets free_vars local_let_vars global_let_vars let_binds var_heap
+ = foldSt (ref_mark_of_let free_vars local_let_vars global_let_vars) let_binds ([], var_heap)
+
+ ref_mark_of_let free_vars local_let_vars global_let_vars {lb_src,lb_dst={fv_info_ptr}} (all_occurrences, var_heap)
+ # (VI_Occurrence occ, var_heap) = readPtr fv_info_ptr var_heap
+ var_heap = var_heap <:= (fv_info_ptr, VI_Occurrence { occ & occ_bind = OB_LockedLet (Either lb_src) })
+ var_heap = saveOccurrences free_vars var_heap
+ var_heap = refMark free_vars NotASelector No lb_src var_heap
+ var_heap = open_locked_lets local_let_vars var_heap
+ (_, var_heap) = collectUsedLetVars global_let_vars ([], var_heap)
+ (occurrences, var_heap) = restoreOccurrences free_vars var_heap
+ = ([(fv_info_ptr, occurrences) : all_occurrences], var_heap)
+ where
+ open_locked_lets let_vars var_heap
+ = foldSt open_locked_let let_vars var_heap
+ where
+ open_locked_let fv=:{fv_name,fv_info_ptr} var_heap
+ # (VI_Occurrence var_occ, var_heap) = readPtr fv_info_ptr var_heap
+ = case var_occ.occ_bind of
+ OB_LockedLet expr
+ -> var_heap <:= (fv_info_ptr, VI_Occurrence { var_occ & occ_bind = OB_OpenLet expr })
+ _
+ -> var_heap
+
refMark free_vars sel def (Case kees) var_heap
= refMarkOfCase free_vars sel def kees var_heap
refMark free_vars sel _ (Selection _ expr selectors) var_heap
@@ -219,15 +291,15 @@ collectPatternsVariables pattern_vars
where
collect_used_vars [ fv=:{fv_count} : pattern_vars ] arg_nr collected_vars
| fv_count > 0
- = collect_used_vars pattern_vars (inc arg_nr) [ (fv, arg_nr) : collected_vars ]
+ = collect_used_vars pattern_vars (inc arg_nr) [ {pv_var = fv, pv_arg_nr = arg_nr} : collected_vars ]
= collect_used_vars pattern_vars (inc arg_nr) collected_vars
collect_used_vars [] arg_nr collected_vars
= collected_vars
-collectLocalLetVars free_vars var_heap
- = foldSt (foldSt collect_local_let_var) free_vars ([], var_heap)
+collectOpenLetVars free_vars var_heap
+ = foldSt (foldSt collect_open_let_var) free_vars ([], var_heap)
where
- collect_local_let_var fv=:{fv_info_ptr} (collected_vars, var_heap)
+ collect_open_let_var fv=:{fv_info_ptr} (collected_vars, var_heap)
# (VI_Occurrence var_occ, var_heap) = readPtr fv_info_ptr var_heap
= case var_occ.occ_bind of
OB_OpenLet _
@@ -241,8 +313,8 @@ where
collect_local_let_var fv_info_ptr (used_vars, var_heap)
# (VI_Occurrence var_occ, var_heap) = readPtr fv_info_ptr var_heap
= case var_occ.occ_bind of
- OB_LockedLet let_expr
- -> ([ fv_info_ptr : used_vars], var_heap <:= (fv_info_ptr, VI_Occurrence { var_occ & occ_bind = OB_OpenLet let_expr }))
+ OB_LockedLet ref_counts
+ -> ([ fv_info_ptr : used_vars], var_heap <:= (fv_info_ptr, VI_Occurrence { var_occ & occ_bind = OB_OpenLet ref_counts }))
_
-> (used_vars, var_heap)
@@ -252,8 +324,8 @@ where
set_used_let_var fv_info_ptr var_heap
# (VI_Occurrence var_occ, var_heap) = readPtr fv_info_ptr var_heap
= case var_occ.occ_bind of
- OB_OpenLet let_expr
- -> var_heap <:= (fv_info_ptr, VI_Occurrence { var_occ & occ_bind = OB_LockedLet let_expr })
+ OB_OpenLet ref_counts
+ -> var_heap <:= (fv_info_ptr, VI_Occurrence { var_occ & occ_bind = OB_LockedLet ref_counts })
_
-> var_heap
@@ -261,113 +333,110 @@ refMarkOfCase free_vars sel def {case_expr, case_guards=AlgebraicPatterns type p
= refMarkOfAlgebraicOrOverloadedListCase free_vars sel def case_expr patterns case_explicit case_default var_heap
refMarkOfCase free_vars sel def {case_expr,case_guards=BasicPatterns type patterns,case_default,case_explicit} var_heap
- # var_heap = refMark free_vars NotASelector No case_expr var_heap
- (local_lets, var_heap) = collectLocalLetVars free_vars var_heap
+ # (local_lets, var_heap) = collectOpenLetVars free_vars var_heap
(def, used_lets, var_heap) = refMarkOfDefault case_explicit free_vars sel def case_default local_lets var_heap
(pattern_depth, used_lets, var_heap) = foldSt (ref_mark_of_basic_pattern free_vars sel local_lets def) patterns (0, used_lets, var_heap)
- = addRefMarkOfDefault False pattern_depth free_vars def used_lets var_heap
+ var_heap = addRefMarkOfDefault pattern_depth free_vars def used_lets var_heap
+ var_heap = saveOccurrences free_vars var_heap
+ var_heap = refMark free_vars NotASelector No case_expr var_heap
+ = caseCombine False free_vars var_heap
where
ref_mark_of_basic_pattern free_vars sel local_lets def {bp_expr} (pattern_depth, used_lets, var_heap)
- # pattern_depth = inc pattern_depth
- var_heap = saveOccurrences free_vars var_heap
+// # var_heap = saveOccurrencesWhenNeeded pattern_depth free_vars var_heap
+ # var_heap = saveOccurrences free_vars var_heap
var_heap = refMark free_vars sel def bp_expr var_heap
(used_lets, var_heap) = collectUsedLetVars local_lets (used_lets, var_heap)
- = (pattern_depth, used_lets, var_heap)
+ = (inc pattern_depth, used_lets, var_heap)
refMarkOfCase free_vars sel def {case_expr, case_guards=OverloadedListPatterns type _ patterns, case_explicit, case_default} var_heap
= refMarkOfAlgebraicOrOverloadedListCase free_vars sel def case_expr patterns case_explicit case_default var_heap
refMarkOfCase free_vars sel def {case_expr,case_guards=DynamicPatterns patterns,case_default,case_explicit} var_heap
- # var_heap = saveOccurrences free_vars var_heap
- var_heap = refMark free_vars NotASelector No case_expr var_heap
- (used_free_vars, var_heap) = collectUsedFreeVariables free_vars var_heap
+ # (used_free_vars, var_heap) = collectUsedFreeVariables free_vars var_heap
var_heap = parCombine free_vars var_heap
- (local_lets, var_heap) = collectLocalLetVars free_vars var_heap
+ (local_lets, var_heap) = collectOpenLetVars free_vars var_heap
(def, used_lets, var_heap) = refMarkOfDefault case_explicit free_vars sel def case_default local_lets var_heap
(pattern_depth, used_lets, var_heap) = foldSt (ref_mark_of_dynamic_pattern free_vars sel local_lets def) patterns (0, used_lets, var_heap)
- = addRefMarkOfDefault True pattern_depth free_vars def used_lets var_heap
+ var_heap = addRefMarkOfDefault pattern_depth free_vars def used_lets var_heap
+ var_heap = saveOccurrences free_vars var_heap
+ var_heap = refMark free_vars NotASelector No case_expr var_heap
+ = caseCombine True free_vars var_heap
where
ref_mark_of_dynamic_pattern free_vars sel local_lets def {dp_var, dp_rhs} (pattern_depth, used_lets, var_heap)
- # pattern_depth = inc pattern_depth
- var_heap = saveOccurrences free_vars var_heap
+// # var_heap = saveOccurrencesWhenNeeded pattern_depth free_vars var_heap
+ # var_heap = saveOccurrences free_vars var_heap
used_pattern_vars = collectPatternsVariables [dp_var]
- var_heap = refMark [ [ fv \\ (fv,_) <- used_pattern_vars ] : free_vars ] sel def dp_rhs var_heap
+ var_heap = refMark [ [ pv_var \\ {pv_var} <- used_pattern_vars ] : free_vars ] sel def dp_rhs var_heap
(used_lets, var_heap) = collectUsedLetVars local_lets (used_lets, var_heap)
- = (pattern_depth, used_lets, var_heap)
+ = (inc pattern_depth, used_lets, var_heap)
-refMarkOfAlgebraicOrOverloadedListCase free_vars sel def case_expr patterns case_explicit case_default var_heap
- = ref_mark_of_algebraic_case free_vars sel def case_expr patterns case_explicit case_default var_heap
+refMarkOfAlgebraicOrOverloadedListCase free_vars sel def case_expr alternatives case_explicit case_default var_heap
+ # (with_pattern_bindings, var_heap) = ref_mark_of_alternatives free_vars sel def (is_variable_pattern case_expr) alternatives case_explicit case_default var_heap
+ = ref_mark_of_pattern free_vars with_pattern_bindings case_expr var_heap
where
- ref_mark_of_algebraic_case free_vars sel def (Var {var_name,var_info_ptr,var_expr_ptr}) patterns explicit defaul var_heap
- # (VI_Occurrence var_occ=:{occ_bind,occ_ref_count}, var_heap) = readPtr var_info_ptr var_heap
- = case occ_bind of
- OB_Empty
- -> ref_mark_of_algebraic_case_with_variable_pattern False var_info_ptr var_expr_ptr var_occ free_vars sel def patterns explicit defaul var_heap
- OB_OpenLet let_expr
- # var_heap = var_heap <:= (var_info_ptr, VI_Occurrence { var_occ & occ_ref_count = occ_ref_count, occ_bind = OB_LockedLet let_expr })
- var_heap = refMark free_vars sel No let_expr var_heap
- -> ref_mark_of_algebraic_case_with_variable_pattern True var_info_ptr var_expr_ptr var_occ free_vars sel def patterns explicit defaul var_heap
- OB_LockedLet _
- -> ref_mark_of_algebraic_case_with_variable_pattern True var_info_ptr var_expr_ptr var_occ free_vars sel def patterns explicit defaul var_heap
- OB_Pattern vars ob
- -> ref_mark_of_algebraic_case_with_variable_pattern False var_info_ptr var_expr_ptr var_occ free_vars sel def patterns explicit defaul var_heap
- ref_mark_of_algebraic_case free_vars sel def expr patterns explicit defaul var_heap
- = ref_mark_of_algebraic_case_with_non_variable_pattern free_vars sel def expr patterns explicit defaul var_heap
-
- ref_mark_of_algebraic_case_with_variable_pattern with_composite_pattern var_info_ptr var_expr_ptr {occ_ref_count = RC_Unused}
- free_vars sel def patterns case_explicit case_default var_heap
- # var_heap = ref_mark_of_patterns with_composite_pattern free_vars sel def (Yes var_info_ptr) patterns case_explicit case_default var_heap
- (VI_Occurrence var_occ, var_heap) = readPtr var_info_ptr var_heap
- = case var_occ.occ_ref_count of
- RC_Unused
- -> var_heap <:= (var_info_ptr, VI_Occurrence { var_occ &
- occ_ref_count = RC_Used { rcu_multiply = [], rcu_uniquely = [var_expr_ptr], rcu_selectively = [] }})
- RC_Used rcu
- -> var_heap <:= (var_info_ptr, VI_Occurrence { var_occ &
- occ_ref_count = RC_Used { rcu & rcu_uniquely = [var_expr_ptr : rcu.rcu_uniquely] }})
- ref_mark_of_algebraic_case_with_variable_pattern with_composite_pattern var_info_ptr var_expr_ptr
- var_occ=:{occ_ref_count = RC_Used {rcu_multiply,rcu_uniquely,rcu_selectively}} free_vars sel def patterns case_explicit case_default var_heap
- # var_occ = { var_occ & occ_ref_count = RC_Used { rcu_multiply = collectAllSelections rcu_selectively (rcu_uniquely ++ [var_expr_ptr : rcu_multiply]),
- rcu_uniquely = [], rcu_selectively = [] }}
- var_heap = var_heap <:= (var_info_ptr, VI_Occurrence var_occ )
- = ref_mark_of_patterns with_composite_pattern free_vars sel def (Yes var_info_ptr) patterns case_explicit case_default var_heap
-
- ref_mark_of_algebraic_case_with_non_variable_pattern free_vars sel def expr patterns case_explicit case_default var_heap
- # var_heap = refMark free_vars NotASelector No expr var_heap
- = ref_mark_of_patterns True free_vars sel def No patterns case_explicit case_default var_heap
-
- ref_mark_of_patterns with_composite_pattern free_vars sel def opt_pattern_var patterns case_explicit case_default var_heap
- # (local_lets, var_heap) = collectLocalLetVars free_vars var_heap
+ is_variable_pattern (Var {var_info_ptr}) = Yes var_info_ptr
+ is_variable_pattern _ = No
+
+ ref_mark_of_pattern free_vars with_pattern_bindings (Var {var_name,var_info_ptr,var_expr_ptr}) var_heap
+ # (VI_Occurrence var_occ_in_alts, var_heap) = readPtr var_info_ptr var_heap
+ var_heap = adjust_ref_count_of_variable_pattern var_occ_in_alts var_info_ptr var_expr_ptr var_heap
+ var_heap = saveOccurrences free_vars var_heap
+ var_heap = ref_mark_of_variable_pattern free_vars var_info_ptr var_occ_in_alts var_heap
+// var_heap = markPatternVariables NotASelector var_occ_in_alts.occ_pattern_vars var_heap
+ var_heap = caseCombine with_pattern_bindings free_vars var_heap
+ = var_heap
+ where
+ adjust_ref_count_of_variable_pattern var_occ_in_alts=:{occ_ref_count = RC_Unused} var_info_ptr var_expr_ptr var_heap
+ = var_heap <:= (var_info_ptr, VI_Occurrence { var_occ_in_alts &
+ occ_ref_count = RC_Used { rcu_multiply = [], rcu_uniquely = [var_expr_ptr], rcu_selectively = [] }})
+ adjust_ref_count_of_variable_pattern var_occ_in_alts=:{occ_ref_count = RC_Used rcu} var_info_ptr var_expr_ptr var_heap
+ = var_heap <:= (var_info_ptr, VI_Occurrence { var_occ_in_alts &
+ occ_ref_count = RC_Used { rcu & rcu_uniquely = [var_expr_ptr : rcu.rcu_uniquely] }})
+
+ ref_mark_of_variable_pattern free_vars var_info_ptr var_occ=:{occ_bind = OB_OpenLet let_expr} var_heap
+ # (VI_Occurrence empty_var_occ, var_heap) = readPtr var_info_ptr var_heap
+ = closeAndMarkBinding free_vars var_info_ptr empty_var_occ.occ_ref_count empty_var_occ let_expr var_heap
+ ref_mark_of_variable_pattern _ _ _ var_heap
+ = var_heap
+
+ ref_mark_of_pattern free_vars with_pattern_bindings expr var_heap
+ # var_heap = saveOccurrences free_vars var_heap
+ var_heap = refMark free_vars NotASelector No expr var_heap
+ var_heap = caseCombine with_pattern_bindings free_vars var_heap
+ = var_heap
+
+ ref_mark_of_alternatives free_vars sel def opt_pattern_var patterns case_explicit case_default var_heap
+ # (local_lets, var_heap) = collectOpenLetVars free_vars var_heap
(def, used_lets, var_heap) = refMarkOfDefault case_explicit free_vars sel def case_default local_lets var_heap
(with_pattern_bindings, pattern_depth, used_lets, var_heap)
= foldSt (ref_mark_of_algebraic_pattern free_vars sel opt_pattern_var local_lets def) patterns (False, 0, used_lets, var_heap)
- = addRefMarkOfDefault (with_composite_pattern && with_pattern_bindings) pattern_depth free_vars def used_lets var_heap
-
+ var_heap = addRefMarkOfDefault pattern_depth free_vars def used_lets var_heap
+ = (with_pattern_bindings, var_heap)
+
ref_mark_of_algebraic_pattern free_vars sel opt_pattern_var local_lets def {ap_vars,ap_expr}
(with_pattern_bindings, pattern_depth, used_lets, var_heap)
- # pattern_depth = inc pattern_depth
- var_heap = saveOccurrences free_vars var_heap
+// # var_heap = saveOccurrencesWhenNeeded pattern_depth free_vars var_heap
+ # var_heap = saveOccurrences free_vars var_heap
used_pattern_vars = collectPatternsVariables ap_vars
var_heap = bind_optional_pattern_variable opt_pattern_var used_pattern_vars var_heap
- var_heap = refMark [ [ fv \\ (fv,_) <- used_pattern_vars ] : free_vars ] sel def ap_expr var_heap // (var_heap ---> ("ref_mark_of_algebraic_pattern", ap_expr))
+ var_heap = refMark [ [ pv_var \\ {pv_var} <- used_pattern_vars ] : free_vars ] sel def ap_expr var_heap
var_heap = restore_binding_of_pattern_variable opt_pattern_var used_pattern_vars var_heap
(used_lets, var_heap) = collectUsedLetVars local_lets (used_lets, var_heap)
- = (with_pattern_bindings || not (isEmpty used_pattern_vars), pattern_depth, used_lets, var_heap)
-
+ = (with_pattern_bindings || not (isEmpty used_pattern_vars), inc pattern_depth, used_lets, var_heap)
bind_optional_pattern_variable _ [] var_heap
= var_heap
bind_optional_pattern_variable (Yes var_info_ptr) used_pattern_vars var_heap
- # (VI_Occurrence var_occ=:{occ_bind}, var_heap) = readPtr var_info_ptr var_heap
- = var_heap <:= (var_info_ptr, VI_Occurrence { var_occ & occ_bind = OB_Pattern used_pattern_vars occ_bind })
+ # (VI_Occurrence var_occ, var_heap) = readPtr var_info_ptr var_heap
+ = var_heap <:= (var_info_ptr, VI_Occurrence { var_occ & occ_pattern_vars = [ used_pattern_vars : var_occ.occ_pattern_vars ] })
bind_optional_pattern_variable _ used_pattern_vars var_heap
= var_heap
restore_binding_of_pattern_variable _ [] var_heap
= var_heap
restore_binding_of_pattern_variable (Yes var_info_ptr) used_pattern_vars var_heap
- # (VI_Occurrence var_occ=:{occ_ref_count, occ_bind = OB_Pattern _ occ_bind}, var_heap) = readPtr var_info_ptr var_heap
- = var_heap <:= (var_info_ptr, VI_Occurrence { var_occ & occ_bind = occ_bind})
+ # (VI_Occurrence var_occ, var_heap) = readPtr var_info_ptr var_heap
+ = var_heap <:= (var_info_ptr, VI_Occurrence { var_occ & occ_pattern_vars = tl var_occ.occ_pattern_vars })
restore_binding_of_pattern_variable _ used_pattern_vars var_heap
= var_heap
@@ -375,50 +444,27 @@ refMarkOfDefault case_explicit free_vars sel def (Yes expr) local_lets var_heap
# var_heap = saveOccurrences free_vars var_heap
var_heap = refMark free_vars sel No expr var_heap
(used_lets, var_heap) = collectUsedLetVars local_lets ([], var_heap)
- (occurrences, var_heap) = restore_occurrences free_vars var_heap
+ (occurrences, var_heap) = restoreOccurrences free_vars var_heap
= (Yes occurrences, used_lets, var_heap)
-where
- restore_occurrences free_vars var_heap
- = foldSt (foldSt restore_occurrence) free_vars ([], var_heap)
- where
- restore_occurrence fv=:{fv_name,fv_info_ptr} (occurrences, var_heap)
- # (VI_Occurrence old_occ=:{occ_ref_count,occ_previous = [prev_ref_count : occ_previous]}, var_heap) = readPtr fv_info_ptr var_heap
- var_heap = var_heap <:= (fv_info_ptr, VI_Occurrence {old_occ & occ_ref_count = prev_ref_count, occ_previous = occ_previous })
- = case occ_ref_count of
- RC_Unused
- -> (occurrences, var_heap)
- _
- -> ([(fv,occ_ref_count) : occurrences ], var_heap)
refMarkOfDefault case_explicit free_vars sel def No local_lets var_heap
| case_explicit
= (No, [], var_heap)
= (def, [], var_heap)
-
-addRefMarkOfDefault do_par_combine pattern_depth free_vars (Yes occurrences) used_lets var_heap
- # var_heap = saveOccurrences free_vars var_heap
- var_heap = foldSt set_occurrence occurrences var_heap
+addRefMarkOfDefault pattern_depth free_vars (Yes occurrences) used_lets var_heap
+// # var_heap = saveOccurrencesWhenNeeded pattern_depth free_vars var_heap
+ # var_heap = saveOccurrences free_vars var_heap
+ var_heap = foldSt set_occurrence occurrences var_heap
var_heap = setUsedLetVars used_lets var_heap
- = caseCombine do_par_combine free_vars var_heap (inc pattern_depth)
+ = altCombine (inc pattern_depth) free_vars var_heap
where
- set_occurrence (fv=:{fv_name,fv_info_ptr}, ref_count) var_heap
- # (VI_Occurrence old_occ=:{occ_ref_count}, var_heap) = readPtr fv_info_ptr var_heap
- = var_heap <:= (fv_info_ptr, VI_Occurrence {old_occ & occ_ref_count = ref_count } )
-addRefMarkOfDefault do_par_combine pattern_depth free_vars No used_lets var_heap
+ set_occurrence {cfv_var={fv_name,fv_info_ptr}, cfv_count} var_heap
+ # (VI_Occurrence old_occ, var_heap) = readPtr fv_info_ptr var_heap
+ = var_heap <:= (fv_info_ptr, VI_Occurrence {old_occ & occ_ref_count = cfv_count } )
+addRefMarkOfDefault pattern_depth free_vars No used_lets var_heap
# var_heap = setUsedLetVars used_lets var_heap
- = caseCombine do_par_combine free_vars var_heap pattern_depth
+ = altCombine pattern_depth free_vars var_heap
-/*
-refMarkOfDefault do_par_combine pattern_depth free_vars sel (Yes expr) used_lets var_heap
- # pattern_depth = inc pattern_depth
- var_heap = saveOccurrences free_vars var_heap
- var_heap = refMark free_vars sel No (expr ---> ("refMarkOfDefault", (expr, free_vars))) var_heap
- var_heap = setUsedLetVars used_lets var_heap
- = caseCombine do_par_combine free_vars var_heap pattern_depth
-refMarkOfDefault do_par_combine pattern_depth free_vars sel No used_lets var_heap
- # var_heap = setUsedLetVars used_lets var_heap
- = caseCombine do_par_combine free_vars var_heap pattern_depth
-*/
parCombine free_vars var_heap
= foldSt (foldSt (par_combine)) free_vars var_heap
@@ -428,48 +474,58 @@ where
= var_heap <:= (fv_info_ptr, VI_Occurrence { old_occ &
occ_ref_count = parCombineRefCount occ_ref_count prev_ref_count , occ_previous = prev_counts })
+caseCombine do_par_combine free_vars var_heap
+ = foldSt (foldSt (case_combine do_par_combine)) free_vars var_heap // (var_heap ---> ("caseCombine", free_vars))
+where
+ case_combine do_par_combine {fv_name,fv_info_ptr} var_heap
+ # (VI_Occurrence old_occ, var_heap) = readPtr fv_info_ptr var_heap
+ = case old_occ.occ_previous of // ---> ("case_combine", fv_name, old_occ.occ_ref_count, length old_occ.occ_previous) of
+ [ref_count_in_alt , glob_ref_count : occ_previous]
+ # comb_ref_count = case_combine_ref_counts do_par_combine old_occ.occ_ref_count ref_count_in_alt
+ # comb_ref_count = parCombineRefCount comb_ref_count glob_ref_count
+ -> var_heap <:= (fv_info_ptr, VI_Occurrence { old_occ & occ_ref_count = comb_ref_count , occ_previous = occ_previous })
+ _
+ -> abort ("inconsistent reference count administration" ---> fv_name)
+
+ case_combine_ref_counts do_par_combine ref_count_in_pattern ref_count_in_alt
+ | do_par_combine
+ = parCombineRefCount ref_count_in_pattern ref_count_in_alt
+ = seqCombineRefCount ref_count_in_alt ref_count_in_pattern
-caseCombine do_par_combine free_vars var_heap depth
- = foldSt (foldSt (case_combine do_par_combine depth)) free_vars var_heap
+altCombine depth free_vars var_heap
+ = foldSt (foldSt (alt_combine depth)) free_vars var_heap // (var_heap ---> ("altCombine", free_vars))
where
- case_combine do_par_combine depth {fv_name,fv_info_ptr} var_heap
+ alt_combine depth {fv_name,fv_info_ptr} var_heap
# (VI_Occurrence old_occ=:{occ_ref_count,occ_previous}, var_heap) = readPtr fv_info_ptr var_heap
- (occ_ref_count, occ_previous) = case_combine_ref_counts do_par_combine occ_ref_count occ_previous (dec depth)
+ (occ_ref_count, occ_previous) = alt_combine_ref_counts occ_ref_count occ_previous ((dec depth)) // ---> ("alt_combine", fv_name, occ_ref_count, length occ_previous, depth))
= var_heap <:= (fv_info_ptr, VI_Occurrence { old_occ & occ_ref_count = occ_ref_count , occ_previous = occ_previous })
-// ---> ("case_combine", fv_name, occ_ref_count)
-
- case_combine_ref_counts do_par_combine comb_ref_count [occ_ref_count:occ_previous] 0
- | do_par_combine
- # new_comb_ref_count = parCombineRefCount comb_ref_count occ_ref_count
- = (new_comb_ref_count, occ_previous)
-// ---> ("parCombineRefCount", ("this:", comb_ref_count), ("prev:", occ_ref_count), ("new:", new_comb_ref_count))
- # new_comb_ref_count = seqCombineRefCount comb_ref_count occ_ref_count
- = (new_comb_ref_count, occ_previous)
-// ---> ("seqCombineRefCount", ("this:", comb_ref_count), ("prev:", occ_ref_count), ("new:", 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)
-// ---> ("case_combine_ref_count", comb_ref_count, occ_ref_count, new_comb_ref_count)
-
- case_combine_ref_count RC_Unused ref_count
+
+ alt_combine_ref_counts comb_ref_count ref_counts 0
+ = (comb_ref_count, ref_counts)
+ alt_combine_ref_counts comb_ref_count [occ_ref_count:occ_previous] depth
+ # new_comb_ref_count = alt_combine_ref_count comb_ref_count occ_ref_count
+ = alt_combine_ref_counts new_comb_ref_count occ_previous (dec depth)
+// ---> ("alt_combine_ref_count", comb_ref_count, occ_ref_count, new_comb_ref_count)
+
+ alt_combine_ref_count RC_Unused ref_count
= ref_count
- case_combine_ref_count ref_count RC_Unused
+ alt_combine_ref_count ref_count RC_Unused
= ref_count
- case_combine_ref_count (RC_Used {rcu_multiply,rcu_selectively,rcu_uniquely}) (RC_Used ref_count2)
+ alt_combine_ref_count (RC_Used {rcu_multiply,rcu_selectively,rcu_uniquely}) (RC_Used ref_count2)
= RC_Used { rcu_uniquely = rcu_uniquely ++ ref_count2.rcu_uniquely, rcu_multiply = rcu_multiply ++ ref_count2.rcu_multiply,
- rcu_selectively = case_combine_of_selections rcu_selectively ref_count2.rcu_selectively }
+ rcu_selectively = alt_combine_of_selections rcu_selectively ref_count2.rcu_selectively }
where
- case_combine_of_selections [] sels
+ alt_combine_of_selections [] sels
= sels
- case_combine_of_selections sels []
+ alt_combine_of_selections sels []
= sels
- case_combine_of_selections sl1=:[sel1=:{ su_field, su_multiply, su_uniquely } : sels1] sl2=:[sel2 : sels2]
+ alt_combine_of_selections sl1=:[sel1=:{ su_field, su_multiply, su_uniquely } : sels1] sl2=:[sel2 : sels2]
| su_field == sel2.su_field
# sel1 = { sel1 & su_multiply = sel2.su_multiply ++ su_multiply, su_uniquely = sel2.su_uniquely ++ su_uniquely }
- = [ sel1 : case_combine_of_selections sels1 sels2 ]
+ = [ sel1 : alt_combine_of_selections sels1 sels2 ]
| su_field < sel2.su_field
- = [sel1 : case_combine_of_selections sels1 sl2 ]
- = [sel2 : case_combine_of_selections sl1 sels2 ]
+ = [sel1 : alt_combine_of_selections sels1 sl2 ]
+ = [sel2 : alt_combine_of_selections sl1 sels2 ]
parCombineRefCount RC_Unused ref_count
= ref_count
@@ -525,10 +581,18 @@ seqCombineRefCount (RC_Used sec_ref) (RC_Used prim_ref)
= [ { sel & su_multiply = su_uniquely ++ su_multiply, su_uniquely = [] } : make_primary_selections_on_unique sels ]
make_primary_selections_on_unique []
= []
-/*
-makeSharedReferencesNonUnique :: ![Int] !u:{# FunDef} !*Coercions !w:{! Type} v:{# v:{# TypeDefInfo}} !*VarHeap !*ExpressionHeap !*ErrorAdmin
- -> (!u:{# FunDef}, !*Coercions, !w:{! Type}, !v:{# v:{# TypeDefInfo}}, !*VarHeap, !*ExpressionHeap, !*ErrorAdmin)
-*/
+
+emptyOccurrence observing =
+ { occ_ref_count = RC_Unused
+ , occ_previous = []
+ , occ_observing = observing
+ , occ_bind = OB_Empty
+ , occ_pattern_vars = []
+ }
+
+emptyObservingOccurrence =: VI_Occurrence (emptyOccurrence True)
+emptyNonObservingOccurrence =: VI_Occurrence (emptyOccurrence False)
+
makeSharedReferencesNonUnique :: ![Int] !u:{# FunDef} !*Coercions !w:{! Type} !v:TypeDefInfos !*VarHeap !*ExpressionHeap !*ErrorAdmin
-> (!u:{# FunDef}, !*Coercions, !w:{! Type}, !v:TypeDefInfos, !*VarHeap, !*ExpressionHeap, !*ErrorAdmin)
makeSharedReferencesNonUnique [] fun_defs coercion_env subst type_def_infos var_heap expr_heap error
@@ -543,7 +607,7 @@ where
coercion_env subst type_def_infos var_heap expr_heap error
# variables = tb_args ++ fi_local_vars
(subst, type_def_infos, var_heap, expr_heap) = clear_occurrences variables subst type_def_infos var_heap expr_heap
- var_heap = refMark [tb_args] NotASelector No tb_rhs var_heap // (tb_rhs ---> ("makeSharedReferencesNonUnique", fun_symb)) var_heap
+ var_heap = refMark [tb_args] NotASelector No tb_rhs var_heap // (tb_rhs ---> ("makeSharedReferencesNonUnique", fun_symb, tb_rhs)) var_heap
position = newPosition fun_symb fun_pos
(coercion_env, var_heap, expr_heap, error) = make_shared_vars_non_unique variables coercion_env var_heap expr_heap
(setErrorAdmin position error)
@@ -555,10 +619,9 @@ where
where
initial_occurrence {fv_name,fv_info_ptr} (subst, type_def_infos, var_heap, expr_heap)
# (var_info, var_heap) = readPtr fv_info_ptr var_heap
- #! occ_observing = has_observing_base_type var_info type_def_infos subst
- = (subst, type_def_infos,
- var_heap <:= (fv_info_ptr, VI_Occurrence { occ_ref_count = RC_Unused, occ_previous = [],
- occ_observing = occ_observing, occ_bind = OB_Empty }), expr_heap)
+ | has_observing_base_type var_info type_def_infos subst
+ = (subst, type_def_infos, var_heap <:= (fv_info_ptr, emptyObservingOccurrence), expr_heap)
+ = (subst, type_def_infos, var_heap <:= (fv_info_ptr, emptyNonObservingOccurrence), expr_heap)
has_observing_base_type (VI_Type {at_type} _) type_def_infos subst
= has_observing_type at_type type_def_infos subst
diff --git a/frontend/syntax.dcl b/frontend/syntax.dcl
index f85a457..5437bfb 100644
--- a/frontend/syntax.dcl
+++ b/frontend/syntax.dcl
@@ -949,32 +949,42 @@ instance toString KindInfo
/* A few obscure type definitions */
+:: PatternVar =
+ { pv_var :: !FreeVar
+ , pv_arg_nr :: !Int
+ }
+
:: Occurrence =
- { occ_ref_count :: !ReferenceCount
-// , occ_aliases :: ![[(FreeVar,Int)]]
-// , occ_expression :: !Expression
- , occ_bind :: !OccurrenceBinding
- , occ_observing :: !Bool
-// , occ_attribute :: !ExprInfoPtr
- , occ_previous :: ![ReferenceCount]
+ { occ_ref_count :: !ReferenceCount
+ , occ_bind :: !OccurrenceBinding
+ , occ_pattern_vars :: ![[PatternVar]]
+ , occ_observing :: !Bool
+ , occ_previous :: ![ReferenceCount]
}
:: ReferenceCount = RC_Used !RC_Used | RC_Unused
-:: SelectiveUse = { su_field :: !Int, su_multiply :: ![ExprInfoPtr], su_uniquely :: ![ExprInfoPtr] }
-
-:: RC_Used = { rcu_multiply :: ![ExprInfoPtr], rcu_selectively :: ![SelectiveUse], rcu_uniquely :: ![ExprInfoPtr] }
+:: SelectiveUse =
+ { su_field :: !Int
+ , su_multiply :: ![ExprInfoPtr]
+ , su_uniquely :: ![ExprInfoPtr]
+ }
-:: OccurrenceBinding = OB_Empty | OB_OpenLet !Expression | OB_LockedLet !Expression
- | OB_Pattern ![(FreeVar, Int)] !OccurrenceBinding
-// | OB_Closed !LetOccurrences | OB_Marked !LetOccurrences
+:: RC_Used =
+ { rcu_multiply :: ![ExprInfoPtr]
+ , rcu_selectively :: ![SelectiveUse]
+ , rcu_uniquely :: ![ExprInfoPtr]
+ }
-/*
-:: LetOccurrences =
- { lo_used_lets :: ![FreeVar]
- , lo_free_variables :: ![(FreeVar, ReferenceCount)]
+:: CountedFreeVar =
+ { cfv_var :: !FreeVar
+ , cfv_count :: !ReferenceCount
}
-*/
+
+:: OccurrenceBinding = OB_Empty
+ | OB_OpenLet (Choice Expression [CountedFreeVar])
+ | OB_LockedLet (Choice Expression [CountedFreeVar])
+
:: OptGuardedAlts = GuardedAlts ![GuardedExpr] !(Optional ExprWithLocalDefs)
| UnGuardedExpr !ExprWithLocalDefs
diff --git a/frontend/syntax.icl b/frontend/syntax.icl
index ec1de27..63d0a91 100644
--- a/frontend/syntax.icl
+++ b/frontend/syntax.icl
@@ -927,21 +927,44 @@ cNotVarNumber :== -1
:: TypeKind = KindVar !KindInfoPtr | KindConst | KindArrow ![TypeKind] | KindCycle
+:: PatternVar =
+ { pv_var :: !FreeVar
+ , pv_arg_nr :: !Int
+ }
+
:: Occurrence =
- { occ_ref_count :: !ReferenceCount
- , occ_bind :: !OccurrenceBinding
- , occ_observing :: !Bool
- , occ_previous :: ![ReferenceCount]
+ { occ_ref_count :: !ReferenceCount
+ , occ_bind :: !OccurrenceBinding
+ , occ_pattern_vars :: ![[PatternVar]]
+ , occ_observing :: !Bool
+ , occ_previous :: ![ReferenceCount]
}
:: ReferenceCount = RC_Used !RC_Used | RC_Unused
-:: SelectiveUse = { su_field :: !Int, su_multiply :: ![ExprInfoPtr], su_uniquely :: ![ExprInfoPtr] }
+:: SelectiveUse =
+ { su_field :: !Int
+ , su_multiply :: ![ExprInfoPtr]
+ , su_uniquely :: ![ExprInfoPtr]
+ }
+
+:: RC_Used =
+ { rcu_multiply :: ![ExprInfoPtr]
+ , rcu_selectively :: ![SelectiveUse]
+ , rcu_uniquely :: ![ExprInfoPtr]
+ }
-:: RC_Used = { rcu_multiply :: ![ExprInfoPtr], rcu_selectively :: ![SelectiveUse], rcu_uniquely :: ![ExprInfoPtr] }
+:: CountedFreeVar =
+ { cfv_var :: !FreeVar
+ , cfv_count :: !ReferenceCount
+ }
-:: OccurrenceBinding = OB_Empty | OB_OpenLet !Expression | OB_LockedLet !Expression
- | OB_Pattern ![(FreeVar, Int)] !OccurrenceBinding
+:: OccurrenceBinding = OB_Empty
+ | OB_OpenLet (Choice Expression [CountedFreeVar])
+ | OB_LockedLet (Choice Expression [CountedFreeVar])
+// | OB_OpenLet !Expression | OB_LockedLet !Expression
+// | OB_Pattern ![PatternVar] !OccurrenceBinding
+// | OB_Closed !LetOccurrences | OB_Marked !LetOccurrences
:: TypeDefInfo =
{ tdi_kinds :: ![TypeKind]
diff --git a/frontend/trans.icl b/frontend/trans.icl
index 599424b..2412c7b 100644
--- a/frontend/trans.icl
+++ b/frontend/trans.icl
@@ -86,7 +86,7 @@ where
close_group :: !Int ![Int] !*{# Int} ![Int] !Int !Int !*{# FunDef} -> (![Int], !*{# Int}, ![Int], !*{# FunDef})
close_group fun_index [d:ds] marks group max_fun_nr group_number fun_defs
# marks = { marks & [d] = max_fun_nr }
- #! fd = fun_defs.[d]
+ # (fd,fun_defs) = fun_defs![d]
# fun_defs = { fun_defs & [d] = { fd & fun_info.fi_group_index = group_number }}
| d == fun_index
= (ds, marks, [d : group], fun_defs)
diff --git a/frontend/type.icl b/frontend/type.icl
index 6160182..ff279bd 100644
--- a/frontend/type.icl
+++ b/frontend/type.icl
@@ -1940,8 +1940,8 @@ typeProgram comps main_dcl_module_n fun_defs specials list_inferred_types icl_de
(type_error, fun_defs, predef_symbols, special_instances, {ts_td_infos,ts_fun_env,ts_error,ts_var_heap, ts_expr_heap, ts_type_heaps, ts_out})
= type_instances list_inferred_types specials.ir_from specials.ir_to class_instances ti (type_error, fun_defs, predef_symbols, special_instances,
{ ts & ts_fun_env = ts_fun_env })
- (array_first_instance_indices,list_first_instance_indices,tail_strict_list_first_instance_indices,fun_defs,type_code_instances,predef_symbols,ts_type_heaps)
- = create_special_instances special_instances fun_env_size ti_common_defs fun_defs predef_symbols ts_type_heaps
+ (array_first_instance_indices,list_first_instance_indices,tail_strict_list_first_instance_indices,fun_defs,type_code_instances,predef_symbols,ts_type_heaps,ts_error)
+ = create_special_instances special_instances fun_env_size ti_common_defs fun_defs predef_symbols ts_type_heaps ts_error
array_and_list_instances = {
ali_array_first_instance_indices=array_first_instance_indices,
ali_list_first_instance_indices=list_first_instance_indices,
@@ -2360,7 +2360,7 @@ where
type_of (UncheckedType tst) = tst
type_of (SpecifiedType _ _ tst) = tst
- create_special_instances {si_array_instances,si_list_instances,si_tail_strict_list_instances,si_next_array_member_index,si_next_TC_member_index,si_TC_instances} fun_env_size common_defs fun_defs predef_symbols type_heaps
+ create_special_instances {si_array_instances,si_list_instances,si_tail_strict_list_instances,si_next_array_member_index,si_next_TC_member_index,si_TC_instances} fun_env_size common_defs fun_defs predef_symbols type_heaps error
# fun_defs = add_extra_elements_to_fun_def_array (si_next_array_member_index-fun_env_size) fun_defs
with
add_extra_elements_to_fun_def_array n_new_elements fun_defs
@@ -2369,43 +2369,47 @@ where
# dummy_fun_def = { fun_symb = {id_name="",id_info=nilPtr},fun_arity=0,fun_priority=NoPrio,fun_body=NoBody,fun_type=No,fun_pos=NoPos,
fun_kind=FK_DefOrImpUnknown,fun_lifted=0,fun_info = {fi_calls=[],fi_group_index=0,fi_def_level=NotALevel,fi_free_vars=[],fi_local_vars=[],fi_dynamics=[],fi_properties=0}}
= {createArray (size fun_defs+n_new_elements) dummy_fun_def & [i]=fun_defs.[i] \\ i<-[0..size fun_defs-1]}
- (array_first_instance_indices,fun_defs, predef_symbols, type_heaps) = convert_array_instances si_array_instances common_defs fun_defs predef_symbols type_heaps
- (list_first_instance_indices,fun_defs, predef_symbols, type_heaps) = convert_list_instances si_list_instances PD_UListClass common_defs fun_defs predef_symbols type_heaps
- (tail_strict_list_first_instance_indices,fun_defs, predef_symbols, type_heaps) = convert_list_instances si_tail_strict_list_instances PD_UTSListClass common_defs fun_defs predef_symbols type_heaps
+ (array_first_instance_indices,fun_defs, predef_symbols, type_heaps, error)
+ = convert_array_instances si_array_instances common_defs fun_defs predef_symbols type_heaps error
+ (list_first_instance_indices,fun_defs, predef_symbols, type_heaps, error)
+ = convert_list_instances si_list_instances PD_UListClass common_defs fun_defs predef_symbols type_heaps error
+ (tail_strict_list_first_instance_indices,fun_defs, predef_symbols, type_heaps, error)
+ = convert_list_instances si_tail_strict_list_instances PD_UTSListClass common_defs fun_defs predef_symbols type_heaps error
type_code_instances = {createArray si_next_TC_member_index GTT_Function & [gtci_index] = gtci_type \\ {gtci_index, gtci_type} <- si_TC_instances}
array_first_instance_indices = first_instance_indices si_array_instances
- = (array_first_instance_indices,list_first_instance_indices,tail_strict_list_first_instance_indices,fun_defs,type_code_instances,predef_symbols,type_heaps)
+ = (array_first_instance_indices,list_first_instance_indices,tail_strict_list_first_instance_indices,fun_defs,type_code_instances,predef_symbols,type_heaps,error)
where
- convert_array_instances array_instances common_defs fun_defs predef_symbols type_heaps
+ convert_array_instances array_instances common_defs fun_defs predef_symbols type_heaps error
| isEmpty array_instances
- = ([],fun_defs, predef_symbols, type_heaps)
+ = ([],fun_defs, predef_symbols, type_heaps, error)
# ({pds_ident,pds_module,pds_def},predef_symbols) = predef_symbols![PD_UnboxedArrayType]
unboxed_array_type = TA (MakeTypeSymbIdent { glob_object = pds_def, glob_module = pds_module } pds_ident 0) []
({pds_module,pds_def},predef_symbols) = predef_symbols![PD_ArrayClass]
{class_members} = common_defs.[pds_module].com_class_defs.[pds_def]
array_members = common_defs.[pds_module].com_member_defs
(offset_table, _, predef_symbols) = arrayFunOffsetToPD_IndexTable array_members predef_symbols
- (fun_defs, type_heaps) = foldSt (convert_array_instance class_members array_members unboxed_array_type offset_table) array_instances (fun_defs, type_heaps)
+ (fun_defs, type_heaps, error) = foldSt (convert_array_instance class_members array_members unboxed_array_type offset_table) array_instances (fun_defs, type_heaps, error)
array_first_instance_indices = first_instance_indices array_instances
- = (array_first_instance_indices,fun_defs, predef_symbols, type_heaps)
+ = (array_first_instance_indices,fun_defs, predef_symbols, type_heaps, error)
where
- convert_array_instance class_members array_members unboxed_array_type offset_table {ai_record,ai_members} funs_and_heaps
- = create_instance_types class_members array_members unboxed_array_type offset_table (TA ai_record []) (size class_members) funs_and_heaps
+ convert_array_instance class_members array_members unboxed_array_type offset_table {ai_record,ai_members} funs_heaps_and_error
+ = create_instance_types class_members array_members unboxed_array_type offset_table (TA ai_record []) (size class_members) funs_heaps_and_error
where
first_instance_index=ai_members.[0].ds_index
- create_instance_types :: {#DefinedSymbol} {#MemberDef} Type {#Int} Type !Int !*(*{#FunDef},*TypeHeaps) -> (!*{#FunDef},!*TypeHeaps);
- create_instance_types members array_members unboxed_array_type offset_table record_type member_index funs_and_heaps
+ create_instance_types :: {#DefinedSymbol} {#MemberDef} Type {#Int} Type !Int !(!*{#FunDef}, !*TypeHeaps, !*ErrorAdmin)
+ -> (!*{#FunDef}, !*TypeHeaps, !*ErrorAdmin);
+ create_instance_types members array_members unboxed_array_type offset_table record_type member_index funs_heaps_and_error
| member_index == 0
- = funs_and_heaps
+ = funs_heaps_and_error
# member_index = dec member_index
- funs_and_heaps = create_instance_type members array_members unboxed_array_type offset_table record_type member_index funs_and_heaps
- = create_instance_types members array_members unboxed_array_type offset_table record_type member_index funs_and_heaps
+ funs_heaps_and_error = create_instance_type members array_members unboxed_array_type offset_table record_type member_index funs_heaps_and_error
+ = create_instance_types members array_members unboxed_array_type offset_table record_type member_index funs_heaps_and_error
- create_instance_type members array_members unboxed_array_type offset_table record_type member_index (fun_defs, type_heaps)
+ create_instance_type members array_members unboxed_array_type offset_table record_type member_index (fun_defs, type_heaps, error)
# {me_type,me_symb,me_class_vars,me_pos} = array_members.[members.[member_index].ds_index]
- (instance_type, _, type_heaps, _, _) = determineTypeOfMemberInstance me_type me_class_vars {it_vars = [], it_attr_vars = [], it_context = [],
- it_types = [unboxed_array_type, record_type]} SP_None type_heaps No No
+ (instance_type, _, type_heaps, _, error) = determineTypeOfMemberInstance me_type me_class_vars {it_vars = [], it_attr_vars = [], it_context = [],
+ it_types = [unboxed_array_type, record_type]} SP_None type_heaps No error
instance_type = makeElemTypeOfArrayFunctionStrict instance_type member_index offset_table
fun_index = first_instance_index+member_index
fun =
@@ -2419,35 +2423,36 @@ where
, fun_lifted = 0
, fun_info = EmptyFunInfo
}
- = ({fun_defs & [fun_index]=fun},type_heaps)
+ = ({fun_defs & [fun_index]=fun}, type_heaps, error)
- convert_list_instances list_instances predef_list_class_index common_defs fun_defs predef_symbols type_heaps
+ convert_list_instances list_instances predef_list_class_index common_defs fun_defs predef_symbols type_heaps error
| isEmpty list_instances
- = ([],fun_defs, predef_symbols, type_heaps)
+ = ([],fun_defs, predef_symbols, type_heaps, error)
# ({pds_module,pds_def},predef_symbols) = predef_symbols![predef_list_class_index]
{class_members} = common_defs.[pds_module].com_class_defs.[pds_def]
list_members = common_defs.[pds_module].com_member_defs
- (fun_defs, type_heaps) = foldSt (convert_list_instance class_members list_members) list_instances (fun_defs, type_heaps)
+ (fun_defs, type_heaps, error) = foldSt (convert_list_instance class_members list_members) list_instances (fun_defs, type_heaps, error)
list_first_instance_indices = first_instance_indices list_instances
- = (list_first_instance_indices,fun_defs, predef_symbols, type_heaps)
+ = (list_first_instance_indices,fun_defs, predef_symbols, type_heaps, error)
where
- convert_list_instance class_members list_members {ai_record,ai_members} funs_and_heaps
- = create_instance_types class_members list_members (TA ai_record []) (size class_members) funs_and_heaps
+ convert_list_instance class_members list_members {ai_record,ai_members} funs_heaps_and_error
+ = create_instance_types class_members list_members (TA ai_record []) (size class_members) funs_heaps_and_error
where
first_instance_index=ai_members.[0].ds_index
- create_instance_types :: {#DefinedSymbol} {#MemberDef} Type !Int !*(*{#FunDef},*TypeHeaps) -> (!*{#FunDef},!*TypeHeaps);
- create_instance_types members list_members record_type member_index funs_and_heaps
+ create_instance_types :: {#DefinedSymbol} {#MemberDef} Type !Int !(!*{#FunDef}, !*TypeHeaps, !*ErrorAdmin)
+ -> (!*{#FunDef}, !*TypeHeaps, !*ErrorAdmin)
+ create_instance_types members list_members record_type member_index funs_heaps_and_error
| member_index == 0
- = funs_and_heaps
+ = funs_heaps_and_error
# member_index = dec member_index
- funs_and_heaps = create_instance_type members list_members record_type member_index funs_and_heaps
- = create_instance_types members list_members record_type member_index funs_and_heaps
+ funs_heaps_and_error = create_instance_type members list_members record_type member_index funs_heaps_and_error
+ = create_instance_types members list_members record_type member_index funs_heaps_and_error
- create_instance_type members list_members record_type member_index (fun_defs, type_heaps)
+ create_instance_type members list_members record_type member_index (fun_defs, type_heaps, error)
# {me_type,me_symb,me_class_vars,me_pos} = list_members.[members.[member_index].ds_index]
- (instance_type, _, type_heaps, _, _) = determineTypeOfMemberInstance me_type me_class_vars {it_vars = [], it_attr_vars = [], it_context = [],
- it_types = [record_type]} SP_None type_heaps No No
+ (instance_type, _, type_heaps, _, error) = determineTypeOfMemberInstance me_type me_class_vars {it_vars = [], it_attr_vars = [], it_context = [],
+ it_types = [record_type]} SP_None type_heaps No error
fun_index = first_instance_index+member_index
fun =
{ fun_symb = me_symb
@@ -2460,7 +2465,7 @@ where
, fun_lifted = 0
, fun_info = EmptyFunInfo
}
- = ({fun_defs & [fun_index]=fun},type_heaps)
+ = ({fun_defs & [fun_index]=fun}, type_heaps, error)
first_instance_indices instances
= [ai_members.[0].ds_index \\ {ai_members}<-instances]
diff --git a/frontend/typesupport.icl b/frontend/typesupport.icl
index f458dc5..d7aa529 100644
--- a/frontend/typesupport.icl
+++ b/frontend/typesupport.icl
@@ -391,7 +391,7 @@ where
= iFoldSt determine_type_var 0 to_index (all_vars, var_env)
where
determine_type_var var_index (all_vars, var_env)
- #! type = var_env.[var_index]
+ # (type, var_env) = var_env![var_index]
= case type of
TV var
-> ([var : all_vars], { var_env & [var_index] = TLifted var})
@@ -471,7 +471,7 @@ where
build_attribute_environment appears_in_lifted_part attr_group_index max_attr_nr coercions attr_env attr_vars inequalities error
| attr_group_index == max_attr_nr
= (attr_env, attr_vars, inequalities, error)
- #! attr = attr_env.[attr_group_index]
+ # (attr, attr_env) = attr_env![attr_group_index]
= case attr of
TA_Var attr_var
# (ok, attr_env, inequalities)
@@ -494,7 +494,7 @@ where
= build_inequalities appears_in_lifted_part off_appears_in_lifted_part off_var left coercions attr_env inequalities
(ok2, attr_env, inequalities)
= build_inequalities appears_in_lifted_part off_appears_in_lifted_part off_var right coercions attr_env inequalities
- #! attr = attr_env.[dem_attr]
+ # (attr, attr_env) = attr_env![dem_attr]
= case attr of
TA_Var attr_var
| is_new_inequality attr_var off_var inequalities
@@ -889,7 +889,7 @@ where
where
equi_attrs attr=:(TA_Var {av_info_ptr}) (TA_TempVar av_number) attr_var_heap
- #! av_info = sreadPtr av_info_ptr attr_var_heap
+ # (av_info, attr_var_heap) = readPtr av_info_ptr attr_var_heap
= case av_info of
AVI_Forward forw_var_number
-> (forw_var_number == av_number, attr_var_heap)
diff --git a/frontend/unitype.icl b/frontend/unitype.icl
index 3850467..4db67cd 100644
--- a/frontend/unitype.icl
+++ b/frontend/unitype.icl
@@ -232,7 +232,7 @@ adjustPropClass prop_class arity :== prop_class >> arity
liftTempTypeVariable :: !{# CommonDefs } !{# BOOLVECT } !TempVarId !*{! Type} !*LiftState
-> (!Bool, !Type, !*{! Type}, !*LiftState)
liftTempTypeVariable modules cons_vars tv_number subst ls
- #! type = subst.[tv_number]
+ # (type, subst) = subst![tv_number]
= case type of
TE
-> (False, TempV tv_number, subst, ls)
@@ -419,7 +419,7 @@ where
expandTempTypeVariable :: !TempVarId !*(!u:{! Type}, !*ExpansionState) -> (!Bool, !Type, !*(!u:{! Type}, !*ExpansionState))
expandTempTypeVariable tv_number (subst, es)
- #! type = subst.[tv_number]
+ # (type, subst) = subst![tv_number]
= case type of
TE
-> (False, TempV tv_number, (subst, es))