diff options
author | martijnv | 2002-01-23 09:51:18 +0000 |
---|---|---|
committer | martijnv | 2002-01-23 09:51:18 +0000 |
commit | 5d9ae4e96cca14556f597f52a24b6441a99973ff (patch) | |
tree | 33a72a3cacd3ee1677a5d6c15df18ddcdabdc082 /frontend/convertDynamics.icl | |
parent | fixed bug with (->): added clean_up for TArrow (diff) |
bug fix: generate more type information in order to prevent the backend from
generating wrong code.
git-svn-id: https://svn.cs.ru.nl/repos/clean-compiler/trunk@976 1f8540f1-abd5-4d5b-9d24-4c5ce8603e2d
Diffstat (limited to 'frontend/convertDynamics.icl')
-rw-r--r-- | frontend/convertDynamics.icl | 118 |
1 files changed, 105 insertions, 13 deletions
diff --git a/frontend/convertDynamics.icl b/frontend/convertDynamics.icl index 5992ff0..b784b18 100644 --- a/frontend/convertDynamics.icl +++ b/frontend/convertDynamics.icl @@ -38,6 +38,7 @@ from type_io_common import class toString (..),instance toString GlobalTCType; , ci_module_id_symbol :: Expression , ci_internal_type_id :: Expression , ci_module_id :: Optional LetBind + , ci_type_id :: !TypeSymbIdent } :: ConversionInput = @@ -199,6 +200,81 @@ convertDynamicPatternsIntoUnifyAppls global_type_instances common_defs main_dcl_ # (module_symb,module_id_app,predefined_symbols) = get_module_id_app predefined_symbols + +// new... + # ({pds_module=pds_type_id_module, pds_def=pds_type_id_def} , predefined_symbols) = predefined_symbols![PD_TypeID] + # {td_name} = common_defs.[pds_type_id_module].com_type_defs.[pds_type_id_def] + # ci_type_id + = { + type_name = td_name + , type_arity = 0 + , type_index = { glob_object = pds_type_id_def, glob_module = pds_type_id_module} + , type_prop = { tsp_sign = BottomSignClass, tsp_propagation = NoPropClass, tsp_coercible = True } + }; + + +// TE TA !TypeSymbIdent ![AType] +/* +MakeTypeSymbIdentMacro type_index name arity + :== { type_name = name, type_arity = arity, type_index = type_index, + type_prop = { tsp_sign = BottomSignClass, tsp_propagation = NoPropClass, tsp_coercible = True }} + +*/ +/* +:: Global object = + { glob_object :: !object + , glob_module :: !Index + } +:: Type = TA !TypeSymbIdent ![AType] + +:: TypeSymbIdent = + { type_name :: !Ident + , type_arity :: !Int + , type_index :: !Global Index + , type_prop :: !TypeSymbProperties + } +# ({pds_module=pds_module1, pds_def=pds_def1} , predefined_symbols) = predefined_symbols![PD_DynamicTemp] +# {td_rhs=RecordType {rt_constructor,rt_fields}} = common_defs.[pds_module1].com_type_defs.[pds_def1] + +:: TypeDef type_rhs = + { td_name :: !Ident + , td_index :: !Int + , td_arity :: !Int + , td_args :: ![ATypeVar] + , td_attrs :: ![AttributeVar] + , td_context :: ![TypeContext] + , td_rhs :: !type_rhs + , td_attribute :: !TypeAttribute + , td_pos :: !Position + , td_used_types :: ![GlobalIndex] + } + +:: *ConversionInfo = + { ci_predef_symb :: !*PredefinedSymbols + , ci_var_heap :: !*VarHeap + , ci_expr_heap :: !*ExpressionHeap + , ci_new_variables :: ![FreeVar] + , ci_new_functions :: ![FunctionInfoPtr] + , ci_fun_heap :: !*FunctionHeap + , ci_next_fun_nr :: !Index + + // data needed to generate coercions + , ci_placeholders_and_tc_args :: [(!BoundVar,Ptr VarInfo)] + , ci_generated_global_tc_placeholders :: !Bool + , ci_used_tcs :: [Ptr VarInfo] + , ci_symb_ident :: SymbIdent + , ci_sel_type_field :: Expression -> Expression //Optional (!Int,!(Global DefinedSymbol)) + , ci_sel_value_field :: Expression -> Expression //Optional (!Int,!(Global DefinedSymbol)) + , ci_module_id_symbol :: Expression + , ci_internal_type_id :: Expression + , ci_module_id :: Optional LetBind + } + +*/ + + +// ...new + #! nr_of_funs = size fun_defs # imported_types = {com_type_defs \\ {com_type_defs} <-: common_defs } @@ -210,7 +286,8 @@ convertDynamicPatternsIntoUnifyAppls global_type_instances common_defs main_dcl_ ci_used_tcs = [],ci_symb_ident = dynamic_temp_symb_ident , ci_sel_type_field = ci_sel_type_field, ci_sel_value_field = ci_sel_value_field, ci_module_id_symbol = App module_symb, ci_internal_type_id = module_id_app, - ci_module_id = No }) + ci_module_id = No, + ci_type_id = ci_type_id }) (groups, new_fun_defs, imported_types, imported_conses, type_heaps, ci_var_heap) = addNewFunctionsToGroups common_defs ci_fun_heap ci_new_functions main_dcl_module_n groups imported_types [] type_heaps ci_var_heap = (groups, { fundef \\ fundef <- [ fundef \\ fundef <-: fun_defs ] ++ new_fun_defs }, ci_predef_symb, imported_types, imported_conses, ci_var_heap, type_heaps, ci_expr_heap, tcl_file) @@ -274,7 +351,7 @@ where build_type_identification dyn_type_code ci=:{ci_module_id=No} = abort "no ptr"; //(dyn_type_code,ci) build_type_identification dyn_type_code ci=:{ci_module_id=Yes let_bind} - # (let_info_ptr, ci) = let_ptr 1 ci + # (let_info_ptr, ci) = typed_let_ptr ci # letje = Let { let_strict_binds = [], let_lazy_binds = [let_bind], @@ -785,9 +862,9 @@ where }, { ci & ci_new_variables = [ cyclic_fv : ci.ci_new_variables ]} /*ci*/) - add_coercions [] _ _ bound_vars dp_rhs ci + add_coercions _ [] _ _ bound_vars dp_rhs ci = (bound_vars,dp_rhs,ci) - add_coercions [({var_info_ptr=a_ij},a_ij_tc):rest] this_default q bound_vars dp_rhs ci=:{ci_module_id_symbol} + add_coercions result_type [({var_info_ptr=a_ij},a_ij_tc):rest] this_default q bound_vars dp_rhs ci=:{ci_module_id_symbol} // extra # a_ij_var = {var_name = a_ij_var_name, var_info_ptr = a_ij, var_expr_ptr = nilPtr} # a_ij_tc_var = {var_name = a_aij_tc_var_name, var_info_ptr = a_ij_tc, var_expr_ptr = nilPtr} @@ -824,7 +901,7 @@ where // extra # (bound_vars,new_dp_rhs,ci) - = add_coercions rest (if (isNo this_default) No new_default2) q bound_vars dp_rhs ci + = add_coercions result_type rest (if (isNo this_default) No new_default2) q bound_vars dp_rhs ci #! (opt_expr,ci) = toExpression this_default ci @@ -840,7 +917,7 @@ where lb_dst = coerce_bool_fv, lb_position = NoPos } : let_binds ] (let_info_ptr, ci) = let_ptr (length let_lazy_binds) ci - (case_info_ptr, ci) = bool_case_ptr ci + (case_info_ptr, ci) = bool_case_ptr result_type ci /* ... Sjaak */ # let_expr @@ -922,7 +999,7 @@ where #! used_ci_placeholders_and_tc_args = filter (\(_,ci_placeholders_and_tc_arg) -> isMember ci_placeholders_and_tc_arg ci_used_tcs) ci_placeholders_and_tc_args #! (bound_vars,dp_rhs,ci) - = add_coercions used_ci_placeholders_and_tc_args this_default binds bound_vars dp_rhs ci + = add_coercions result_type used_ci_placeholders_and_tc_args this_default binds bound_vars dp_rhs ci -> (dp_rhs,ci) False -> (dp_rhs,ci) @@ -948,7 +1025,7 @@ where /* Sjaak ... */ (let_info_ptr, ci) = let_ptr (2 + length let_binds) ci - (case_info_ptr, ci) = bool_case_ptr ci + (case_info_ptr, ci) = bool_case_ptr result_type ci /* ... Sjaak */ app_args2 = extended_unify_and_coerce [opened_dynamic.opened_dynamic_type, type_code] [opened_dynamic.opened_dynamic_type, type_code, ci_module_id_symbol ] @@ -1237,17 +1314,32 @@ let_ptr ci=:{ci_expr_heap} REPLACED BY: Sjaak ... */ -bool_case_ptr :: !*ConversionInfo -> (ExprInfoPtr, !*ConversionInfo) -bool_case_ptr ci=:{ci_expr_heap} + +bool_case_ptr :: !AType !*ConversionInfo -> (ExprInfoPtr, !*ConversionInfo) +bool_case_ptr result_type ci=:{ci_expr_heap} # (expr_info_ptr, ci_expr_heap) = newPtr (EI_CaseType { ct_pattern_type = toAType (TB BT_Bool), - ct_result_type = empty_attributed_type, + ct_result_type = result_type, //empty_attributed_type, ct_cons_types = [[toAType (TB BT_Bool)]]}) ci_expr_heap = (expr_info_ptr, {ci & ci_expr_heap = ci_expr_heap}) + +// bool_case_ptrNEW result_type ci let_ptr :: !Int !*ConversionInfo -> (ExprInfoPtr, !*ConversionInfo) let_ptr nr_of_binds ci=:{ci_expr_heap} - # (expr_info_ptr, ci_expr_heap) = newPtr (EI_LetType (repeatn nr_of_binds empty_attributed_type)) ci_expr_heap - # (expr_info_ptr, ci_expr_heap) = newPtr (EI_LetType (repeatn nr_of_binds empty_attributed_type)) ci_expr_heap +// # (expr_info_ptr, ci_expr_heap) = newPtr (EI_LetType (repeatn nr_of_binds empty_attributed_type)) ci_expr_heap +// = (expr_info_ptr, {ci & ci_expr_heap = ci_expr_heap}) + = let_ptr2 (repeatn nr_of_binds empty_attributed_type) ci + +// +typed_let_ptr :: !*ConversionInfo -> (ExprInfoPtr, !*ConversionInfo) +typed_let_ptr ci=:{ci_expr_heap,ci_type_id} +// # (expr_info_ptr, ci_expr_heap) = newPtr (EI_LetType [toAType (TA ci_type_id [])]) ci_expr_heap +// = (expr_info_ptr, {ci & ci_expr_heap = ci_expr_heap}) + = let_ptr2 [toAType (TA ci_type_id [])] ci + +let_ptr2 :: [AType] !*ConversionInfo -> (ExprInfoPtr, !*ConversionInfo) +let_ptr2 let_types ci=:{ci_expr_heap} + # (expr_info_ptr, ci_expr_heap) = newPtr (EI_LetType let_types) ci_expr_heap = (expr_info_ptr, {ci & ci_expr_heap = ci_expr_heap}) /* Sjaak ... */ |