aboutsummaryrefslogtreecommitdiff
path: root/frontend/convertDynamics.icl
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/convertDynamics.icl')
-rw-r--r--frontend/convertDynamics.icl79
1 files changed, 41 insertions, 38 deletions
diff --git a/frontend/convertDynamics.icl b/frontend/convertDynamics.icl
index bbe667d..7250896 100644
--- a/frontend/convertDynamics.icl
+++ b/frontend/convertDynamics.icl
@@ -122,18 +122,23 @@ where
convert_function group_nr dynamic_representation fun (fun_defs, ci)
# (fun_def, fun_defs) = fun_defs![fun]
{fun_body, fun_type, fun_info} = fun_def
- | isEmpty fun_info.fi_dynamics
+ | fun_info.fi_properties bitand FI_HasTypeCodes==0 && isEmpty fun_info.fi_dynamics
= (fun_defs, ci)
-
- # (unify_subst_var, ci) = newVariable "unify_subst" VI_Empty ci
+ # (unify_subst_var, ci) = newVariable "unify_subst" VI_NotUsed ci
# ci = {ci & ci_type_pattern_var_count = 0, ci_type_var_count = 0}
-
# (fun_body, ci) = convertDynamics {cinp_st_args = [], cinp_dynamic_representation = dynamic_representation,
cinp_subst_var = unify_subst_var} fun_body ci
-
= ({fun_defs & [fun] = {fun_def & fun_body = fun_body, fun_info = {fun_info & fi_local_vars = ci.ci_new_variables ++ fun_info.fi_local_vars }}},
{ci & ci_new_variables = []})
+mark_cinp_subst_var :: !BoundVar !*VarHeap -> *VarHeap;
+mark_cinp_subst_var {var_info_ptr} var_heap
+ = case sreadPtr var_info_ptr var_heap of
+ VI_NotUsed
+ -> writePtr var_info_ptr VI_Empty var_heap
+ _
+ -> var_heap
+
class convertDynamics a :: !ConversionInput !a !*ConversionState -> (!a, !*ConversionState)
instance convertDynamics [a] | convertDynamics a where
@@ -153,55 +158,58 @@ instance convertDynamics FunctionBody where
= (TransformedBody body, ci)
instance convertDynamics TransformedBody where
- convertDynamics cinp body=:{tb_args,tb_rhs} ci=:{ci_var_heap}
- // this actually marks all arguments as type terms (also the regular arguments
- // and dictionaries)
+ convertDynamics cinp=:{cinp_subst_var} body=:{tb_args,tb_rhs} ci=:{ci_var_heap}
+ // this actually marks all arguments as type terms (also the regular arguments and dictionaries)
// # ci_var_heap
// = foldSt mark_var tb_args ci_var_heap
# (tb_rhs, ci)
- = convertDynamics cinp tb_rhs {ci & ci_var_heap = ci_var_heap}
+ = convertDynamics cinp tb_rhs {ci & ci_var_heap = ci_var_heap}
# (global_tpvs, subst, ci)
- = foldSt collect_global_type_pattern_var tb_args ([], cinp.cinp_subst_var, ci)
- # (tb_rhs, ci)
- = share_init_subst subst global_tpvs tb_rhs ci
- = ({body & tb_rhs = tb_rhs}, ci)
+ = foldSt collect_global_type_pattern_var tb_args ([], cinp_subst_var, ci)
+ = case sreadPtr cinp_subst_var.var_info_ptr ci.ci_var_heap of
+ VI_NotUsed
+ -> ({body & tb_rhs = tb_rhs}, ci)
+ _
+ # (tb_rhs, ci) = share_init_subst subst global_tpvs tb_rhs ci
+ -> ({body & tb_rhs = tb_rhs}, ci)
where
// mark_var :: FreeVar *VarHeap -> *VarHeap
// mark_var {fv_info_ptr} var_heap
// = writePtr fv_info_ptr (VI_TypeCodeVariable TCI_TypeTerm) var_heap
collect_global_type_pattern_var :: FreeVar ([LetBind], BoundVar, *ConversionState) -> ([LetBind], BoundVar, *ConversionState)
- collect_global_type_pattern_var {fv_info_ptr} (let_binds, subst, ci)
+ collect_global_type_pattern_var {fv_info_ptr} (let_binds, subst_var, ci)
# (var_info, ci_var_heap) = readPtr fv_info_ptr ci.ci_var_heap
ci = {ci & ci_var_heap = ci_var_heap}
= case var_info of
VI_TypeCodeVariable (TCI_TypePatternVar tpv)
# type_code = Var {var_ident = a_ij_var_name, var_info_ptr = fv_info_ptr, var_expr_ptr = nilPtr}
- -> bind_global_type_pattern_var tpv type_code let_binds subst ci
+ -> bind_global_type_pattern_var tpv type_code let_binds subst_var ci
VI_TypeCodeVariable (TCI_SelectionsTypePatternVar tc_selections)
- -> collect_global_type_pattern_var_selections tc_selections fv_info_ptr let_binds subst ci
+ -> collect_global_type_pattern_var_selections tc_selections fv_info_ptr let_binds subst_var ci
_
- -> (let_binds, subst, ci)
+ -> (let_binds, subst_var, ci)
where
- bind_global_type_pattern_var tpv type_code let_binds subst ci
+ bind_global_type_pattern_var tpv type_code let_binds subst_var ci
# (bind_global_tpv_symb, ci)
= getSymbol PD_Dyn_bind_global_type_pattern_var SK_Function 3 ci
(unify_subst_var, ci) = newVariable "gtpv_subst" VI_Empty ci
+ ci & ci_var_heap = mark_cinp_subst_var cinp_subst_var ci.ci_var_heap
let_bind
= { lb_src = App { app_symb = bind_global_tpv_symb,
app_args = [tpv, type_code, Var unify_subst_var],
app_info_ptr = nilPtr }
- , lb_dst = varToFreeVar subst 1
+ , lb_dst = varToFreeVar subst_var 1
, lb_position = NoPos }
= ([let_bind:let_binds], unify_subst_var, ci)
- collect_global_type_pattern_var_selections [(tpv,selections):tc_selections] fv_info_ptr let_binds subst ci
+ collect_global_type_pattern_var_selections [(tpv,selections):tc_selections] fv_info_ptr let_binds subst_var ci
# dictionary = Var {var_ident = a_ij_var_name, var_info_ptr = fv_info_ptr, var_expr_ptr = nilPtr}
type_code = Selection NormalSelector dictionary selections
- (let_binds,subst,ci) = bind_global_type_pattern_var tpv type_code let_binds subst ci
- = collect_global_type_pattern_var_selections tc_selections fv_info_ptr let_binds subst ci
- collect_global_type_pattern_var_selections [] fv_info_ptr let_binds subst ci
- = (let_binds,subst,ci)
+ (let_binds,subst_var,ci) = bind_global_type_pattern_var tpv type_code let_binds subst_var ci
+ = collect_global_type_pattern_var_selections tc_selections fv_info_ptr let_binds subst_var ci
+ collect_global_type_pattern_var_selections [] fv_info_ptr let_binds subst_var ci
+ = (let_binds,subst_var,ci)
share_init_subst :: BoundVar [LetBind] Expression *ConversionState
-> (Expression, *ConversionState)
@@ -375,14 +383,14 @@ convertDynamicCase cinp=:{cinp_dynamic_representation={dr_dynamic_symbol, dr_dyn
convertDynamicAlts _ _ _ _ _ defoult [] ci
= (defoult, ci)
-convertDynamicAlts cinp kees type_var value_var result_type defoult [{dp_rhs, dp_position, dp_type_code, dp_var}:alts] ci
+convertDynamicAlts cinp=:{cinp_subst_var} kees type_var value_var result_type defoult [{dp_rhs, dp_position, dp_type_code, dp_var}:alts] ci
# (type_code, binds, ci)
= convertPatternTypeCode cinp dp_type_code ci
# (unify_symb, ci)
= getSymbol PD_Dyn_unify SK_Function (extended_unify_and_coerce 3 4) /*3 was 2 */ ci
-
- # unify_call = App {app_symb = unify_symb, app_args = [Var cinp.cinp_subst_var,Var type_var,type_code], app_info_ptr = nilPtr}
+ # ci & ci_var_heap = mark_cinp_subst_var cinp_subst_var ci.ci_var_heap
+ # unify_call = App {app_symb = unify_symb, app_args = [Var cinp_subst_var,Var type_var,type_code], app_info_ptr = nilPtr}
// FIXME, more precise types (not all TEs)
# (let_info_ptr, ci) = let_ptr (/* 4 */ 3+length binds) ci
@@ -458,25 +466,21 @@ instance convertDynamics Selection where
# (expr, ci) = convertDynamics cinp expr ci
= (DictionarySelection var selectors expr_ptr expr, ci)
-convertExprTypeCode
- :: !ConversionInput !TypeCodeExpression !*ConversionState
+convertExprTypeCode :: !ConversionInput !TypeCodeExpression !*ConversionState
-> (!Expression, !*ConversionState)
-convertExprTypeCode cinp tce ci
+convertExprTypeCode cinp=:{cinp_subst_var} tce ci
# (type_code, (has_var, binds, ci))
= convertTypeCode False cinp tce (False, [], ci)
- // sanity check ...
| not (isEmpty binds)
= abort "unexpected binds in expression type code"
- // ... sanity check
| has_var
+ # ci & ci_var_heap = mark_cinp_subst_var cinp_subst_var ci.ci_var_heap
# (normalise_symb, ci)
= getSymbol PD_Dyn_normalise SK_Function 2 ci
# type_code
- = App { app_symb = normalise_symb,
- app_args = [ Var cinp.cinp_subst_var, type_code], app_info_ptr = nilPtr }
- = (type_code, ci)
- // otherwise
- = (type_code, ci)
+ = App {app_symb = normalise_symb, app_args = [Var cinp.cinp_subst_var, type_code], app_info_ptr = nilPtr}
+ = (type_code, ci)
+ = (type_code, ci)
convertPatternTypeCode :: !ConversionInput !TypeCodeExpression !*ConversionState
-> (!Expression, ![LetBind], !*ConversionState)
@@ -679,7 +683,6 @@ freeVarToVar :: FreeVar -> BoundVar
freeVarToVar {fv_ident, fv_info_ptr}
= { var_ident = fv_ident, var_info_ptr = fv_info_ptr, var_expr_ptr = nilPtr}
-
getResultType :: ExprInfoPtr !*ConversionState -> (!AType, !*ConversionState)
getResultType case_info_ptr ci=:{ci_expr_heap}
# (EI_CaseType {ct_result_type}, ci_expr_heap) = readPtr case_info_ptr ci_expr_heap