diff options
Diffstat (limited to 'frontend/type.icl')
-rw-r--r-- | frontend/type.icl | 79 |
1 files changed, 42 insertions, 37 deletions
diff --git a/frontend/type.icl b/frontend/type.icl index 6160182..ff279bd 100644 --- a/frontend/type.icl +++ b/frontend/type.icl @@ -1940,8 +1940,8 @@ typeProgram comps main_dcl_module_n fun_defs specials list_inferred_types icl_de (type_error, fun_defs, predef_symbols, special_instances, {ts_td_infos,ts_fun_env,ts_error,ts_var_heap, ts_expr_heap, ts_type_heaps, ts_out}) = type_instances list_inferred_types specials.ir_from specials.ir_to class_instances ti (type_error, fun_defs, predef_symbols, special_instances, { ts & ts_fun_env = ts_fun_env }) - (array_first_instance_indices,list_first_instance_indices,tail_strict_list_first_instance_indices,fun_defs,type_code_instances,predef_symbols,ts_type_heaps) - = create_special_instances special_instances fun_env_size ti_common_defs fun_defs predef_symbols ts_type_heaps + (array_first_instance_indices,list_first_instance_indices,tail_strict_list_first_instance_indices,fun_defs,type_code_instances,predef_symbols,ts_type_heaps,ts_error) + = create_special_instances special_instances fun_env_size ti_common_defs fun_defs predef_symbols ts_type_heaps ts_error array_and_list_instances = { ali_array_first_instance_indices=array_first_instance_indices, ali_list_first_instance_indices=list_first_instance_indices, @@ -2360,7 +2360,7 @@ where type_of (UncheckedType tst) = tst type_of (SpecifiedType _ _ tst) = tst - create_special_instances {si_array_instances,si_list_instances,si_tail_strict_list_instances,si_next_array_member_index,si_next_TC_member_index,si_TC_instances} fun_env_size common_defs fun_defs predef_symbols type_heaps + create_special_instances {si_array_instances,si_list_instances,si_tail_strict_list_instances,si_next_array_member_index,si_next_TC_member_index,si_TC_instances} fun_env_size common_defs fun_defs predef_symbols type_heaps error # fun_defs = add_extra_elements_to_fun_def_array (si_next_array_member_index-fun_env_size) fun_defs with add_extra_elements_to_fun_def_array n_new_elements fun_defs @@ -2369,43 +2369,47 @@ where # dummy_fun_def = { fun_symb = {id_name="",id_info=nilPtr},fun_arity=0,fun_priority=NoPrio,fun_body=NoBody,fun_type=No,fun_pos=NoPos, fun_kind=FK_DefOrImpUnknown,fun_lifted=0,fun_info = {fi_calls=[],fi_group_index=0,fi_def_level=NotALevel,fi_free_vars=[],fi_local_vars=[],fi_dynamics=[],fi_properties=0}} = {createArray (size fun_defs+n_new_elements) dummy_fun_def & [i]=fun_defs.[i] \\ i<-[0..size fun_defs-1]} - (array_first_instance_indices,fun_defs, predef_symbols, type_heaps) = convert_array_instances si_array_instances common_defs fun_defs predef_symbols type_heaps - (list_first_instance_indices,fun_defs, predef_symbols, type_heaps) = convert_list_instances si_list_instances PD_UListClass common_defs fun_defs predef_symbols type_heaps - (tail_strict_list_first_instance_indices,fun_defs, predef_symbols, type_heaps) = convert_list_instances si_tail_strict_list_instances PD_UTSListClass common_defs fun_defs predef_symbols type_heaps + (array_first_instance_indices,fun_defs, predef_symbols, type_heaps, error) + = convert_array_instances si_array_instances common_defs fun_defs predef_symbols type_heaps error + (list_first_instance_indices,fun_defs, predef_symbols, type_heaps, error) + = convert_list_instances si_list_instances PD_UListClass common_defs fun_defs predef_symbols type_heaps error + (tail_strict_list_first_instance_indices,fun_defs, predef_symbols, type_heaps, error) + = convert_list_instances si_tail_strict_list_instances PD_UTSListClass common_defs fun_defs predef_symbols type_heaps error type_code_instances = {createArray si_next_TC_member_index GTT_Function & [gtci_index] = gtci_type \\ {gtci_index, gtci_type} <- si_TC_instances} array_first_instance_indices = first_instance_indices si_array_instances - = (array_first_instance_indices,list_first_instance_indices,tail_strict_list_first_instance_indices,fun_defs,type_code_instances,predef_symbols,type_heaps) + = (array_first_instance_indices,list_first_instance_indices,tail_strict_list_first_instance_indices,fun_defs,type_code_instances,predef_symbols,type_heaps,error) where - convert_array_instances array_instances common_defs fun_defs predef_symbols type_heaps + convert_array_instances array_instances common_defs fun_defs predef_symbols type_heaps error | isEmpty array_instances - = ([],fun_defs, predef_symbols, type_heaps) + = ([],fun_defs, predef_symbols, type_heaps, error) # ({pds_ident,pds_module,pds_def},predef_symbols) = predef_symbols![PD_UnboxedArrayType] unboxed_array_type = TA (MakeTypeSymbIdent { glob_object = pds_def, glob_module = pds_module } pds_ident 0) [] ({pds_module,pds_def},predef_symbols) = predef_symbols![PD_ArrayClass] {class_members} = common_defs.[pds_module].com_class_defs.[pds_def] array_members = common_defs.[pds_module].com_member_defs (offset_table, _, predef_symbols) = arrayFunOffsetToPD_IndexTable array_members predef_symbols - (fun_defs, type_heaps) = foldSt (convert_array_instance class_members array_members unboxed_array_type offset_table) array_instances (fun_defs, type_heaps) + (fun_defs, type_heaps, error) = foldSt (convert_array_instance class_members array_members unboxed_array_type offset_table) array_instances (fun_defs, type_heaps, error) array_first_instance_indices = first_instance_indices array_instances - = (array_first_instance_indices,fun_defs, predef_symbols, type_heaps) + = (array_first_instance_indices,fun_defs, predef_symbols, type_heaps, error) where - convert_array_instance class_members array_members unboxed_array_type offset_table {ai_record,ai_members} funs_and_heaps - = create_instance_types class_members array_members unboxed_array_type offset_table (TA ai_record []) (size class_members) funs_and_heaps + convert_array_instance class_members array_members unboxed_array_type offset_table {ai_record,ai_members} funs_heaps_and_error + = create_instance_types class_members array_members unboxed_array_type offset_table (TA ai_record []) (size class_members) funs_heaps_and_error where first_instance_index=ai_members.[0].ds_index - create_instance_types :: {#DefinedSymbol} {#MemberDef} Type {#Int} Type !Int !*(*{#FunDef},*TypeHeaps) -> (!*{#FunDef},!*TypeHeaps); - create_instance_types members array_members unboxed_array_type offset_table record_type member_index funs_and_heaps + create_instance_types :: {#DefinedSymbol} {#MemberDef} Type {#Int} Type !Int !(!*{#FunDef}, !*TypeHeaps, !*ErrorAdmin) + -> (!*{#FunDef}, !*TypeHeaps, !*ErrorAdmin); + create_instance_types members array_members unboxed_array_type offset_table record_type member_index funs_heaps_and_error | member_index == 0 - = funs_and_heaps + = funs_heaps_and_error # member_index = dec member_index - funs_and_heaps = create_instance_type members array_members unboxed_array_type offset_table record_type member_index funs_and_heaps - = create_instance_types members array_members unboxed_array_type offset_table record_type member_index funs_and_heaps + funs_heaps_and_error = create_instance_type members array_members unboxed_array_type offset_table record_type member_index funs_heaps_and_error + = create_instance_types members array_members unboxed_array_type offset_table record_type member_index funs_heaps_and_error - create_instance_type members array_members unboxed_array_type offset_table record_type member_index (fun_defs, type_heaps) + create_instance_type members array_members unboxed_array_type offset_table record_type member_index (fun_defs, type_heaps, error) # {me_type,me_symb,me_class_vars,me_pos} = array_members.[members.[member_index].ds_index] - (instance_type, _, type_heaps, _, _) = determineTypeOfMemberInstance me_type me_class_vars {it_vars = [], it_attr_vars = [], it_context = [], - it_types = [unboxed_array_type, record_type]} SP_None type_heaps No No + (instance_type, _, type_heaps, _, error) = determineTypeOfMemberInstance me_type me_class_vars {it_vars = [], it_attr_vars = [], it_context = [], + it_types = [unboxed_array_type, record_type]} SP_None type_heaps No error instance_type = makeElemTypeOfArrayFunctionStrict instance_type member_index offset_table fun_index = first_instance_index+member_index fun = @@ -2419,35 +2423,36 @@ where , fun_lifted = 0 , fun_info = EmptyFunInfo } - = ({fun_defs & [fun_index]=fun},type_heaps) + = ({fun_defs & [fun_index]=fun}, type_heaps, error) - convert_list_instances list_instances predef_list_class_index common_defs fun_defs predef_symbols type_heaps + convert_list_instances list_instances predef_list_class_index common_defs fun_defs predef_symbols type_heaps error | isEmpty list_instances - = ([],fun_defs, predef_symbols, type_heaps) + = ([],fun_defs, predef_symbols, type_heaps, error) # ({pds_module,pds_def},predef_symbols) = predef_symbols![predef_list_class_index] {class_members} = common_defs.[pds_module].com_class_defs.[pds_def] list_members = common_defs.[pds_module].com_member_defs - (fun_defs, type_heaps) = foldSt (convert_list_instance class_members list_members) list_instances (fun_defs, type_heaps) + (fun_defs, type_heaps, error) = foldSt (convert_list_instance class_members list_members) list_instances (fun_defs, type_heaps, error) list_first_instance_indices = first_instance_indices list_instances - = (list_first_instance_indices,fun_defs, predef_symbols, type_heaps) + = (list_first_instance_indices,fun_defs, predef_symbols, type_heaps, error) where - convert_list_instance class_members list_members {ai_record,ai_members} funs_and_heaps - = create_instance_types class_members list_members (TA ai_record []) (size class_members) funs_and_heaps + convert_list_instance class_members list_members {ai_record,ai_members} funs_heaps_and_error + = create_instance_types class_members list_members (TA ai_record []) (size class_members) funs_heaps_and_error where first_instance_index=ai_members.[0].ds_index - create_instance_types :: {#DefinedSymbol} {#MemberDef} Type !Int !*(*{#FunDef},*TypeHeaps) -> (!*{#FunDef},!*TypeHeaps); - create_instance_types members list_members record_type member_index funs_and_heaps + create_instance_types :: {#DefinedSymbol} {#MemberDef} Type !Int !(!*{#FunDef}, !*TypeHeaps, !*ErrorAdmin) + -> (!*{#FunDef}, !*TypeHeaps, !*ErrorAdmin) + create_instance_types members list_members record_type member_index funs_heaps_and_error | member_index == 0 - = funs_and_heaps + = funs_heaps_and_error # member_index = dec member_index - funs_and_heaps = create_instance_type members list_members record_type member_index funs_and_heaps - = create_instance_types members list_members record_type member_index funs_and_heaps + funs_heaps_and_error = create_instance_type members list_members record_type member_index funs_heaps_and_error + = create_instance_types members list_members record_type member_index funs_heaps_and_error - create_instance_type members list_members record_type member_index (fun_defs, type_heaps) + create_instance_type members list_members record_type member_index (fun_defs, type_heaps, error) # {me_type,me_symb,me_class_vars,me_pos} = list_members.[members.[member_index].ds_index] - (instance_type, _, type_heaps, _, _) = determineTypeOfMemberInstance me_type me_class_vars {it_vars = [], it_attr_vars = [], it_context = [], - it_types = [record_type]} SP_None type_heaps No No + (instance_type, _, type_heaps, _, error) = determineTypeOfMemberInstance me_type me_class_vars {it_vars = [], it_attr_vars = [], it_context = [], + it_types = [record_type]} SP_None type_heaps No error fun_index = first_instance_index+member_index fun = { fun_symb = me_symb @@ -2460,7 +2465,7 @@ where , fun_lifted = 0 , fun_info = EmptyFunInfo } - = ({fun_defs & [fun_index]=fun},type_heaps) + = ({fun_defs & [fun_index]=fun}, type_heaps, error) first_instance_indices instances = [ai_members.[0].ds_index \\ {ai_members}<-instances] |