diff options
Diffstat (limited to 'backendC/CleanCompilerSources/statesgen.c')
-rw-r--r-- | backendC/CleanCompilerSources/statesgen.c | 47 |
1 files changed, 42 insertions, 5 deletions
diff --git a/backendC/CleanCompilerSources/statesgen.c b/backendC/CleanCompilerSources/statesgen.c index d6b9f9b..9b28178 100644 --- a/backendC/CleanCompilerSources/statesgen.c +++ b/backendC/CleanCompilerSources/statesgen.c @@ -1242,10 +1242,14 @@ void ExamineTypesAndLhsOfSymbols (Symbol symbs) PolyList UserDefinedArrayFunctions; +char *current_imported_module; /* also used by instructions.c */ + void ImportSymbols (Symbol symbols) { Symbol symbol; PolyList array_fun; + + current_imported_module = NULL; for_l (array_fun,UserDefinedArrayFunctions,pl_next){ SymbDef fun_def; @@ -1259,14 +1263,20 @@ void ImportSymbols (Symbol symbols) for_l (symbol,symbols,symb_next){ SymbDef sdef; - if (symbol->symb_kind==definition) - sdef=symbol->symb_def; - else + if (symbol->symb_kind!=definition) continue; + sdef=symbol->symb_def; if (sdef->sdef_module!=CurrentModule){ - if (sdef->sdef_isused) + if (sdef->sdef_isused + && sdef->sdef_mark & (SDEF_USED_STRICTLY_MASK | SDEF_USED_LAZILY_MASK | SDEF_USED_CURRIED_MASK) + ){ + if (sdef->sdef_module!=current_imported_module){ + current_imported_module=sdef->sdef_module; + GenImpMod (current_imported_module); + } GenImport (sdef); + } if (sdef->sdef_kind==RECORDTYPE){ FieldList fields; @@ -1276,14 +1286,41 @@ void ImportSymbols (Symbol symbols) field_sdef=fields->fl_symbol->symb_def; - if (field_sdef->sdef_isused) + if (field_sdef->sdef_isused && field_sdef->sdef_mark & SDEF_USED_LAZILY_MASK){ + if (sdef->sdef_module!=current_imported_module){ + current_imported_module=sdef->sdef_module; + GenImpMod (current_imported_module); + } GenImport (field_sdef); + } } } } } } +void import_not_yet_imported_record_r_labels (Symbol symbols) +{ + Symbol symbol; + + for_l (symbol,symbols,symb_next){ + if (symbol->symb_kind==definition){ + SymbDef sdef; + + sdef=symbol->symb_def; + if ((sdef->sdef_mark & (SDEF_USED_STRICTLY_MASK | SDEF_RECORD_R_LABEL_IMPORTED_MASK))==SDEF_USED_STRICTLY_MASK + && sdef->sdef_kind==RECORDTYPE && sdef->sdef_module!=CurrentModule) + { + if (sdef->sdef_module!=current_imported_module){ + current_imported_module=sdef->sdef_module; + GenImpMod (current_imported_module); + } + GenImport (sdef); + } + } + } +} + static Bool ShouldDecrRefCount; #if OPTIMIZE_LAZY_TUPLE_RECURSION |