aboutsummaryrefslogtreecommitdiff
path: root/frontend/transform.icl
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/transform.icl')
-rw-r--r--frontend/transform.icl74
1 files changed, 23 insertions, 51 deletions
diff --git a/frontend/transform.icl b/frontend/transform.icl
index c6fe4cf..d20de28 100644
--- a/frontend/transform.icl
+++ b/frontend/transform.icl
@@ -1494,10 +1494,6 @@ where
expandMacrosInBody :: [.FunCall] CheckedBody ![ExprInfoPtr] PredefSymbolsForTransform *ExpandState -> ([FreeVar],Expression,[FreeVar],[FunCall],![ExprInfoPtr],.ExpandState);
expandMacrosInBody fi_calls {cb_args,cb_rhs} fi_dynamics predef_symbols_for_transform es=:{es_symbol_table,es_symbol_heap,es_fun_defs,es_macro_defs}
- # (max_index,es_symbol_heap)
- = determine_amount_of_dynamics 0 fi_dynamics es_symbol_heap
- # cos_used_dynamics
- = createArray (inc max_index) False // means not removed
# (prev_calls, fun_defs, macro_defs,es_symbol_table)
= addFunctionCallsToSymbolTable fi_calls es_fun_defs es_macro_defs es_symbol_table
([rhs:rhss], (all_calls, es) )
@@ -1509,42 +1505,22 @@ expandMacrosInBody fi_calls {cb_args,cb_rhs} fi_dynamics predef_symbols_for_tran
(new_rhs, new_args, local_vars, {cos_error, cos_var_heap, cos_symbol_heap, cos_used_dynamics})
= determineVariablesAndRefCounts cb_args merged_rhs
{ cos_error = es_error, cos_var_heap = es_var_heap, cos_symbol_heap = es_symbol_heap,
- cos_predef_symbols_for_transform = predef_symbols_for_transform, cos_used_dynamics = cos_used_dynamics }
- # (changed,fi_dynamics,_,cos_symbol_heap)
- = foldSt remove_fi_dynamic fi_dynamics (False,[],cos_used_dynamics,cos_symbol_heap)
- = (new_args, new_rhs, local_vars, all_calls,fi_dynamics,
+ cos_predef_symbols_for_transform = predef_symbols_for_transform }
+ # (fi_dynamics, cos_symbol_heap)
+ = foldSt collect_used_dynmic fi_dynamics ([], cos_symbol_heap)
+ = (new_args, new_rhs, local_vars, all_calls, fi_dynamics,
{ es & es_error = cos_error, es_var_heap = cos_var_heap, es_symbol_heap = cos_symbol_heap, es_fun_defs=fun_defs, es_symbol_table = symbol_table })
// ---> ("expandMacrosInBody", (cb_args, ca_rhs, '\n'), ("merged_rhs", merged_rhs, '\n'), ("new_rhs", new_args, local_vars, (new_rhs, '\n')))
where
- remove_fi_dynamic dyn_expr_ptr (changed,accu,cos_used_dynamics,cos_symbol_heap)
- # (expr_info,cos_symbol_heap)
- = readPtr dyn_expr_ptr cos_symbol_heap
- | not (isEI_Dynamic expr_info)
- = (changed,[dyn_expr_ptr:accu],cos_used_dynamics,cos_symbol_heap)
- # (EI_Dynamic _ id)
- = expr_info
- | cos_used_dynamics.[id]
- = (changed,[dyn_expr_ptr:accu],cos_used_dynamics,cos_symbol_heap)
- // unused
- = (True,accu,cos_used_dynamics,cos_symbol_heap)
- where
- isEI_Dynamic (EI_Dynamic _ _) = True
- isEI_Dynamic _ = False
-
- determine_amount_of_dynamics max_index [] es_symbol_table
- = (max_index,es_symbol_table)
- determine_amount_of_dynamics max_index [expr_info_ptr:expr_info_ptrs] es_symbol_table
- # (expr_info,es_symbol_table)
- = readPtr expr_info_ptr es_symbol_table
- # (max_index,es_symbol_table)
- = case expr_info of
- EI_Dynamic _ id
- -> (max max_index id,es_symbol_table)
- EI_DynamicTypeWithVars _ _ expr_info_ptrs2
- -> determine_amount_of_dynamics max_index expr_info_ptrs2 es_symbol_table
- // EI_DynamicType _ expr_info_ptrs2
- // -> determine_amount_of_dynamics max_index expr_info_ptrs2 es_symbol_table
- = determine_amount_of_dynamics max_index expr_info_ptrs es_symbol_table
+ collect_used_dynmic dyn_expr_ptr (used_dynamics, symbol_heap)
+ # (expr_info, symbol_heap) = readPtr dyn_expr_ptr symbol_heap
+ = case expr_info of
+ EI_UnmarkedDynamic _ _
+ -> (used_dynamics, symbol_heap)
+ _
+ -> ([dyn_expr_ptr : used_dynamics], symbol_heap)
+
+
expandCheckedAlternative {ca_rhs, ca_position} ei
# (ca_rhs, ei) = expand ca_rhs ei
@@ -1779,7 +1755,6 @@ where
, cos_symbol_heap :: !.ExpressionHeap
, cos_error :: !.ErrorAdmin
, cos_predef_symbols_for_transform :: !PredefSymbolsForTransform
- , cos_used_dynamics :: !.{#Bool}
}
determineVariablesAndRefCounts :: ![FreeVar] !Expression !*CollectState -> (!Expression , ![FreeVar], ![FreeVar], !*CollectState)
@@ -1990,19 +1965,16 @@ where
collectVariables (MatchExpr cons_symb expr) free_vars cos
# (expr, free_vars, cos) = collectVariables expr free_vars cos
= (MatchExpr cons_symb expr, free_vars, cos)
- collectVariables (DynamicExpr dynamic_expr=:{dyn_expr /* MV ... */ , dyn_info_ptr /* ... MV */}) free_vars cos
- #! (dyn_expr, free_vars, cos /* MV ... */ =:{cos_symbol_heap} /* ... MV */) = collectVariables dyn_expr free_vars cos
-// MV ...
- # (expr_info,cos_symbol_heap)
- = readPtr dyn_info_ptr cos_symbol_heap
- # cos
- = { cos & cos_symbol_heap = cos_symbol_heap }
- # cos
- = case expr_info of
- EI_Dynamic _ id -> { cos & cos_used_dynamics = { cos.cos_used_dynamics & [id] = True } }
- _ -> cos
-// ... MV
- = (DynamicExpr {dynamic_expr & dyn_expr = dyn_expr}, free_vars, cos);
+ collectVariables (DynamicExpr dynamic_expr=:{dyn_expr, dyn_info_ptr}) free_vars cos
+ # (dyn_expr, free_vars, cos=:{cos_symbol_heap}) = collectVariables dyn_expr free_vars cos
+ cos_symbol_heap = mark_used_dynamic dyn_info_ptr (readPtr dyn_info_ptr cos_symbol_heap)
+ = (DynamicExpr {dynamic_expr & dyn_expr = dyn_expr}, free_vars, { cos & cos_symbol_heap = cos_symbol_heap });
+ where
+ mark_used_dynamic dyn_info_ptr (EI_UnmarkedDynamic opt_type loc_dynamics, symbol_heap)
+ = symbol_heap <:= (dyn_info_ptr, EI_Dynamic opt_type loc_dynamics)
+ mark_used_dynamic dyn_info_ptr (_, symbol_heap)
+ = symbol_heap
+
collectVariables expr free_vars cos
= (expr, free_vars, cos)