aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoralimarin2002-11-12 12:51:32 +0000
committeralimarin2002-11-12 12:51:32 +0000
commit0ad399e1eaa9eb991c46facede40a66fd04ee92b (patch)
tree2f9c5aaec80ebc88711545f387a581ddb63c9e38
parentMade modulename <> filename a proper error (diff)
bugs fixed in generics
- compare def imp for generics - foldExpr - type synonym expansion git-svn-id: https://svn.cs.ru.nl/repos/clean-compiler/trunk@1273 1f8540f1-abd5-4d5b-9d24-4c5ce8603e2d
-rw-r--r--frontend/comparedefimp.icl6
-rw-r--r--frontend/generics1.icl172
-rw-r--r--frontend/transform.icl2
3 files changed, 125 insertions, 55 deletions
diff --git a/frontend/comparedefimp.icl b/frontend/comparedefimp.icl
index 314a587..55850a4 100644
--- a/frontend/comparedefimp.icl
+++ b/frontend/comparedefimp.icl
@@ -1195,6 +1195,12 @@ e_corresponds_app_symb dcl_app_symb=:{symb_name, symb_kind=SK_OverloadedFunction
| dcl_glob_index<>icl_glob_index
= give_error symb_name ec_state
= ec_state
+e_corresponds_app_symb dcl_app_symb=:{symb_name, symb_kind=SK_Generic dcl_glob_index dcl_kind}
+ icl_app_symb=:{symb_kind=SK_Generic icl_glob_index icl_kind}
+ ec_state
+ | dcl_glob_index<>icl_glob_index || dcl_kind <> icl_kind
+ = give_error symb_name ec_state
+ = ec_state
e_corresponds_app_symb dcl_app_symb=:{symb_kind=SK_DclMacro dcl_glob_index} icl_app_symb=:{symb_kind=SK_IclMacro icl_index} ec_state
= continuation_for_possibly_twice_defined_macros dcl_app_symb dcl_glob_index.glob_module dcl_glob_index.glob_object icl_app_symb icl_index ec_state
e_corresponds_app_symb dcl_app_symb=:{symb_name,symb_kind=SK_DclMacro dcl_glob_index} icl_app_symb=:{symb_kind=SK_DclMacro icl_glob_index} ec_state
diff --git a/frontend/generics1.icl b/frontend/generics1.icl
index cd07fa2..c538df2 100644
--- a/frontend/generics1.icl
+++ b/frontend/generics1.icl
@@ -332,8 +332,8 @@ buildGenericTypeRep type_index funs_and_groups
# (cons_infos, funs_and_groups, gs_modules, heaps, gs_error)
= buildTypeDefInfo type_index.gi_module type_def gs_main_module gs_predefs funs_and_groups gs_modules heaps gs_error
- # (atype, gs_modules, gs_td_infos, gs_error)
- = buildStructType type_index cons_infos gs_predefs gs_modules gs_td_infos gs_error
+ # (atype, (gs_modules, gs_td_infos, heaps, gs_error))
+ = buildStructType type_index cons_infos gs_predefs (gs_modules, gs_td_infos, heaps, gs_error)
# (from_fun_ds, funs_and_groups, heaps, gs_error)
= buildConversionFrom type_index.gi_module type_def gs_main_module gs_predefs funs_and_groups heaps gs_error
@@ -363,15 +363,15 @@ buildGenericTypeRep type_index funs_and_groups
// the structure type
//========================================================================================
-convertATypeToGenTypeStruct :: !Ident !Position !AType (!*TypeDefInfos, !*ErrorAdmin)
- -> (GenTypeStruct, (!*TypeDefInfos, !*ErrorAdmin))
+convertATypeToGenTypeStruct :: !Ident !Position !AType (!*Modules, !*TypeDefInfos, !*Heaps, !*ErrorAdmin)
+ -> (GenTypeStruct, (!*Modules, !*TypeDefInfos, !*Heaps, !*ErrorAdmin))
convertATypeToGenTypeStruct ident pos type st
= convert type st
where
- convert {at_type=TA type_symb args} st
- = convert_type_app type_symb args st
- convert {at_type=TAS type_symb args _} st
- = convert_type_app type_symb args st
+ convert {at_type=TA type_symb args, at_attribute} st
+ = convert_type_app type_symb at_attribute args st
+ convert {at_type=TAS type_symb args _, at_attribute} st
+ = convert_type_app type_symb at_attribute args st
convert {at_type=(CV tv) :@: args} st
#! (args, st) = mapSt convert args st
= (GTSAppVar tv args, st)
@@ -383,49 +383,53 @@ where
= (GTSVar tv, st)
convert {at_type=TB _} st
= (GTSAppCons KindConst [], st)
- convert {at_type=type} (td_infos, error)
+ convert {at_type=type} (modules, td_infos, heaps, error)
# error = reportError ident pos ("can not build generic representation for this type", type) error
- = (GTSE, (td_infos, error))
+ = (GTSE, (modules, td_infos, heaps, error))
+
+ convert_type_app {type_index} attr args (modules, td_infos, heaps, error)
+ # (type_def, modules) = modules![type_index.glob_module].com_type_defs.[type_index.glob_object]
+ = case type_def.td_rhs of
+ SynType atype
+ # (expanded_type, th) = expandSynonymType type_def attr args heaps.hp_type_heaps
+ -> convert {at_type = expanded_type, at_attribute = attr}
+ (modules, td_infos, {heaps & hp_type_heaps = th}, error)
+ _
+ #! ({tdi_kinds}, td_infos) = td_infos ! [type_index.glob_module,type_index.glob_object]
+ #! kind = if (isEmpty tdi_kinds) KindConst (KindArrow tdi_kinds)
+ #! (args, st) = mapSt convert args (modules, td_infos, heaps, error)
+ -> (GTSAppCons kind args, st)
+
- convert_type_app {type_index} args (td_infos, error)
- #! ({tdi_kinds}, td_infos) = td_infos ! [type_index.glob_module,type_index.glob_object]
- #! kind = if (isEmpty tdi_kinds) KindConst (KindArrow tdi_kinds)
- #! (args, st) = mapSt convert args (td_infos, error)
- = (GTSAppCons kind args, st)
buildStructType ::
!GlobalIndex // type def global index
![ConsInfo] // constructor and field info symbols
!PredefinedSymbols
- !*{#CommonDefs}
- !*TypeDefInfos
- !*ErrorAdmin
+ (!*Modules, !*TypeDefInfos, !*Heaps, !*ErrorAdmin)
-> ( !GenTypeStruct // the structure type
- , !*{#CommonDefs}
- , !*TypeDefInfos
- , !*ErrorAdmin
+ , (!*Modules, !*TypeDefInfos, !*Heaps, !*ErrorAdmin)
)
-buildStructType {gi_module,gi_index} cons_infos predefs modules td_infos error
+buildStructType {gi_module,gi_index} cons_infos predefs (modules, td_infos, heaps, error)
# (type_def=:{td_name}, modules) = modules![gi_module].com_type_defs.[gi_index]
- # (common_defs, modules) = modules ! [gi_module]
- # (stype, (td_infos, error)) = build_type type_def cons_infos common_defs (td_infos, error)
- = (stype, modules, td_infos, error)
+ //# (common_defs, modules) = modules ! [gi_module]
+ = build_type type_def cons_infos (modules, td_infos, heaps, error)
//---> ("buildStructureType", td_name, atype)
where
- build_type {td_rhs=AlgType alts, td_name, td_pos} cons_infos common_defs st
- # (cons_args, st) = zipWithSt (build_alt td_name td_pos common_defs) alts cons_infos st
+ build_type {td_rhs=AlgType alts, td_name, td_pos} cons_infos st
+ # (cons_args, st) = zipWithSt (build_alt td_name td_pos) alts cons_infos st
= (build_sum_type cons_args, st)
/*
- build_type {td_rhs=RecordType {rt_constructor}, td_name, td_pos} [cdi] common_defs st
- = build_alt td_name td_pos common_defs rt_constructor cdi st
+ build_type {td_rhs=RecordType {rt_constructor}, td_name, td_pos} [cdi] st
+ = build_alt td_name td_pos rt_constructor cdi st
*/
build_type
{td_rhs=RecordType {rt_constructor}, td_name, td_pos}
[{ci_cons_info, ci_field_infos}]
- common_defs st
- # ({cons_type={st_args}}) = common_defs.com_cons_defs.[rt_constructor.ds_index]
- # (args, st) = mapSt (convertATypeToGenTypeStruct td_name td_pos) st_args st
+ (modules, td_infos, heaps, error)
+ # ({cons_type={st_args}}, modules) = modules![gi_module].com_cons_defs.[rt_constructor.ds_index]
+ # (args, st) = mapSt (convertATypeToGenTypeStruct td_name td_pos) st_args (modules, td_infos, heaps, error)
# args = SwitchGenericInfo [GTSField fi arg \\ arg <- args & fi <- ci_field_infos] args
@@ -433,17 +437,20 @@ where
# type = SwitchGenericInfo (GTSCons ci_cons_info prod_type) prod_type
= (type, st)
-
+/*
build_type {td_rhs=SynType type,td_name, td_pos} cons_infos common_defs st
- // ???
= convertATypeToGenTypeStruct td_name td_pos type st
- build_type td=:{td_rhs=(AbstractType _),td_name, td_arity, td_args, td_pos} cdis common_defs (td_infos, error)
+*/
+ build_type {td_rhs=SynType type,td_name, td_pos} cons_infos (modules, td_infos, heaps, error)
+ # error = reportError td_name td_pos "cannot build a generic representation of a synonym type" error
+ = (GTSE, (modules, td_infos, heaps, error))
+ build_type td=:{td_rhs=(AbstractType _),td_name, td_arity, td_args, td_pos} cdis (modules, td_infos, heaps, error)
# error = reportError td_name td_pos "cannot build a generic representation of an abstract type" error
- = (GTSE, (td_infos, error))
+ = (GTSE, (modules, td_infos, heaps, error))
- build_alt td_name td_pos common_defs cons_def_sym=:{ds_index} {ci_cons_info} st
- # ({cons_type={st_args}}) = common_defs.com_cons_defs.[ds_index]
- # (args, st) = mapSt (convertATypeToGenTypeStruct td_name td_pos) st_args st
+ build_alt td_name td_pos cons_def_sym=:{ds_index} {ci_cons_info} (modules, td_infos, heaps, error)
+ # ({cons_type={st_args}}, modules) = modules![gi_module].com_cons_defs.[ds_index]
+ # (args, st) = mapSt (convertATypeToGenTypeStruct td_name td_pos) st_args (modules, td_infos, heaps, error)
# prod_type = build_prod_type args
# type = SwitchGenericInfo (GTSCons ci_cons_info prod_type) prod_type
= (type, st)
@@ -1164,11 +1171,17 @@ where
// To generate all partially applied shorthand instances we need
// classes for all partial applications of the gc_kind and for
- // all the argument kinds
+ // all the argument kinds.
+ // Additionally, we always need classes for base cases *, *->* and *->*->*
#! gs = {gs & gs_modules = gs_modules, gs_td_infos = gs_td_infos}
- #! subkinds = determine_subkinds kind
- #! (st, gs) = foldSt (build_class_if_needed gen_def) subkinds (st, gs)
+ #! subkinds = determine_subkinds kind
+ #! kinds =
+ [ KindConst
+ , KindArrow [KindConst]
+ , KindArrow [KindConst, KindConst]
+ : subkinds]
+ #! (st, gs) = foldSt (build_class_if_needed gen_def) kinds (st, gs)
/*
#! (st, gs) = build_class_if_needed gen_def kind
@@ -1931,8 +1944,8 @@ buildGenericCaseBody main_module_index gc=:{gc_name, gc_pos, gc_generic, gc_type
# (generic_info_var, heaps) = build_generic_info_arg heaps
#! arg_vars = SwitchGenericInfo [generic_info_var:arg_vars] arg_vars
- #! (adaptor_expr, (td_infos, heaps, error))
- = build_adaptor_expr gc gen_def gen_type_rep (td_infos, heaps, error)
+ #! (adaptor_expr, (modules, td_infos, heaps, error))
+ = build_adaptor_expr gc gen_def gen_type_rep (modules, td_infos, heaps, error)
#! (specialized_expr, (td_infos, heaps, error))
= build_specialized_expr gc gtr_type td_args generated_arg_exprs (td_infos, heaps, error)
@@ -1965,7 +1978,7 @@ where
// adaptor that converts a function for the generic representation into a
// function for the type itself
- build_adaptor_expr {gc_name, gc_pos} {gen_type, gen_vars, gen_info_ptr} {gtr_iso} (td_infos, heaps, error)
+ build_adaptor_expr {gc_name, gc_pos} {gen_type, gen_vars, gen_info_ptr} {gtr_iso} (modules, td_infos, heaps, error)
#! (var_kinds, heaps) = get_var_kinds gen_info_ptr heaps
#! non_gen_var_kinds = drop (length gen_vars) var_kinds
@@ -1977,13 +1990,14 @@ where
#! spec_env = gen_env ++ non_gen_env
#! curried_gen_type = curry_symbol_type gen_type
- #! (struct_gen_type, (td_infos, error)) = convertATypeToGenTypeStruct bimap_ident gc_pos curried_gen_type (td_infos, error)
- #! (bimap_expr, state)
+ #! (struct_gen_type, (modules, td_infos, heaps, error)) = convertATypeToGenTypeStruct
+ bimap_ident gc_pos curried_gen_type (modules, td_infos, heaps, error)
+ #! (bimap_expr, (td_infos, heaps, error))
= specializeGeneric {gi_module=bimap_module,gi_index=bimap_index} struct_gen_type spec_env bimap_ident gc_pos main_module_index predefs (td_infos, heaps, error)
#! adaptor_expr
= buildRecordSelectionExpr bimap_expr PD_map_from predefs
- = (adaptor_expr, state)
+ = (adaptor_expr, (modules, td_infos, heaps, error))
where
{pds_module = bimap_module, pds_def=bimap_index}
= predefs.[PD_GenericBimap]
@@ -2027,7 +2041,6 @@ where
// generic function specialzied to the generic representation of the type
build_specialized_expr {gc_name, gc_pos, gc_generic} gtr_type td_args generated_arg_exprs state
#! spec_env = [(atv_variable, expr) \\ {atv_variable} <- td_args & expr <- generated_arg_exprs]
- //= buildSpecializedExpr1 gc_generic.gi_module gc_generic.gi_index gtr_type spec_env gc_name gc_pos state
= specializeGeneric gc_generic gtr_type spec_env gc_name gc_pos main_module_index predefs state
// the body expression
@@ -3147,6 +3160,35 @@ where
#! th_attrs = foldSt (\{av_info_ptr} h->writePtr av_info_ptr AVI_Empty h) avs th_attrs
= {th & th_attrs = th_attrs}
+
+expandSynonymType :: !CheckedTypeDef !TypeAttribute ![AType] !*TypeHeaps -> (!Type, !*TypeHeaps)
+expandSynonymType {td_rhs=SynType {at_type}, td_args, td_attribute} ta_attr ta_args th
+ #! th_attrs = bind_attribute td_attribute ta_attr th.th_attrs
+ #! th = fold2St bind_type_and_attr td_args ta_args { th & th_attrs = th_attrs }
+ #! (at_type, th) = applySubst at_type th
+ #! th_attrs = clear_attribute td_attribute th.th_attrs
+ #! th = foldSt clear_type_and_attr td_args { th & th_attrs = th_attrs }
+ = (at_type, th)
+where
+ bind_type_and_attr {atv_attribute, atv_variable={tv_info_ptr}} {at_type,at_attribute} type_heaps=:{th_vars,th_attrs}
+ = { type_heaps & th_vars = th_vars <:= (tv_info_ptr, TVI_Type at_type),
+ th_attrs = bind_attribute atv_attribute at_attribute th_attrs }
+
+ bind_attribute (TA_Var {av_info_ptr}) attr th_attrs
+ = th_attrs <:= (av_info_ptr, AVI_Attr attr)
+ bind_attribute _ _ th_attrs
+ = th_attrs
+
+ clear_type_and_attr {atv_attribute, atv_variable={tv_info_ptr}} type_heaps=:{th_vars,th_attrs}
+ = { type_heaps & th_vars = th_vars <:= (tv_info_ptr, TVI_Empty), th_attrs = clear_attribute atv_attribute th_attrs }
+
+ clear_attribute (TA_Var {av_info_ptr}) th_attrs
+ = th_attrs <:= (av_info_ptr, AVI_Empty)
+ clear_attribute _ th_attrs
+ = th_attrs
+expandSynonymType td ta_attr ta_args th = abort "expanding not a synonym type\n"
+
+
//****************************************************************************************
// Function Helpers
//****************************************************************************************
@@ -3159,7 +3201,8 @@ makeFunction ident fun_index group_index arg_vars body_expr opt_sym_type main_dc
| not (isEmpty free_vars)
= abort "makeFunction: free_vars is not empty\n"
- = { fun_symb = ident
+ #! fun_def =
+ { fun_symb = ident
, fun_arity = length arg_vars
, fun_priority = NoPrio
, fun_body = TransformedBody {tb_args = arg_vars, tb_rhs = body_expr }
@@ -3176,8 +3219,9 @@ makeFunction ident fun_index group_index arg_vars body_expr opt_sym_type main_dc
, fi_dynamics = []
, fi_properties = 0
}
- }
- //---> ("makeFunction", ident, fun_index, collectCalls main_dcl_module_n body_expr)
+ }
+ = fun_def
+ //---> ("makeFunction", ident, fun_index, main_dcl_module_n, fun_def.fun_info.fi_calls)
// build function and
buildFunAndGroup ::
@@ -3260,7 +3304,13 @@ makeIntExpr value = BasicExpr (BVI (toString value))
makeStringExpr :: String -> Expression
makeStringExpr str
- = BasicExpr (BVS ("\"" +++ str +++ "\""))
+ = BasicExpr (BVS (adjust_string str))
+where
+ adjust_string str
+ = { ch \\ ch <- ['\"'] ++ adjust_chars [ch \\ ch <-: str] ++ ['\"'] }
+ adjust_chars [] = []
+ adjust_chars ['\\':cs] = ['\\','\\' : adjust_chars cs]
+ adjust_chars [c:cs] = [c : adjust_chars cs]
makeListExpr :: [Expression] !PredefinedSymbols !*Heaps -> (Expression, !*Heaps)
makeListExpr [] predefs heaps
@@ -3425,6 +3475,8 @@ foldExpr ::
.st // state
->
.st // updated state
+foldExpr f expr=:(Var _) st
+ = f expr st
foldExpr f expr=:(App {app_args}) st
# st = f expr st
= foldSt (foldExpr f) app_args st
@@ -3449,6 +3501,9 @@ where
fold_guards f (BasicPatterns gi bps) st = foldSt (foldExpr f) [bp_expr\\{bp_expr}<-bps] st
fold_guards f (DynamicPatterns dps) st = foldSt (foldExpr f) [dp_rhs\\{dp_rhs}<-dps] st
fold_guards f NoPattern st = st
+foldExpr f expr=:(Selection _ expr1 _) st
+ # st = f expr st
+ = foldExpr f expr1 st
foldExpr f expr=:(Update expr1 sels expr2) st
# st = f expr st
# st = foldExpr f expr1 st
@@ -3467,6 +3522,10 @@ foldExpr f expr=:(RecordUpdate _ expr1 binds) st
foldExpr f expr=:(TupleSelect _ _ expr1) st
# st = f expr st
= foldExpr f expr1 st
+foldExpr f expr=:(BasicExpr _) st
+ = f expr st
+foldExpr f expr=:WildCard st
+ = f expr st
foldExpr f expr=:(Conditional {if_cond,if_then,if_else}) st
# st = f expr st
# st = foldExpr f if_cond st
@@ -3480,7 +3539,8 @@ foldExpr f expr=:(DynamicExpr {dyn_expr}) st
# st = f expr st
= foldExpr f dyn_expr st
foldExpr f expr st
- = f expr st
+ = abort "generic.icl: foldExpr does not match\n"//f expr st
+ ---> ("foldExpr does not match", expr)
//-----------------------------------------------------------------------------
// map expression applies a function to each node of an expression
@@ -3599,10 +3659,12 @@ instance == FunCall where (==) (FunCall x _) (FunCall y _) = x == y
collectCalls :: !Index !Expression -> [FunCall]
collectCalls current_module expr = removeDup (foldExpr get_call expr [])
where
- get_call (App {app_symb={symb_kind=SK_Function {glob_module,glob_object}}}) indexes
+ get_call (App {app_symb={symb_kind=SK_Function {glob_module,glob_object}, symb_name}}) indexes
| glob_module == current_module
= [FunCall glob_object NotALevel : indexes]
+ //---> ("collect call ", symb_name, glob_object)
= indexes
+ //---> ("do not collect call ", symb_name, glob_module, glob_object)
get_call _ indexes = indexes
// collects variables and computes the refernce counts
diff --git a/frontend/transform.icl b/frontend/transform.icl
index 89a2caf..3880b9d 100644
--- a/frontend/transform.icl
+++ b/frontend/transform.icl
@@ -479,6 +479,8 @@ where
-> unfold_function_app app ui us
SK_OverloadedFunction {glob_module,glob_object}
-> unfold_function_app app ui us
+ SK_Generic {glob_module,glob_object} kind
+ -> unfold_function_app app ui us
SK_LocalMacroFunction local_macro_function_n
-> unfold_local_macro_function (FunctionOrIclMacroIndex local_macro_function_n)
SK_LocalDclMacroFunction {glob_module,glob_object}