aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjohnvg2012-05-25 09:26:30 +0000
committerjohnvg2012-05-25 09:26:30 +0000
commit8b357d4c5cd75f09f32c48706f0e314b50beda6a (patch)
tree945e3fca3c9d740d2fad51d349c5c3551d2429ae
parentuse record DefCounts with cons_count, sel_count, mem_count and type_count, in... (diff)
fix bug in var_info_ptr's of new variables added for cases used as arguments in sc_call
git-svn-id: https://svn.cs.ru.nl/repos/clean-compiler/trunk@2077 1f8540f1-abd5-4d5b-9d24-4c5ce8603e2d
-rw-r--r--frontend/convertcases.icl249
1 files changed, 75 insertions, 174 deletions
diff --git a/frontend/convertcases.icl b/frontend/convertcases.icl
index ab38c6d..610407a 100644
--- a/frontend/convertcases.icl
+++ b/frontend/convertcases.icl
@@ -80,71 +80,6 @@ where
split (SK_Constructor cons_ident) (collected_functions, collected_conses)
= (collected_functions, [ cons_ident : collected_conses])
-// sanity check ...
-class checkCaseTypes a :: !a !*ExpressionHeap -> (!Bool, !*ExpressionHeap)
-
-instance checkCaseTypes Expression where
- checkCaseTypes (Let {let_expr}) expr_heap
- = checkCaseTypes let_expr expr_heap
- checkCaseTypes (Case kees) expr_heap
- = checkCaseTypes kees expr_heap
- checkCaseTypes _ expr_heap
- = (True, expr_heap)
-
-instance checkCaseTypes Case where
- checkCaseTypes kees=:{case_expr, case_guards, case_default, case_explicit, case_info_ptr} expr_heap
- # (info, expr_heap) = readPtr case_info_ptr expr_heap
- # {ct_cons_types} = case_type info
- # (guards_ok, expr_heap) = checkCaseTypesCasePatterns case_guards ct_cons_types expr_heap
- # (default_ok, expr_heap)= checkCaseTypes case_default expr_heap
- = (guards_ok && default_ok, expr_heap)
- where
- case_type (EI_CaseTypeAndSplits type _)
- = type
- case_type (EI_CaseType type)
- = type
-
-checkCaseTypesCasePatterns :: CasePatterns [[AType]] *ExpressionHeap -> (Bool, *ExpressionHeap)
-checkCaseTypesCasePatterns (BasicPatterns bt patterns) _ expr_heap
- = (True, expr_heap)
-checkCaseTypesCasePatterns (AlgebraicPatterns gi patterns) arg_types expr_heap
- | length patterns <> length arg_types
- = abort ("checkCaseTypesCasePatterns error number of cases " +++ toString (length patterns) +++ " <> " +++ toString (length arg_types)) <<- arg_types
- = checkCaseTypesAlgebraicPatterns (exactZip patterns arg_types) expr_heap
-checkCaseTypesCasePatterns (OverloadedListPatterns type decons_expr patterns) arg_types expr_heap
- | length patterns <> length arg_types
- = abort ("checkCaseTypesCasePatterns error number of cases " +++ toString (length patterns) +++ " <> " +++ toString (length arg_types)) <<- arg_types
- = checkCaseTypesAlgebraicPatterns (exactZip patterns arg_types) expr_heap
-
-checkCaseTypesAlgebraicPatterns :: [(AlgebraicPattern, [AType])] *ExpressionHeap -> (Bool, *ExpressionHeap)
-checkCaseTypesAlgebraicPatterns l expr_heap
- # (oks, expr_heap)
- = mapSt checkCaseTypesAlgebraicPattern l expr_heap
- = (and oks, expr_heap)
-where
- checkCaseTypesAlgebraicPattern :: (AlgebraicPattern, [AType]) *ExpressionHeap -> (Bool, *ExpressionHeap)
- checkCaseTypesAlgebraicPattern (pattern=:{ap_expr, ap_vars}, arg_types) expr_heap
- | length ap_vars <> length arg_types
- = abort ("checkCaseTypesCasePattern error number of pattern args " +++ toString (length ap_vars) +++ " <> " +++ toString (length arg_types)) <<- arg_types
- = (length ap_vars == length arg_types, expr_heap)
-
-instance checkCaseTypes (Optional a) | checkCaseTypes a where
- checkCaseTypes (Yes expr) cs
- = checkCaseTypes expr cs
- checkCaseTypes No cs
- = (True, cs)
-
-instance checkCaseTypes [a] | checkCaseTypes a where
- checkCaseTypes l cs
- # (oks, expr_heap)
- = mapSt checkCaseTypes l cs
- = (and oks, expr_heap)
-
-instance checkCaseTypes BasicPattern where
- checkCaseTypes pattern=:{bp_expr} cs
- = checkCaseTypes bp_expr cs
-// ... sanity check
-
:: CaseLevel = CaseLevelRoot | CaseLevelAfterGuardRoot
:: ConvertInfo =
@@ -165,7 +100,6 @@ convertCasesInBody (TransformedBody body) (Yes type) group_index common_defs cs
body cs
= (TransformedBody body, cs)
-
/*
weightedRefCount determines the reference counts of variables in an expr. Runtime behaviour
of constructs is taken into account: multiple occurrences of variables in different
@@ -300,13 +234,6 @@ where
= (lvi_count, var_heap)
weightedRefCount rci (Case case_expr) rs=:{rcs_expr_heap}
-/*
-// sanity check ...
- # (ok, rcs_expr_heap) = checkCaseTypes case_expr rcs_expr_heap
- | not ok
- = abort "error in case types (weightedRefCount)"
-// ... sanity check
-*/
# (case_info, rcs_expr_heap) = readPtr case_expr.case_info_ptr rcs_expr_heap
= weightedRefCountOfCase rci case_expr case_info {rs & rcs_expr_heap = rcs_expr_heap}
weightedRefCount rci expr=:(BasicExpr _) rs
@@ -334,7 +261,7 @@ where
weightedRefCount rci (FailExpr _) rs
= rs
weightedRefCount rci expr rs
- = abort ("weightedRefCount [Expression] (convertcases))" -*-> expr)
+ = abort "weightedRefCount [Expression] (convertcases)"
addPatternVariable depth {cv_variable = var_info_ptr, cv_count = ref_count} (free_vars, var_heap)
# (var_info, var_heap) = readPtr var_info_ptr var_heap
@@ -439,7 +366,6 @@ where
[]
-> (collected_vars, var_heap)
= ([ {cv_variable = var_ptr, cv_count = lvi_count} : collected_vars ], var_heap)
-
/*
Here we examine the appplication to see whether an imported function has been used. If so,
@@ -691,7 +617,7 @@ where
(kind, ds_var_heap) = case_kind outer_vars kees ds.ds_var_heap
case_new_info = EI_CaseTypeAndSplits type {sic_splits = [], sic_next_alt = No, sic_case_kind = kind}
(case_info_ptr, ds_expr_heap) = newPtr case_new_info ds.ds_expr_heap
- kees = { kees & case_info_ptr = case_info_ptr } ->> ("case_kind", di_depth, kind, case_explicit, ptrToInt case_info_ptr)
+ kees = { kees & case_info_ptr = case_info_ptr } // ->> ("case_kind", di_depth, kind, case_explicit, ptrToInt case_info_ptr)
= (kees, { ds & ds_expr_heap = ds_expr_heap, ds_var_heap = ds_var_heap})
where
case_kind _ {case_guards, case_default, case_explicit, case_expr} var_heap
@@ -703,7 +629,6 @@ where
// otherwise
= (CaseKindLeave, var_heap)
where
-
is_lhs_var (Var {var_info_ptr, var_ident}) var_heap
= case sreadPtr var_info_ptr var_heap of
VI_LocalLetVar
@@ -1025,23 +950,11 @@ where
// alternative + 1
:: CaseKind
- = CaseKindUnknown {#Char}
+ = CaseKindUnknown
| CaseKindGuard // a boolean case that can be handled by the backend
| CaseKindLeave // a case that can be handled by the backend
| CaseKindTransform // a case that should be transformed
-instance == CaseKind where
- (==) (CaseKindUnknown _) (CaseKindUnknown _)
- = True
- (==) CaseKindGuard CaseKindGuard
- = True
- (==) CaseKindLeave CaseKindLeave
- = True
- (==) CaseKindTransform CaseKindTransform
- = True
- (==) _ _
- = False
-
:: SplitsInCase =
{ sic_next_alt :: Optional NextAlt // the alternative of an outer default, to which
// control should pass
@@ -1067,60 +980,48 @@ class findSplitCases e :: !SplitInfo !e !*SplitState -> *SplitState
instance findSplitCases (Optional a) | findSplitCases a where
findSplitCases _ No ss
- = ss <<- "findSplitCases (Opt No)"
+ = ss
findSplitCases si (Yes x) ss
- = findSplitCases si x ss <<- "findSplitCases (Opt No)"
+ = findSplitCases si x ss
instance findSplitCases Expression where
findSplitCases si (Let lad) ss
- = findSplitCases si lad ss <<- "findSplitCases (Exp Let)"
+ = findSplitCases si lad ss
findSplitCases si (Case kees) ss
- = findSplitCases si kees ss <<- "findSplitCases (Exp Case)"
+ = findSplitCases si kees ss
findSplitCases _ _ ss
- = ss <<- "findSplitCases (Exp _)"
+ = ss
instance findSplitCases Case where
findSplitCases si kees=:{case_info_ptr, case_guards, case_default, case_explicit} ss
- # ss
- = split_guards {si & si_next_alt = first_next_alt, si_force_next_alt=False} use_outer_alt case_guards ss
- # ss
- = nextAlts si kees ss
- = ss
+ # first_next_alt = Yes {na_case = case_info_ptr, na_alt_nr = 1}
+ use_outer_alt = use_outer_alt_for_last_alt case_default si
+ ss = split_guards {si & si_next_alt = first_next_alt, si_force_next_alt=False} use_outer_alt case_guards ss
+ = nextAlts si kees ss
where
- first_next_alt
- = Yes {na_case = case_info_ptr, na_alt_nr = 1}
- use_outer_alt
- = use_outer_alt_for_last_alt case_default si
-
-// split_guards :: SplitInfo (Optional (Optional NextAlt)) CasePatterns *SplitState -> (Bool, *SplitState)
+ split_guards :: SplitInfo (Optional SplitInfo) CasePatterns *SplitState -> *SplitState
split_guards si use_outer_alt (AlgebraicPatterns _ alts) ss
- = split_alts si use_outer_alt alts ss
+ = split_alts si use_outer_alt alts ss
split_guards si use_outer_alt (BasicPatterns _ alts) ss
- = split_alts si use_outer_alt alts ss
+ = split_alts si use_outer_alt alts ss
split_guards si use_outer_alt (OverloadedListPatterns _ _ alts) ss
- = split_alts si use_outer_alt alts ss
+ = split_alts si use_outer_alt alts ss
-// split_alts :: SplitInfo (Optional (Optional NextAlt)) [a] *SplitState -> (Bool, *SplitState) | findSplitCases a
+ split_alts :: SplitInfo (Optional SplitInfo) [a] *SplitState -> *SplitState | findSplitCases a
split_alts _ _ [] ss
- = ss
+ = ss
split_alts _ (Yes si) [last] ss
- # ss
- = findSplitCases si last ss
- = ss
+ = findSplitCases si last ss
split_alts si last_next_alt [pattern : patterns] ss
- # ss
- = findSplitCases si pattern ss
- = split_alts (incAltNr si) last_next_alt patterns ss
+ # ss = findSplitCases si pattern ss
+ = split_alts (incAltNr si) last_next_alt patterns ss
-// use_outer_alt_for_last_alt :: (Optional Expression) ExprInfoPtr SplitInfo -> Optional (Optional NextAlt)
+ use_outer_alt_for_last_alt :: (Optional Expression) SplitInfo -> Optional SplitInfo
use_outer_alt_for_last_alt No si
- /*
- This case has no default. If the last alternative fails,
- control is passed to the outer case.
- */
- = Yes si
+ // This case has no default. If the last alternative fails, control is passed to the outer case.
+ = Yes si
use_outer_alt_for_last_alt (Yes _) si
- = No
+ = No
// debug ...
instance toString (Optional a) | toString a where
@@ -1152,15 +1053,15 @@ instance incAltNr SplitInfo where
instance findSplitCases AlgebraicPattern where
findSplitCases si {ap_expr} ss
- = findSplitCases si ap_expr ss <<- "findSplitCases (AlgebraicPattern)"
+ = findSplitCases si ap_expr ss
instance findSplitCases BasicPattern where
findSplitCases si {bp_expr} ss
- = findSplitCases si bp_expr ss <<- "findSplitCases (BasicPattern)"
+ = findSplitCases si bp_expr ss
instance findSplitCases Let where
findSplitCases si {let_expr} ss
- = findSplitCases si let_expr ss <<- "findSplitCases (Let)"
+ = findSplitCases si let_expr ss
nextAlts :: SplitInfo Case *SplitState -> *SplitState
nextAlts si=:{si_next_alt=Yes next_alt, si_force_next_alt} kees=:{case_info_ptr, case_default} ss
@@ -1174,8 +1075,8 @@ nextAlts si=:{si_next_alt=Yes next_alt, si_force_next_alt} kees=:{case_info_ptr,
= findSplitCases {si & si_force_next_alt=jumps} case_default ss
| jumps && not (hasOption case_default)
// update the info for this case
- # ss_expr_heap
- = ss.ss_expr_heap <:= (case_info_ptr,
+ # ss_expr_heap
+ = ss.ss_expr_heap <:= (case_info_ptr,
EI_CaseTypeAndSplits type {splits & sic_next_alt = Yes next_alt})
// update the info for the outer case
# (EI_CaseTypeAndSplits type splits, ss_expr_heap)
@@ -1185,25 +1086,17 @@ nextAlts si=:{si_next_alt=Yes next_alt, si_force_next_alt} kees=:{case_info_ptr,
ss_expr_heap
= ss_expr_heap <:= (next_alt.na_case,
EI_CaseTypeAndSplits type {splits & sic_splits = [split : splits.sic_splits]})
- ss_expr_heap
- = ss_expr_heap
- ->> (toString kees.case_ident, ptrToInt case_info_ptr,
- "jumps to ", ptrToInt next_alt.na_case, next_alt.na_alt_nr)
-
= {ss & ss_expr_heap = ss_expr_heap}
- // otherwise
= ss
-
-
where
-/* stress test, convert all cases without a default
+ /* stress test, convert all cases without a default
jumps_to_next_alt _ {case_default = No} ss
= (True, ss)
-*/
-/* stress test, convert all explicit cases (may change semantics for failing programs)
+ */
+ /* stress test, convert all explicit cases (may change semantics for failing programs)
jumps_to_next_alt _ {case_default = No, case_explicit = True, case_expr}
= (True, ss) ->> (toString (ptrToInt case_info_ptr) +++ " jumps, because explicit")
-*/
+ */
jumps_to_next_alt {sic_splits=[_:_]} {case_explicit = False}
= True ->> (toString (ptrToInt case_info_ptr) +++ " jumps, because alt was moved")
jumps_to_next_alt {sic_case_kind=CaseKindTransform} {case_explicit = False}
@@ -1211,7 +1104,7 @@ nextAlts si=:{si_next_alt=Yes next_alt, si_force_next_alt} kees=:{case_info_ptr,
jumps_to_next_alt _ _
= False ->> (toString (ptrToInt case_info_ptr) +++ " doesn't jumps " +++ toString kees.case_explicit)
nextAlts si kees=:{case_default} ss
- = findSplitCases si case_default ss ->> ("nextAlts no outerdefault" +++ toString kees.case_explicit)
+ = findSplitCases si case_default ss // ->> ("nextAlts no outerdefault" +++ toString kees.case_explicit)
newFunctionWithType :: !(Optional Ident) !FunctionBody ![FreeVar] !SymbolType !Int !(!Int, ![FunctionInfoPtr],!*FunctionHeap)
-> (! SymbIdent, !(!Int, ![FunctionInfoPtr],!*FunctionHeap))
@@ -1386,30 +1279,29 @@ instance convertRootCases Expression where
convertRootCases ci caseExpr=:(Case kees=:{case_expr, case_guards, case_default, case_explicit, case_info_ptr}) cs
# (EI_CaseTypeAndSplits _ {sic_case_kind}, cs_expr_heap)
= readPtr case_info_ptr cs.cs_expr_heap
- cs = {cs & cs_expr_heap = cs_expr_heap}
- | sic_case_kind == CaseKindGuard
- = case case_guards of
+ cs & cs_expr_heap = cs_expr_heap
+ = case sic_case_kind of
+ CaseKindGuard
+ -> case case_guards of
BasicPatterns BT_Bool patterns
# ({case_expr, case_guards, case_default, case_explicit, case_info_ptr}, cs)
= splitCase ci kees cs
-> convert_boolean_case_into_guard ci case_expr patterns case_default case_info_ptr cs
_
-> abort "convertcases, convertRootCases: bool patterns expected"
- | sic_case_kind == CaseKindLeave
- # (kees=:{case_expr, case_guards, case_default, case_explicit, case_info_ptr}, cs)
- = splitCase ci kees cs
- # (EI_CaseTypeAndSplits case_type _, cs_expr_heap)
- = readPtr case_info_ptr cs.cs_expr_heap
- # (case_expr, cs) = convertCases ci case_expr {cs & cs_expr_heap=cs_expr_heap}
- # (case_guards, cs) = convertRootCasesCasePatterns ci case_guards case_type.ct_cons_types cs
- # (case_default, cs)= convertRootCases ci case_default cs
- = (Case {kees & case_expr=case_expr,
- case_guards=case_guards, case_default=case_default}, cs)
- | sic_case_kind == CaseKindTransform
- = convertNonRootCase ci kees cs
- = case sic_case_kind of
- CaseKindUnknown label
- -> abort ("convertRootCases, unknown casekind " +++ label)
+ CaseKindLeave
+ # (kees=:{case_expr, case_guards, case_default, case_explicit, case_info_ptr}, cs)
+ = splitCase ci kees cs
+ # (EI_CaseTypeAndSplits case_type _, cs_expr_heap)
+ = readPtr case_info_ptr cs.cs_expr_heap
+ # (case_expr, cs) = convertCases ci case_expr {cs & cs_expr_heap=cs_expr_heap}
+ # (case_guards, cs) = convertRootCasesCasePatterns ci case_guards case_type.ct_cons_types cs
+ # (case_default, cs)= convertRootCases ci case_default cs
+ -> (Case {kees & case_expr=case_expr, case_guards=case_guards, case_default=case_default}, cs)
+ CaseKindTransform
+ -> convertNonRootCase ci kees cs
+ CaseKindUnknown
+ -> abort "convertRootCases, unknown casekind"
where
convert_boolean_case_into_guard ci guard [ alt=:{bp_value=BVB sign_of_then_part,bp_expr} : alts ] case_default case_info_ptr cs
# (guard, cs) = convert_guard guard ci cs
@@ -1460,7 +1352,7 @@ splitCase ci kees=:{case_info_ptr} cs=:{cs_expr_heap}
# cs_expr_heap = cs_expr_heap <:= (case_info_ptr, EI_CaseTypeAndSplits case_type {splits & sic_splits = []})
# (kees, case_type, cs=:{cs_expr_heap})
- = split ci sic_splits (kees, case_type, {cs & cs_expr_heap = cs_expr_heap})->> ("split: yes", toString kees.case_ident, ptrToInt kees.case_info_ptr) //, sic_splits)
+ = split ci sic_splits (kees, case_type, {cs & cs_expr_heap = cs_expr_heap}) // ->> ("split: yes", toString kees.case_ident, ptrToInt kees.case_info_ptr) //, sic_splits)
= (kees, {cs & cs_expr_heap = cs_expr_heap})
class split a :: ConvertInfo a (Case, CaseType, *ConvertState) -> (Case, CaseType, *ConvertState)
@@ -1475,17 +1367,19 @@ instance split SplitCase where
= splitIt sc_alt_nr kees
# (case_type1, case_type2)
= splitIt sc_alt_nr case_type
+
# case_type_and_splits2
- = EI_CaseTypeAndSplits case_type2 {sic_splits = [], sic_next_alt = No, sic_case_kind = CaseKindUnknown "2"}
+ = EI_CaseTypeAndSplits case_type2 {sic_splits = [], sic_next_alt = No, sic_case_kind = CaseKindUnknown}
# (case_info_ptr2, cs_expr_heap)
= newPtr case_type_and_splits2 cs_expr_heap
-
# kees2
= {kees2 & case_info_ptr = case_info_ptr2}
+
# (call, cs)
= convertNonRootCase ci kees2 {cs & cs_expr_heap = cs_expr_heap}
# kees1
= {kees1 & case_default = Yes call}
+
# (EI_CaseTypeAndSplits _ splits1, cs_expr_heap)
= readPtr kees.case_info_ptr cs.cs_expr_heap
# case_type_and_splits1
@@ -1569,7 +1463,6 @@ instance addDefault NextAlt where
find_call {na_case, na_alt_nr} expr_heap
# (EI_CaseTypeAndSplits case_type {sic_splits}, expr_heap)
= readPtr na_case expr_heap
- # sic_splits = sic_splits ->> ("find_call", ptrToInt na_case, na_alt_nr)
# call
= hd [ call
\\ {sc_call=Yes call, sc_alt_nr} <- sic_splits
@@ -1718,7 +1611,7 @@ where
convertCases ci selector cs
= (selector, cs)
-convertNonRootFail ci=:{ci_bound_vars, ci_group_index, ci_common_defs} ident cs
+convertNonRootFail ci=:{ci_group_index, ci_common_defs} ident cs
# result_type
= { at_attribute = TA_None
, at_type = TV {tv_ident = { id_name = "a", id_info = nilPtr }, tv_info_ptr = nilPtr}
@@ -1749,19 +1642,23 @@ convertNonRootCase ci=:{ci_bound_vars, ci_group_index, ci_common_defs} kees=:{ c
cs_expr_heap = writePtr case_info_ptr (EI_CaseTypeAndSplits case_type {splits & sic_case_kind=CaseKindLeave}) cs_expr_heap
cs = { cs & cs_expr_heap = cs_expr_heap }
- # (new_info_ptr, cs_var_heap) = newPtr (VI_LocalVar) cs.cs_var_heap
+ # (new_info_ptr, cs_var_heap) = newPtr VI_Empty cs.cs_var_heap
cs = { cs & cs_var_heap = cs_var_heap}
= case case_expr of
Var var=:{var_ident,var_info_ptr}
# var_id = {id_name = var_ident.id_name, id_info = nilPtr}
case_var = Var {var_ident = var_id, var_info_ptr = new_info_ptr, var_expr_ptr = nilPtr}
case_free_var = { fv_def_level = NotALevel, fv_ident = var_id, fv_info_ptr = new_info_ptr, fv_count = 0}
+ case_bound_var = (case_free_var,case_type.ct_pattern_type)
# kees = {kees & case_expr=case_var, case_explicit=False}
- (caseExpr, cs) = convertRootCases {ci & ci_case_level=CaseLevelRoot} (Case kees) cs
+ (caseExpr, cs) = convertRootCases {ci & ci_case_level=CaseLevelRoot,ci_bound_vars=[case_bound_var : ci_bound_vars]} (Case kees) cs
+
+ cs & cs_var_heap = writePtr new_info_ptr VI_LocalVar cs.cs_var_heap
+
(not__x_variable,act_vars, form_vars, local_vars, caseExpr, old_fv_info_ptr_values,cs_var_heap)
= copy_case_expr_and_use_new_var ci_bound_vars var new_info_ptr caseExpr cs.cs_var_heap
- cs = { cs & cs_var_heap = cs_var_heap}
+ cs & cs_var_heap = cs_var_heap
| not__x_variable
# (fun_ident, cs) = new_case_function_and_restore_old_fv_info_ptr_values case_ident case_type.ct_result_type caseExpr
form_vars local_vars
@@ -1769,24 +1666,28 @@ convertNonRootCase ci=:{ci_bound_vars, ci_group_index, ci_common_defs} kees=:{ c
= (App { app_symb = fun_ident, app_args = act_vars, app_info_ptr = nilPtr }, cs)
# (fun_ident, cs) = new_case_function_and_restore_old_fv_info_ptr_values case_ident case_type.ct_result_type caseExpr
- [(case_free_var, case_type.ct_pattern_type) : form_vars] local_vars
+ [case_bound_var : form_vars] local_vars
ci_bound_vars old_fv_info_ptr_values ci_group_index ci_common_defs cs
= (App { app_symb = fun_ident, app_args = [case_expr : act_vars], app_info_ptr = nilPtr }, cs)
_
# var_id = {id_name = "_x", id_info = nilPtr}
case_var = Var {var_ident = var_id, var_info_ptr = new_info_ptr, var_expr_ptr = nilPtr}
case_free_var = { fv_def_level = NotALevel, fv_ident = var_id, fv_info_ptr = new_info_ptr, fv_count = 0}
+ case_bound_var = (case_free_var,case_type.ct_pattern_type)
# kees = {kees & case_expr=case_var, case_explicit=False}
(case_expr, cs) = convertCases ci case_expr cs
- (caseExpr, cs) = convertRootCases {ci & ci_case_level=CaseLevelRoot} (Case kees) cs
+ (caseExpr, cs) = convertRootCases {ci & ci_case_level=CaseLevelRoot,ci_bound_vars=[case_bound_var : ci_bound_vars]} (Case kees) cs
+
+ cs & cs_var_heap = writePtr new_info_ptr VI_LocalVar cs.cs_var_heap
+
(act_vars, form_vars, local_vars, caseExpr, old_fv_info_ptr_values,cs_var_heap)
= copy_case_expr ci_bound_vars caseExpr cs.cs_var_heap
- cs = { cs & cs_var_heap = cs_var_heap}
-
+ cs & cs_var_heap = cs_var_heap
+
# (fun_ident, cs) = new_case_function_and_restore_old_fv_info_ptr_values case_ident case_type.ct_result_type caseExpr
- [(case_free_var, case_type.ct_pattern_type) : form_vars] local_vars
+ [case_bound_var : form_vars] local_vars
ci_bound_vars old_fv_info_ptr_values ci_group_index ci_common_defs cs
= (App { app_symb = fun_ident, app_args = [case_expr : act_vars], app_info_ptr = nilPtr }, cs)
where
@@ -1887,7 +1788,7 @@ instance copy BoundVar
where
copy var=:{var_ident,var_info_ptr} cp_info=:{cp_var_heap}
# (var_info, cp_var_heap) = readPtr var_info_ptr cp_var_heap
- cp_info = { cp_info & cp_var_heap = cp_var_heap }
+ cp_info & cp_var_heap = cp_var_heap
= case var_info of
VI_FreeVar name new_info_ptr count type
-> ({ var & var_info_ptr = new_info_ptr },