implementation module checksupport import StdEnv, compare_constructor import syntax, predef, containers import utilities from check import checkFunctions import RWSDebug :: VarHeap :== Heap VarInfo CS_NotChecked :== -1 NotFound :== -1 cModuleScope :== 0 cGlobalScope :== 1 cIsNotADclModule :== False cIsADclModule :== True cNeedStdArray :== 1 cNeedStdEnum :== 2 cNeedStdDynamics:== 4 :: Heaps = { hp_var_heap ::!.VarHeap , hp_expression_heap ::!.ExpressionHeap , hp_type_heaps ::!.TypeHeaps } :: ErrorAdmin = { ea_file :: !.File, ea_loc :: ![IdentPos], ea_ok :: !Bool } :: CheckState = { cs_symbol_table :: !.SymbolTable, cs_predef_symbols :: !.PredefinedSymbols, cs_error :: !.ErrorAdmin, cs_x :: !CheckStateX } :: CheckStateX = {x_needed_modules :: !BITVECT,x_main_dcl_module_n :: !Int } :: ConversionTable :== {# .{# Int }} cTypeDefs :== 0 cConstructorDefs :== 1 cSelectorDefs :== 2 cClassDefs :== 3 cMemberDefs :== 4 cInstanceDefs :== 5 cFunctionDefs :== 6 cMacroDefs :== 7 cConversionTableSize :== 8 instance toInt STE_Kind where toInt STE_Type = cTypeDefs toInt STE_Constructor = cConstructorDefs toInt (STE_Field _) = cSelectorDefs toInt STE_Class = cClassDefs toInt STE_Member = cMemberDefs toInt (STE_Instance _) = cInstanceDefs toInt STE_DclFunction = cFunctionDefs toInt (STE_FunctionOrMacro _) = cMacroDefs toInt _ = NoIndex :: CommonDefs = { com_type_defs :: !.{# CheckedTypeDef} , com_cons_defs :: !.{# ConsDef} , com_selector_defs :: !.{# SelectorDef} , com_class_defs :: !.{# ClassDef} , com_member_defs :: !.{# MemberDef} , com_instance_defs :: !.{# ClassInstance} } :: Declarations = { dcls_import ::!{!Declaration} , dcls_local ::![Declaration] , dcls_local_for_import ::!{!Declaration} } :: ExplImpInfos :== {!{!.ExplImpInfo}} :: ExplImpInfo = ExplImpInfo Ident !.DeclaringModulesSet | TemporarilyFetchedAway :: DeclaringModulesSet :== IntKeyHashtable DeclarationInfo :: DeclarationInfo = { di_decl :: !Declaration , di_instances :: ![Declaration] , di_belonging :: !NumberSet } :: IclModule = { icl_name :: !Ident , icl_functions :: !.{# FunDef } , icl_instances :: !IndexRange , icl_specials :: !IndexRange , icl_common :: !.CommonDefs // , icl_declared :: !Declarations , icl_import :: !{!Declaration} , icl_imported_objects :: ![ImportedObject] , icl_used_module_numbers :: !NumberSet } :: DclModule = { dcl_name :: !Ident , dcl_functions :: !{# FunType } , dcl_instances :: !IndexRange , dcl_macros :: !IndexRange , dcl_class_specials :: !IndexRange , dcl_specials :: !IndexRange , dcl_common :: !CommonDefs , dcl_sizes :: !{# Int} , dcl_declared :: !Declarations , dcl_conversions :: !Optional ConversionTable , dcl_is_system :: !Bool , dcl_imported_module_numbers :: !NumberSet } class Erroradmin state // PK... where pushErrorAdmin :: !IdentPos *state -> *state setErrorAdmin :: !IdentPos *state -> *state popErrorAdmin :: *state -> *state instance Erroradmin ErrorAdmin where pushErrorAdmin pos error=:{ea_loc} = { error & ea_loc = [pos : ea_loc] } setErrorAdmin pos error = { error & ea_loc = [pos] } popErrorAdmin error=:{ea_loc = [_:ea_locs]} = { error & ea_loc = ea_locs } instance Erroradmin CheckState where pushErrorAdmin pos cs=:{cs_error} = {cs & cs_error = pushErrorAdmin pos cs_error } setErrorAdmin pos cs=:{cs_error} = {cs & cs_error = setErrorAdmin pos cs_error } popErrorAdmin cs=:{cs_error} = {cs & cs_error = popErrorAdmin cs_error } //...PK newPosition :: !Ident !Position -> IdentPos newPosition id (FunPos file_name line_nr _) = { ip_ident = id, ip_line = line_nr, ip_file = file_name } newPosition id (LinePos file_name line_nr) = { ip_ident = id, ip_line = line_nr, ip_file = file_name } newPosition id (PreDefPos file_name) = { ip_ident = id, ip_line = cNotALineNumber, ip_file = file_name.id_name } newPosition id NoPos = { ip_ident = id, ip_line = cNotALineNumber, ip_file = "???" } checkError :: !a !b !*ErrorAdmin -> *ErrorAdmin | <<< a & <<< b // PK checkError id mess error=:{ea_file,ea_loc=[]} = { error & ea_file = ea_file <<< "Check Error " <<< "\"" <<< id <<< "\" " <<< mess <<< '\n', ea_ok = False } checkError id mess error=:{ea_file,ea_loc} = { error & ea_file = ea_file <<< "Check Error " <<< hd ea_loc <<< ":\"" <<< id <<< "\" " <<< mess <<< '\n', ea_ok = False } checkWarning :: !a !b !*ErrorAdmin -> *ErrorAdmin | <<< a & <<< b // PK checkWarning id mess error=:{ea_file,ea_loc=[]} = { error & ea_file = ea_file <<< "Check Warning " <<< "\"" <<< id <<< "\" " <<< mess <<< '\n' } checkWarning id mess error=:{ea_file,ea_loc} = { error & ea_file = ea_file <<< "Check Warning " <<< hd ea_loc <<< ":\"" <<< id <<< "\" " <<< mess <<< '\n' } checkErrorWithIdentPos :: !IdentPos !a !*ErrorAdmin -> .ErrorAdmin | <<< a; checkErrorWithIdentPos ident_pos mess error=:{ea_file} = { error & ea_file = ea_file <<< "Check Error " <<< ident_pos <<< ":" <<< mess <<< '\n', ea_ok = False } class envLookUp a :: !a !(Env Ident .b) -> (!Bool,.b) instance envLookUp TypeVar where envLookUp var [bind:binds] | var.tv_name == bind.bind_src = (True, bind.bind_dst) = envLookUp var binds envLookUp var [] = (False, abort "illegal value") instance envLookUp AttributeVar where envLookUp var [bind:binds] | var.av_name == bind.bind_src = (True, bind.bind_dst) = envLookUp var binds envLookUp var [] = (False, abort "illegal value") instance envLookUp ATypeVar where envLookUp var=:{atv_variable} [bind:binds] | atv_variable.tv_name == bind.bind_src = (True, bind.bind_dst) = envLookUp var binds envLookUp var [] = (False, abort "illegal value") :: ExpressionInfo = { ef_type_defs :: !.{# CheckedTypeDef} , ef_selector_defs :: !.{# SelectorDef} , ef_cons_defs :: !.{# ConsDef} , ef_member_defs :: !.{# MemberDef} , ef_class_defs :: !.{# ClassDef} , ef_modules :: !.{# DclModule} , ef_is_macro_fun :: !Bool } checkLocalFunctions :: !Index !Level !LocalDefs !*{#FunDef} !*ExpressionInfo !*Heaps !*CheckState -> (!.{#FunDef},!.ExpressionInfo,!.Heaps,!.CheckState); checkLocalFunctions mod_index level (CollectedLocalDefs {loc_functions={ir_from,ir_to}}) fun_defs e_info heaps cs = checkFunctions mod_index level ir_from ir_to fun_defs e_info heaps cs convertIndex :: !Index !Index !(Optional ConversionTable) -> !Index convertIndex index table_index (Yes tables) = tables.[table_index].[index] convertIndex index table_index No = index retrieveGlobalDefinition :: !SymbolTableEntry !STE_Kind !Index -> (!Index, !Index) retrieveGlobalDefinition {ste_kind = STE_Imported kind dcl_index, ste_def_level, ste_index} requ_kind mod_index | kind == requ_kind = (ste_index, dcl_index) = (NotFound, mod_index) retrieveGlobalDefinition {ste_kind,ste_def_level,ste_index} requ_kind mod_index | ste_kind == requ_kind && ste_def_level == cGlobalScope = (ste_index, mod_index) = (NotFound, mod_index) updateExplImpForMarkedSymbol :: !Index Declaration !SymbolTableEntry !u:{#DclModule} !{!{!*ExplImpInfo}} !*SymbolTable -> (!u:{#DclModule}, !{!{!.ExplImpInfo}}, !.SymbolTable) updateExplImpForMarkedSymbol mod_index decl {ste_kind=STE_ExplImpComponentNrs component_numbers inst_indices} dcl_modules expl_imp_infos cs_symbol_table = foldSt (addExplImpInfo mod_index decl inst_indices) component_numbers (dcl_modules, expl_imp_infos, cs_symbol_table) updateExplImpForMarkedSymbol _ decl {ste_kind=STE_Instance class_ident} dcl_modules expl_imp_infos cs_symbol_table // this alternative is only for old syntax (cs_symbol_table argument is not necessary for new syntax) # cs_symbol_table = checkExplImpForInstance decl class_ident cs_symbol_table = (dcl_modules, expl_imp_infos, cs_symbol_table) updateExplImpForMarkedSymbol _ decl {ste_kind=STE_Imported (STE_Instance class_ident) _} dcl_modules expl_imp_infos cs_symbol_table // this alternative is only for old syntax (cs_symbol_table argument is not necessary for new syntax) # cs_symbol_table = checkExplImpForInstance decl class_ident cs_symbol_table = (dcl_modules, expl_imp_infos, cs_symbol_table) updateExplImpForMarkedSymbol _ _ entry dcl_modules expl_imp_infos cs_symbol_table = (dcl_modules, expl_imp_infos, cs_symbol_table) addExplImpInfo :: !Index Declaration ![Declaration] !ComponentNrAndIndex !(!u:{#DclModule}, !{!{!*ExplImpInfo}}, !v:SymbolTable) -> (!u:{#DclModule}, !{!{!.ExplImpInfo}}, !v:SymbolTable) addExplImpInfo mod_index decl instances { cai_component_nr, cai_index } (dcl_modules, expl_imp_infos, cs_symbol_table) # (ExplImpInfo eii_ident eii_declaring_modules, expl_imp_infos) = replaceTwoDimArrElt cai_component_nr cai_index TemporarilyFetchedAway expl_imp_infos (di_belonging, dcl_modules, cs_symbol_table) = get_belonging_symbol_nrs decl dcl_modules cs_symbol_table di = { di_decl = decl, di_instances = instances, di_belonging = di_belonging } new_expl_imp_info = ExplImpInfo eii_ident (ikhInsert` False mod_index di eii_declaring_modules) = (dcl_modules, { expl_imp_infos & [cai_component_nr,cai_index] = new_expl_imp_info }, cs_symbol_table) where get_belonging_symbol_nrs :: !Declaration !{#x:DclModule} !u:(Heap SymbolTableEntry) -> (!.NumberSet,!{#x:DclModule},!u:Heap SymbolTableEntry) get_belonging_symbol_nrs decl dcl_modules cs_symbol_table # (all_belonging_symbols, dcl_modules) = getBelongingSymbols decl dcl_modules nr_of_belongs = nrOfBelongingSymbols all_belonging_symbols (_, belonging_bitvect, cs_symbol_table) = foldlBelongingSymbols set_bit all_belonging_symbols (0, bitvectCreate nr_of_belongs, cs_symbol_table) = (bitvectToNumberSet belonging_bitvect, dcl_modules, cs_symbol_table) set_bit {id_info} (bit_nr, bitvect, cs_symbol_table) # ({ste_kind}, cs_symbol_table) = readPtr id_info cs_symbol_table = ( bit_nr+1 , case ste_kind of STE_Empty -> bitvect _ -> bitvectSet bit_nr bitvect , cs_symbol_table ) getBelongingSymbols :: !Declaration !{#x:DclModule} -> (!.BelongingSymbols, !{#x:DclModule}) getBelongingSymbols {dcl_kind=STE_Imported STE_Type def_mod_index, dcl_index} dcl_modules # ({td_rhs}, dcl_modules) = dcl_modules![def_mod_index].dcl_common.com_type_defs.[dcl_index] = case td_rhs of AlgType constructors -> (BS_Constructors constructors, dcl_modules) RecordType {rt_fields} -> (BS_Fields rt_fields, dcl_modules) _ -> (BS_Nothing, dcl_modules) getBelongingSymbols {dcl_kind=STE_Imported STE_Class def_mod_index, dcl_index} dcl_modules # ({class_members}, dcl_modules) = dcl_modules![def_mod_index].dcl_common.com_class_defs.[dcl_index] = (BS_Members class_members, dcl_modules) getBelongingSymbols _ dcl_modules = (BS_Nothing, dcl_modules) nrOfBelongingSymbols :: !BelongingSymbols -> Int nrOfBelongingSymbols (BS_Constructors constructors) = length constructors nrOfBelongingSymbols (BS_Fields fields) = size fields nrOfBelongingSymbols (BS_Members members) = size members nrOfBelongingSymbols BS_Nothing = 0 :: BelongingSymbols = BS_Constructors ![DefinedSymbol] | BS_Fields !{#FieldSymbol} | BS_Members !{#DefinedSymbol} | BS_Nothing foldlBelongingSymbols f bs st :== case bs of BS_Constructors constructors -> foldSt (\{ds_ident} st -> f ds_ident st) constructors st BS_Fields fields -> foldlArraySt (\{fs_name} st -> f fs_name st) fields st BS_Members members -> foldlArraySt (\{ds_ident} st -> f ds_ident st) members st BS_Nothing -> st checkExplImpForInstance decl class_ident cs_symbol_table // this function is only for old syntax | switch_import_syntax False True = cs_symbol_table # (class_ste, cs_symbol_table) = readPtr class_ident.id_info cs_symbol_table = case class_ste.ste_kind of STE_ExplImpComponentNrs component_numbers inst_indices_accu -> writePtr class_ident.id_info { class_ste & ste_kind = STE_ExplImpComponentNrs component_numbers [decl:inst_indices_accu]} cs_symbol_table _ -> cs_symbol_table removeImportsAndLocalsOfModuleFromSymbolTable :: !Declarations !*(Heap SymbolTableEntry) -> .Heap SymbolTableEntry removeImportsAndLocalsOfModuleFromSymbolTable {dcls_import,dcls_local} symbol_table # symbol_table = remove_declared_symbols_in_array 0 dcls_import symbol_table = remove_declared_symbols dcls_local symbol_table where remove_declared_symbols :: ![Declaration] !*SymbolTable -> !*SymbolTable remove_declared_symbols [symbol=:{dcl_ident={id_info},dcl_index}:symbols] symbol_table #! entry = sreadPtr id_info symbol_table # {ste_kind,ste_def_level} = entry | ste_kind == STE_Empty || ste_def_level > cModuleScope = remove_declared_symbols symbols symbol_table # symbol_table = symbol_table <:= (id_info, entry.ste_previous) = case ste_kind of STE_Field selector_id -> remove_declared_symbols symbols (removeFieldFromSelectorDefinition selector_id NoIndex dcl_index symbol_table) STE_Imported (STE_Field selector_id) def_mod -> remove_declared_symbols symbols (removeFieldFromSelectorDefinition selector_id def_mod dcl_index symbol_table) _ -> remove_declared_symbols symbols symbol_table remove_declared_symbols [] symbol_table = symbol_table remove_declared_symbols_in_array :: !Int !{!Declaration} !*SymbolTable -> !*SymbolTable remove_declared_symbols_in_array symbol_index symbols symbol_table | symbol_index cModuleScope = remove_declared_symbols_in_array (symbol_index+1) symbols symbol_table # symbol_table = symbol_table <:= (id_info, entry.ste_previous) = case ste_kind of STE_Field selector_id #! dcl_index = symbols.[symbol_index].dcl_index -> remove_declared_symbols_in_array (symbol_index+1) symbols (removeFieldFromSelectorDefinition selector_id NoIndex dcl_index symbol_table) STE_Imported (STE_Field selector_id) def_mod #! dcl_index = symbols.[symbol_index].dcl_index -> remove_declared_symbols_in_array (symbol_index+1) symbols (removeFieldFromSelectorDefinition selector_id def_mod dcl_index symbol_table) _ -> remove_declared_symbols_in_array (symbol_index+1) symbols symbol_table = symbol_table addLocalFunctionDefsToSymbolTable :: !Level !Index !Index !Bool !*{#FunDef} !*SymbolTable !*ErrorAdmin -> (!*{# FunDef}, !*SymbolTable, !*ErrorAdmin) addLocalFunctionDefsToSymbolTable level from_index to_index is_macro_fun fun_defs symbol_table error | from_index == to_index = (fun_defs, symbol_table, error) # (fun_def, fun_defs) = fun_defs![from_index] # (symbol_table, error) = addDefToSymbolTable level from_index fun_def.fun_symb (STE_FunctionOrMacro []) symbol_table error | is_macro_fun # fun_defs = {fun_defs & [from_index].fun_info.fi_is_macro_fun=is_macro_fun} = addLocalFunctionDefsToSymbolTable level (inc from_index) to_index is_macro_fun fun_defs symbol_table error = addLocalFunctionDefsToSymbolTable level (inc from_index) to_index is_macro_fun fun_defs symbol_table error NewEntry symbol_table symb_ptr def_kind def_index level previous :== symbol_table <:= (symb_ptr,{ ste_kind = def_kind, ste_index = def_index, ste_def_level = level, ste_previous = previous }) addDefToSymbolTable :: !Level !Index !Ident !STE_Kind !*SymbolTable !*ErrorAdmin -> (!* SymbolTable, !*ErrorAdmin) addDefToSymbolTable level def_index def_ident=:{id_info} def_kind symbol_table error #! entry = sreadPtr id_info symbol_table | entry.ste_kind == STE_Empty || entry.ste_def_level <> level # entry = {ste_index = def_index, ste_kind = def_kind, ste_def_level = level, ste_previous = entry } = (symbol_table <:= (id_info,entry), error) = (symbol_table, checkError def_ident " already defined" error) addDeclaredSymbolsToSymbolTable2 :: .Bool .Int !{!Declaration} !{!Declaration} !*CheckState -> .CheckState; addDeclaredSymbolsToSymbolTable2 is_dcl_mod ste_index locals imported cs # cs=add_imports_in_array_to_symbol_table 0 is_dcl_mod imported cs = addLocalSymbolsForImportToSymbolTable 0 locals ste_index cs add_imports_in_array_to_symbol_table symbol_index is_dcl_mod symbols cs=:{cs_x} | symbol_index cs_x.x_main_dcl_module_n #! dcl_index= symbols.[symbol_index].dcl_index -> add_imports_in_array_to_symbol_table (symbol_index+1) is_dcl_mod symbols (addIndirectlyImportedSymbolOld dcl_ident dcl_pos dcl_kind def_kind dcl_index def_mod cs) -> add_imports_in_array_to_symbol_table (symbol_index+1) is_dcl_mod symbols cs STE_FunctionOrMacro _ #! dcl_index= symbols.[symbol_index].dcl_index -> add_imports_in_array_to_symbol_table (symbol_index+1) is_dcl_mod symbols (addImportedFunctionOrMacro dcl_ident dcl_index cs) = cs addLocalSymbolsForImportToSymbolTable :: !Int !{!Declaration} Int !*CheckState -> .CheckState; addLocalSymbolsForImportToSymbolTable symbol_index symbols mod_index cs | symbol_index addLocalSymbolsForImportToSymbolTable (symbol_index+1) symbols mod_index (addImportedFunctionOrMacro dcl_ident dcl_index cs) STE_Imported def_kind def_mod -> addLocalSymbolsForImportToSymbolTable (symbol_index+1) symbols mod_index (addIndirectlyImportedSymbolOld dcl_ident dcl_pos dcl_kind def_kind dcl_index mod_index cs) = cs addImportedFunctionOrMacro :: !Ident .Int !*CheckState -> .CheckState; addImportedFunctionOrMacro ident=:{id_info} def_index cs=:{cs_symbol_table} #! entry = sreadPtr id_info cs_symbol_table = case entry.ste_kind of STE_Empty -> { cs & cs_symbol_table = NewEntry cs.cs_symbol_table id_info (STE_FunctionOrMacro []) def_index cModuleScope entry} STE_FunctionOrMacro _ | entry.ste_index == def_index -> cs _ -> { cs & cs_error = checkError ident " multiply imported" cs.cs_error} addFieldToSelectorDefinition :: !Ident (Global .Int) !*CheckState -> .CheckState; addFieldToSelectorDefinition {id_info} glob_field_index cs=:{cs_symbol_table} # (entry, cs_symbol_table) = readPtr id_info cs_symbol_table cs = { cs & cs_symbol_table = cs_symbol_table } = case entry.ste_kind of STE_Selector selector_list -> { cs & cs_symbol_table = cs.cs_symbol_table <:= (id_info, { entry & ste_kind = STE_Selector [ glob_field_index : selector_list ] })} _ -> { cs & cs_symbol_table = NewEntry cs.cs_symbol_table id_info (STE_Selector [glob_field_index]) NoIndex cModuleScope entry } addIndirectlyImportedSymbolOld :: !Ident !Position !STE_Kind !STE_Kind !.Int !.Int !*CheckState -> .CheckState; addIndirectlyImportedSymbolOld ident pos dcl_kind def_kind def_index def_mod cs=:{cs_symbol_table} # (entry, cs_symbol_table) = readPtr ident.id_info cs_symbol_table = add_indirectly_imported_symbol entry ident pos def_kind def_index def_mod { cs & cs_symbol_table = cs_symbol_table } where add_indirectly_imported_symbol /*entry=:*/{ste_kind = STE_Empty} {id_name,id_info} _ def_kind def_index def_mod cs=:{cs_symbol_table} // JVG: read the entry again, because it is boxed # (entry, cs_symbol_table) = readPtr id_info cs_symbol_table # cs = { cs & cs_symbol_table = NewEntry cs_symbol_table id_info dcl_kind def_index cModuleScope entry} = case def_kind of STE_Field selector_id -> addFieldToSelectorDefinition selector_id { glob_module = def_mod, glob_object = def_index } cs _ -> cs add_indirectly_imported_symbol /*entry=:*/{ste_kind = STE_Imported kind mod_index, ste_index} ident=:{id_info} _ def_kind def_index def_mod cs | kind == def_kind && mod_index == def_mod && ste_index == def_index = cs add_indirectly_imported_symbol entry ident pos def_kind def_index def_mod cs=:{cs_error} = { cs & cs_error = checkErrorWithIdentPos (newPosition ident pos) " multiply imported" cs_error} mw_addIndirectlyImportedSymbol :: !(Optional a) !Ident !Position !STE_Kind !STE_Kind !.Int !.Int !Int !*CheckState -> (!Bool, !.CheckState) mw_addIndirectlyImportedSymbol yes_for_icl_module ident pos dcl_kind def_kind def_index def_mod importing_mod cs=:{cs_symbol_table} # (entry, cs_symbol_table) = readPtr ident.id_info cs_symbol_table = add_indirectly_imported_symbol yes_for_icl_module entry ident pos def_kind def_index def_mod importing_mod { cs & cs_symbol_table = cs_symbol_table } where add_indirectly_imported_symbol _ {ste_kind = STE_Empty} {id_info} _ def_kind def_index def_mod _ cs=:{cs_symbol_table} # (entry, cs_symbol_table) = readPtr id_info cs_symbol_table cs = { cs & cs_symbol_table = NewEntry cs_symbol_table id_info dcl_kind def_index cModuleScope entry} = case def_kind of STE_Field selector_id -> (True, addFieldToSelectorDefinition selector_id { glob_module = def_mod, glob_object = def_index } cs) _ -> (True, cs) add_indirectly_imported_symbol _ {ste_kind = STE_Imported kind mod_index, ste_index} _ _ def_kind def_index def_mod _ cs | kind == def_kind && mod_index == def_mod && ste_index == def_index = (False, cs) add_indirectly_imported_symbol (Yes _) _ _ _ def_kind def_index def_mod _ cs | def_mod == cs.cs_x.x_main_dcl_module_n // an icl module imports one of it's definitions from the dcl module = (False, cs) add_indirectly_imported_symbol _ _ _ _ def_kind def_index def_mod importing_mod cs | importing_mod==def_mod // a dcl module imports a definition from itself (cycle) = (False, cs) add_indirectly_imported_symbol _ entry ident pos def_kind def_index def_mod _ cs=:{cs_error} = (False, { cs & cs_error = checkError ident "multiply defined" cs_error}) addGlobalDefinitionsToSymbolTable :: ![Declaration] !*CheckState -> .CheckState; addGlobalDefinitionsToSymbolTable decls cs = foldSt add_global_definition decls cs where add_global_definition {dcl_ident=ident=:{id_info},dcl_pos,dcl_kind,dcl_index} cs=:{cs_symbol_table} #! entry = sreadPtr id_info cs_symbol_table | entry.ste_def_level < cGlobalScope # cs = { cs & cs_symbol_table = NewEntry cs_symbol_table id_info dcl_kind dcl_index cGlobalScope entry } = case dcl_kind of STE_Field selector_id -> addFieldToSelectorDefinition selector_id { glob_module = NoIndex, glob_object = dcl_index } cs _ -> cs = { cs & cs_error = checkErrorWithIdentPos (newPosition ident dcl_pos) " multiply defined" cs.cs_error} removeFieldFromSelectorDefinition :: !Ident .Int .Int !*(Heap SymbolTableEntry) -> .Heap SymbolTableEntry; removeFieldFromSelectorDefinition {id_info} field_mod field_index symbol_table # (entry, symbol_table) = readPtr id_info symbol_table = case entry.ste_kind of STE_Selector selector_list -> symbol_table <:= (id_info, { entry & ste_kind = STE_Selector (remove_field field_mod field_index selector_list) }) _ -> symbol_table where remove_field field_mod field_index [field=:{glob_module, glob_object} : fields] | field_mod == glob_module && field_index == glob_object = fields = [field : remove_field field_mod field_index fields] remove_field field_mod field_index [] = [] removeDeclarationsFromSymbolTable :: ![Declaration] !Int !*SymbolTable -> *SymbolTable removeDeclarationsFromSymbolTable decls scope symbol_table = unsafeFold2St (remove_declaration scope) decls [1..] symbol_table where remove_declaration scope decl=:{dcl_ident={id_info}, dcl_index} decl_nr symbol_table # ({ste_kind,ste_previous}, symbol_table) = readPtr id_info symbol_table = case ste_kind of STE_Field field_id # symbol_table = removeFieldFromSelectorDefinition field_id NoIndex dcl_index symbol_table | ste_previous.ste_def_level == scope -> symbol_table <:= (id_info, ste_previous.ste_previous) -> symbol_table <:= (id_info, ste_previous) STE_Empty -> symbol_table _ | ste_previous.ste_def_level == scope -> symbol_table <:= (id_info, ste_previous.ste_previous) -> symbol_table <:= (id_info, ste_previous) removeLocalIdentsFromSymbolTable :: .Int !.[Ident] !*(Heap SymbolTableEntry) -> .Heap SymbolTableEntry; removeLocalIdentsFromSymbolTable level idents symbol_table = foldSt (removeIdentFromSymbolTable level) idents symbol_table removeIdentFromSymbolTable :: !.Int !Ident !*(Heap SymbolTableEntry) -> .Heap SymbolTableEntry; removeIdentFromSymbolTable level {id_name,id_info} symbol_table #! {ste_previous,ste_def_level} = sreadPtr id_info symbol_table | level <= ste_def_level = symbol_table <:= (id_info,ste_previous) // ---> ("removeIdentFromSymbolTable", id_name) = symbol_table // ---> ("NO removeIdentFromSymbolTable", id_name) removeLocalsFromSymbolTable :: !Level ![Ident] !LocalDefs !u:{# FunDef} !*(Heap SymbolTableEntry) -> (!u:{# FunDef}, !.Heap SymbolTableEntry) removeLocalsFromSymbolTable level loc_vars (CollectedLocalDefs {loc_functions={ir_from,ir_to}}) defs symbol_table = remove_defs_from_symbol_table level ir_from ir_to defs (removeLocalIdentsFromSymbolTable level loc_vars symbol_table) where remove_defs_from_symbol_table level from_index to_index defs symbol_table | from_index == to_index = (defs, symbol_table) #! def = defs.[from_index] id_info = (toIdent def).id_info entry = sreadPtr id_info symbol_table | level == entry.ste_def_level = remove_defs_from_symbol_table level (inc from_index) to_index defs (symbol_table <:= (id_info, entry.ste_previous)) = remove_defs_from_symbol_table level (inc from_index) to_index defs symbol_table newFreeVariable :: !FreeVar ![FreeVar] ->(!Bool, ![FreeVar]) newFreeVariable new_var vars=:[free_var=:{fv_def_level,fv_info_ptr}: free_vars] | new_var.fv_def_level > fv_def_level = (True, [new_var : vars]) | new_var.fv_def_level == fv_def_level | new_var.fv_info_ptr == fv_info_ptr = (False, vars) #! (free_var_added, free_vars) = newFreeVariable new_var free_vars = (free_var_added, [free_var : free_vars]) #! (free_var_added, free_vars) = newFreeVariable new_var free_vars = (free_var_added, [free_var : free_vars]) newFreeVariable new_var [] = (True, [new_var]) local_declaration_for_import :: !u:Declaration .Index -> v:Declaration, [u <= v] local_declaration_for_import decl=:{dcl_kind=STE_FunctionOrMacro _} module_n = decl local_declaration_for_import decl=:{dcl_kind=STE_Imported _ _} module_n = abort "local_declaration_for_import" local_declaration_for_import decl=:{dcl_kind} module_n = {decl & dcl_kind = STE_Imported dcl_kind module_n} get_ident :: !ImportDeclaration -> Ident get_ident (ID_Function {ii_ident}) = ii_ident get_ident (ID_Class {ii_ident} _) = ii_ident get_ident (ID_Type {ii_ident} _) = ii_ident get_ident (ID_Record {ii_ident} _) = ii_ident get_ident (ID_Instance class_ident instance_ident _) = instance_ident getBelongingSymbolsFromID :: !ImportDeclaration -> Optional [ImportedIdent] getBelongingSymbolsFromID (ID_Class _ x) = x getBelongingSymbolsFromID (ID_Type _ x) = x getBelongingSymbolsFromID (ID_Record _ x) = x getBelongingSymbolsFromID _ = No class toIdent a :: !a -> Ident instance toIdent SymbIdent where toIdent symb = symb.symb_name instance toIdent TypeSymbIdent where toIdent type_symb = type_symb.type_name instance toIdent BoundVar where toIdent var = var.var_name instance toIdent TypeVar where toIdent tvar = tvar.tv_name instance toIdent ATypeVar where toIdent {atv_variable} = atv_variable.tv_name instance toIdent Ident where toIdent id = id instance toIdent ConsDef where toIdent cons = cons.cons_symb instance toIdent (TypeDef a) where toIdent td = td.td_name instance toIdent ClassDef where toIdent cl = cl.class_name instance toIdent MemberDef where toIdent me = me.me_symb instance toIdent FunDef where toIdent fun = fun.fun_symb instance toIdent SelectorDef where toIdent sd = sd.sd_symb /* instance toIdent DeltaRule where toIdent delta = delta.delta_name */ instance toIdent (a,b) | toIdent a where toIdent (x,y) = toIdent x instance == STE_Kind where (==) (STE_FunctionOrMacro _) STE_DclFunction = True (==) STE_DclFunction (STE_FunctionOrMacro _) = True (==) sk1 sk2 = equal_constructor sk1 sk2 instance <<< IdentPos where (<<<) file {ip_file,ip_line,ip_ident} | ip_line == cNotALineNumber = file <<< '[' <<< ip_file <<< ',' <<< ip_ident <<< ']' = file <<< '[' <<< ip_file <<< ',' <<< ip_line <<< ',' <<< ip_ident <<< ']' instance <<< ExplImpInfo where (<<<) file (ExplImpInfo eii_ident eii_declaring_modules) = file <<< eii_ident //<<< " is declared in " <<< eii_declaring_modules instance <<< DeclarationInfo where (<<<) file {di_decl, di_instances} = file <<< di_decl <<< di_instances import_ident :: Ident import_ident =: { id_name = "import", id_info = nilPtr } restoreHeap :: !Ident !*SymbolTable -> .SymbolTable restoreHeap {id_info} cs_symbol_table # ({ste_previous}, cs_symbol_table) = readPtr id_info cs_symbol_table = writePtr id_info ste_previous cs_symbol_table temp_try_a_new_thing_XXX yes no :== no