aboutsummaryrefslogtreecommitdiff
path: root/frontend/checkKindCorrectness.icl
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/checkKindCorrectness.icl')
-rw-r--r--frontend/checkKindCorrectness.icl261
1 files changed, 172 insertions, 89 deletions
diff --git a/frontend/checkKindCorrectness.icl b/frontend/checkKindCorrectness.icl
index d0dd2e1..f48cfcb 100644
--- a/frontend/checkKindCorrectness.icl
+++ b/frontend/checkKindCorrectness.icl
@@ -5,55 +5,83 @@ import syntax, containers, checksupport, utilities
// import RWSDebug
-checkKindCorrectness :: !NumberSet !Index IndexRange !{#CommonDefs} !{#DclModule} !u:{# FunDef} !*TypeVarHeap !*TypeDefInfos !*ErrorAdmin
- -> (!u:{# FunDef}, !*TypeVarHeap, !*TypeDefInfos, !*ErrorAdmin)
-checkKindCorrectness icl_used_module_numbers main_dcl_module_n icl_instances common_defs dcl_mods
- fun_defs th_vars td_infos error_admin
- #! n_fun_defs = size fun_defs
- # (th_vars, td_infos, error_admin)
+checkKindCorrectness :: !Index IndexRange !u:{# FunDef} !{#CommonDefs} !*{#DclModule} !*TypeVarHeap !*TypeDefInfos !*ErrorAdmin
+ -> (!u:{# FunDef}, !*{#DclModule}, !*TypeVarHeap, !*TypeDefInfos, !*ErrorAdmin)
+checkKindCorrectness main_dcl_module_n icl_instances fun_defs common_defs
+ dcl_mods th_vars td_infos error_admin
+ #! n_fun_defs
+ = size fun_defs
+ size_dcl_mods
+ = size dcl_mods
+ # (bv_cashed_modules, dcl_mods)
+ = iFoldSt mark_cashed_module
+ 0 size_dcl_mods (bitvectCreate size_dcl_mods, dcl_mods)
+ (dcl_mods, th_vars, td_infos, error_admin)
= iFoldSt (\mod_index state
- -> if (inNumberSet mod_index icl_used_module_numbers)
- (check_kind_correctness_of_classes common_defs common_defs.[mod_index] state)
- state)
- 0 (size dcl_mods) (th_vars, td_infos, error_admin)
- th_vars = th_vars
- (th_vars, td_infos, error_admin)
+ -> if (bitvectSelect mod_index bv_cashed_modules)
+ state
+ (check_kind_correctness_of_classes mod_index state))
+ 0 size_dcl_mods (dcl_mods, th_vars, td_infos, error_admin)
+ icl_common_defs
+ = common_defs.[main_dcl_module_n]
+ (_, th_vars, td_infos, error_admin)
+ = foldrArraySt (check_kind_correctness_of_class icl_common_defs.com_member_defs)
+ icl_common_defs.com_class_defs
+ ([], th_vars, td_infos, error_admin)
+ bv_uninitialized_mods
+ = {el\\el<-:bv_cashed_modules}
+ (bv_uninitialized_mods, th_vars, td_infos, error_admin)
= iFoldSt (\mod_index state
- -> if (inNumberSet mod_index icl_used_module_numbers)
+ -> if (bitvectSelect mod_index bv_cashed_modules)
+ state
(check_kind_correctness_of_instances_and_class_and_member_contexts
- common_defs common_defs.[mod_index] state)
- state)
- 0 (size dcl_mods) (th_vars, td_infos, error_admin)
+ common_defs common_defs.[mod_index] state))
+ 0 size_dcl_mods (bv_uninitialized_mods, th_vars, td_infos, error_admin)
// check_kind_correctness_of_icl_function: don't check the types that were generated for instances
- th_vars = th_vars
state
- = iFoldSt check_kind_correctness_of_icl_function 0 icl_instances.ir_from
- (fun_defs, th_vars, td_infos, error_admin)
- (fun_defs, th_vars, td_infos, error_admin)
- = iFoldSt check_kind_correctness_of_icl_function icl_instances.ir_to n_fun_defs state
- th_vars = th_vars
- (th_vars, td_infos, error_admin)
+ = iFoldSt (check_kind_correctness_of_icl_function common_defs) 0 icl_instances.ir_from
+ (fun_defs, bv_uninitialized_mods, th_vars, td_infos, error_admin)
+ (fun_defs, bv_uninitialized_mods, th_vars, td_infos, error_admin)
+ = iFoldSt (check_kind_correctness_of_icl_function common_defs) icl_instances.ir_to n_fun_defs state
+ (dcl_mods, bv_uninitialized_mods, th_vars, td_infos, error_admin)
= iFoldSt (\mod_index state
- -> if (inNumberSet mod_index icl_used_module_numbers && mod_index<>main_dcl_module_n)
- (check_kind_correctness_of_dcl_functions common_defs dcl_mods.[mod_index]
- state)
- state)
- 0 (size dcl_mods)
- (th_vars, td_infos, error_admin)
- th_vars = th_vars
- = (fun_defs, th_vars, td_infos, error_admin)
+ -> if (bitvectSelect mod_index bv_cashed_modules || mod_index==main_dcl_module_n)
+ state
+ (check_kind_correctness_of_dcl_functions common_defs mod_index state))
+ 0 size_dcl_mods
+ (dcl_mods, bv_uninitialized_mods, th_vars, td_infos, error_admin)
+ = (fun_defs, dcl_mods, th_vars, td_infos, error_admin)
where
- check_kind_correctness_of_classes common_defs {com_class_defs, com_member_defs} state
- = foldlArraySt (check_kind_correctness_of_class common_defs com_member_defs) com_class_defs state
- check_kind_correctness_of_class common_defs com_member_defs {class_name, class_args, class_members}
- (th_vars, td_infos, error_admin)
+ mark_cashed_module mod_index (bitvect, dcl_mods)
+ | dcl_mods.[mod_index].dcl_is_cashed
+ = (bitvectSet mod_index bitvect, dcl_mods)
+ = (bitvect, dcl_mods)
+
+ check_kind_correctness_of_classes mod_index (dcl_mods, th_vars, td_infos, error_admin)
+ # (dcl_mod, dcl_mods)
+ = dcl_mods![mod_index]
+ {com_class_defs, com_member_defs}
+ = dcl_mod.dcl_common
+ (class_defs_with_cacheable_kind_info, th_vars, td_infos, error_admin)
+ = foldrArraySt (check_kind_correctness_of_class com_member_defs) com_class_defs
+ ([], th_vars, td_infos, error_admin)
+ dcl_mods
+ = { dcl_mods & [mod_index].dcl_common.com_class_defs
+ = { el \\ el <- class_defs_with_cacheable_kind_info }}
+ = (dcl_mods, th_vars, td_infos, error_admin)
+ check_kind_correctness_of_class com_member_defs class_def=:{class_name, class_args, class_members}
+ (class_defs_accu, th_vars, td_infos, error_admin)
# th_vars
= foldSt init_type_var class_args th_vars
- = foldlArraySt (\{ds_index} state
- -> check_kind_correctness_of_member_without_context common_defs class_args
- com_member_defs.[ds_index] state)
- class_members (th_vars, td_infos, error_admin)
- check_kind_correctness_of_member_without_context common_defs class_args
+ (th_vars, td_infos, error_admin)
+ = foldlArraySt (\{ds_index} state
+ -> check_kind_correctness_of_member_without_context class_args
+ com_member_defs.[ds_index] state)
+ class_members (th_vars, td_infos, error_admin)
+ (derived_kinds, th_vars)
+ = mapFilterYesSt get_opt_kind class_args th_vars
+ = ([{ class_def & class_arg_kinds = derived_kinds }:class_defs_accu], th_vars, td_infos, error_admin)
+ check_kind_correctness_of_member_without_context class_args
{me_symb, me_pos, me_class_vars, me_type=me_type=:{st_vars, st_args, st_result}}
(th_vars, td_infos, error_admin)
# error_admin
@@ -83,72 +111,115 @@ checkKindCorrectness icl_used_module_numbers main_dcl_module_n icl_instances com
com_class_defs state
= state
check_kind_correctness_of_instance common_defs {ins_is_generic, ins_class, ins_ident, ins_pos, ins_type}
- (th_vars, td_infos, error_admin)
+ (bv_uninitialized_mods, th_vars, td_infos, error_admin)
| ins_is_generic
- // kind correctness of user suppliedg eneric instances
+ // kind correctness of user supplied generic instances
// is checked during generic phase
- = (th_vars, td_infos, error_admin)
- | otherwise
- # {class_args}
- = common_defs.[ins_class.glob_module].com_class_defs.[ins_class.glob_object.ds_index]
- (expected_kinds, th_vars)
- = mapSt get_tvi class_args th_vars
- error_admin
- = setErrorAdmin (newPosition ins_ident ins_pos) error_admin
- th_vars
- = foldSt init_type_var ins_type.it_vars th_vars
- state
- = unsafeFold3St possibly_check_kind_correctness_of_type expected_kinds [1..]
- ins_type.it_types (th_vars, td_infos, error_admin)
- state
- = foldSt (check_kind_correctness_of_context common_defs) ins_type.it_context state
- = state
+ = (bv_uninitialized_mods, th_vars, td_infos, error_admin)
+ # (expected_kinds, bv_uninitialized_mods, th_vars)
+ = get_expected_kinds ins_class common_defs bv_uninitialized_mods th_vars
+ error_admin
+ = setErrorAdmin (newPosition ins_ident ins_pos) error_admin
+ th_vars
+ = foldSt init_type_var ins_type.it_vars th_vars
+ (th_vars, td_infos, error_admin)
+ = unsafeFold3St possibly_check_kind_correctness_of_type expected_kinds [1..]
+ ins_type.it_types (th_vars, td_infos, error_admin)
+ state
+ = foldSt (check_kind_correctness_of_context common_defs) ins_type.it_context
+ (bv_uninitialized_mods, th_vars, td_infos, error_admin)
+ = state
+
+ get_expected_kinds class_index=:{glob_module, glob_object} common_defs bv_uninitialized_mods th_vars
+ | bitvectSelect glob_module bv_uninitialized_mods
+ /* the desired class is defined in a module which is a cached one
+ => check_kind_correctness_of_classes has not been called for all the classes
+ within that module
+ => the kind information for the class args is not in the heap
+ => put it in the heap now
+ */
+ # th_vars
+ = foldlArraySt write_kind_info common_defs.[glob_module].com_class_defs th_vars
+ = get_expected_kinds class_index common_defs (bitvectReset glob_module bv_uninitialized_mods)
+ th_vars
+ # {class_args, class_arg_kinds}
+ = common_defs.[glob_module].com_class_defs.[glob_object.ds_index]
+ (expected_kinds, th_vars)
+ = mapSt get_tvi class_args th_vars
+ = (expected_kinds, bv_uninitialized_mods, th_vars)
+
+ write_kind_info {class_name, class_args, class_arg_kinds} th_vars
+ = write_ki class_args class_arg_kinds th_vars
+
+ write_ki [{tv_info_ptr}:class_args] [class_arg_kind:class_arg_kinds] th_vars
+ = write_ki class_args class_arg_kinds (writePtr tv_info_ptr (TVI_Kind class_arg_kind) th_vars)
+ write_ki [{tv_info_ptr}:class_args] [] th_vars
+ = write_ki class_args [] (writePtr tv_info_ptr TVI_Empty th_vars)
+ write_ki [] [] th_vars
+ = th_vars
+
possibly_check_kind_correctness_of_type TVI_Empty _ _ state
// This can happen for stooopid classes like StdClass::Ord, where the member type is ignored at all
= state
possibly_check_kind_correctness_of_type (TVI_Kind expected_kind) arg_nr type state
= check_kind_correctness_of_type expected_kind arg_nr type state
check_kind_correctness_of_class_context_and_member_contexts common_defs com_member_defs
- {class_name, class_pos, class_context, class_members} (th_vars, td_infos, error_admin)
+ {class_name, class_pos, class_context, class_members, class_args}
+ (bv_uninitialized_mods, th_vars, td_infos, error_admin)
# error_admin
= setErrorAdmin (newPosition class_name class_pos) error_admin
state
= foldSt (check_kind_correctness_of_context common_defs) class_context
- (th_vars, td_infos, error_admin)
+ (bv_uninitialized_mods, th_vars, td_infos, error_admin)
state
= foldlArraySt (check_kind_correctness_of_member_context common_defs com_member_defs)
class_members state
= state
check_kind_correctness_of_member_context common_defs com_member_defs {ds_index}
- (th_vars, td_infos, error_admin)
+ (bv_uninitialized_mods, th_vars, td_infos, error_admin)
# {me_symb, me_pos, me_type}
= com_member_defs.[ds_index]
error_admin
= setErrorAdmin (newPosition me_symb me_pos) error_admin
= foldSt (check_kind_correctness_of_context common_defs) me_type.st_context
- (th_vars, td_infos, error_admin)
+ (bv_uninitialized_mods, th_vars, td_infos, error_admin)
get_tvi {tv_info_ptr} th_vars
= readPtr tv_info_ptr th_vars
- check_kind_correctness_of_icl_function fun_n (fun_defs, th_vars, td_infos, error_admin)
+ get_opt_kind {tv_info_ptr} th_vars
+ # (tvi, th_vars)
+ = readPtr tv_info_ptr th_vars
+ #! opt_kind
+ = case tvi of
+ TVI_Kind kind -> Yes kind
+ _ -> No
+ = (opt_kind, th_vars)
+ check_kind_correctness_of_icl_function common_defs fun_n
+ (fun_defs, bv_uninitialized_mods, th_vars, td_infos, error_admin)
# (fun_def, fun_defs) = fun_defs![fun_n]
= case fun_def.fun_type of
No
- -> (fun_defs, th_vars, td_infos, error_admin)
+ -> (fun_defs, bv_uninitialized_mods, th_vars, td_infos, error_admin)
Yes st
- # (th_vars, td_infos, error_admin)
+ # (bv_uninitialized_mods, th_vars, td_infos, error_admin)
= check_kind_correctness_of_symbol_type common_defs fun_def.fun_symb fun_def.fun_pos
- st (th_vars, td_infos, error_admin)
- -> (fun_defs, th_vars, td_infos, error_admin)
- check_kind_correctness_of_dcl_functions common_defs {dcl_functions, dcl_instances, dcl_macros} state
- = iFoldSt (\i state
- -> if (in_index_range i dcl_instances || in_index_range i dcl_macros) // yawn
- state
- (let ({ft_symb, ft_pos, ft_type}) = dcl_functions.[i]
- in check_kind_correctness_of_symbol_type common_defs ft_symb ft_pos ft_type
- state))
- 0 (size dcl_functions) state
- check_kind_correctness_of_symbol_type common_defs fun_symb fun_pos
- st=:{st_vars, st_args, st_result, st_context} (th_vars, td_infos, error_admin)
+ st (bv_uninitialized_mods, th_vars, td_infos, error_admin)
+ -> (fun_defs, bv_uninitialized_mods, th_vars, td_infos, error_admin)
+ check_kind_correctness_of_dcl_functions common_defs mod_index
+ (dcl_mods, bv_uninitialized_mods, th_vars, td_infos, error_admin)
+ # ({dcl_functions, dcl_instances, dcl_macros}, dcl_mods)
+ = dcl_mods![mod_index]
+ (bv_uninitialized_mods, th_vars, td_infos, error_admin)
+ = iFoldSt (\i state
+ -> if (in_index_range i dcl_instances || in_index_range i dcl_macros) // yawn
+ state
+ (let ({ft_symb, ft_pos, ft_type}) = dcl_functions.[i]
+ in check_kind_correctness_of_symbol_type common_defs ft_symb ft_pos ft_type
+ state))
+ 0 (size dcl_functions) (bv_uninitialized_mods, th_vars, td_infos, error_admin)
+ = (dcl_mods, bv_uninitialized_mods, th_vars, td_infos, error_admin)
+ check_kind_correctness_of_symbol_type common_defs fun_symb fun_pos
+ st=:{st_vars, st_args, st_result, st_context}
+ (bv_uninitialized_mods, th_vars, td_infos, error_admin)
# error_admin
= setErrorAdmin (newPosition fun_symb fun_pos) error_admin
th_vars
@@ -156,9 +227,10 @@ checkKindCorrectness icl_used_module_numbers main_dcl_module_n icl_instances com
(th_vars, td_infos, error_admin)
= unsafeFold2St (check_kind_correctness_of_atype KindConst)
[0..] [st_result:st_args] (th_vars, td_infos, error_admin)
- (th_vars, td_infos, error_admin)
- = foldSt (check_kind_correctness_of_context common_defs) st_context (th_vars, td_infos, error_admin)
- = (th_vars, td_infos, error_admin)
+ (bv_uninitialized_mods, th_vars, td_infos, error_admin)
+ = foldSt (check_kind_correctness_of_context common_defs) st_context
+ (bv_uninitialized_mods, th_vars, td_infos, error_admin)
+ = (bv_uninitialized_mods, th_vars, td_infos, error_admin)
check_kind_correctness_of_atype expected_kind arg_nr {at_type} state
= check_kind_correctness_of_type expected_kind arg_nr at_type state
check_kind_correctness_of_type expected_kind arg_nr (TA {type_name,type_index} args)
@@ -208,22 +280,21 @@ checkKindCorrectness icl_used_module_numbers main_dcl_module_n icl_instances com
= check_equality_of_kinds arg_nr expected_kind KindConst error_admin
= (th_vars, td_infos, error_admin)
- check_kind_correctness_of_context common_defs {tc_class, tc_types} (th_vars, td_infos, error_admin)
- # {class_args}
- = common_defs.[tc_class.glob_module].com_class_defs.[tc_class.glob_object.ds_index]
- (expected_kinds, th_vars)
- = mapSt get_tvi class_args th_vars
- state
+ check_kind_correctness_of_context common_defs {tc_class, tc_types}
+ (bv_uninitialized_mods, th_vars, td_infos, error_admin)
+ # (expected_kinds, bv_uninitialized_mods, th_vars)
+ = get_expected_kinds tc_class common_defs bv_uninitialized_mods th_vars
+ (th_vars, td_infos, error_admin)
= unsafeFold3St possibly_check_kind_correctness_of_type expected_kinds (descending (-1))
tc_types (th_vars, td_infos, error_admin)
- = state
+ = (bv_uninitialized_mods, th_vars, td_infos, error_admin)
where
descending i = [i:descending (i-1)]
init_type_var {tv_info_ptr} th_vars
= writePtr tv_info_ptr TVI_Empty th_vars
- unify_var_kinds expected_kind {tv_name, tv_info_ptr} th_vars error_admin
+ unify_var_kinds expected_kind tv=:{tv_name, tv_info_ptr} th_vars error_admin
# (tvi, th_vars)
= readPtr tv_info_ptr th_vars
= case tvi of
@@ -237,7 +308,7 @@ checkKindCorrectness icl_used_module_numbers main_dcl_module_n icl_instances com
check_equality_of_kinds arg_nr expected_kind kind error_admin
| expected_kind==kind
= error_admin
- = checkError "inconsistent kind in " (arg_nr_to_string arg_nr) error_admin
+ = checkError "inconsistent kind in" (arg_nr_to_string arg_nr) error_admin
arg_nr_to_string 0 = "result type"
arg_nr_to_string i
@@ -245,5 +316,17 @@ checkKindCorrectness icl_used_module_numbers main_dcl_module_n icl_instances com
= "type of argument nr "+++toString i
= "type context nr "+++toString (~i)
+ get_common_defs dcl_mods
+ #! size = size dcl_mods
+ # ({dcl_common=arbitrary_value_for_initializing}, dcl_mods) = dcl_mods![0]
+ = loop 0 (createArray size arbitrary_value_for_initializing) dcl_mods
+ where
+ loop :: !Int !*{#CommonDefs} !u:{#DclModule} -> (!*{#CommonDefs}, !u:{#DclModule})
+ loop i common_defs dcl_mods
+ | i==size dcl_mods
+ = (common_defs, dcl_mods)
+ # ({dcl_common}, dcl_mods) = dcl_mods![i]
+ = loop (i+1) { common_defs & [i] = dcl_common } dcl_mods
in_index_range test ir :== test>=ir.ir_from && test < ir.ir_to
+