Skip to content
  • Julian Seward's avatar
    [project @ 1999-12-16 16:34:40 by sewardj] · 0c97d649
    Julian Seward authored
    Further major improvements in interface processing, mostly in the
    handling of types.
    
    Interfaces can contain references to unboxed types, and these need to
    be handled carefully.  The following is a summary of how the interface
    loader now works.  It is applied to groups of interfaces simultaneously,
    viz, the entire Prelude at once:
    
    1.  Throw away any entity not mentioned in the export lists.
    
    2.  Delete type (not data or newtype) definitions which refer to
        unknown types in their right hand sides.  Because Hugs doesn't
        know of any unboxed types, this has the side effect of removing
        all type defns referring to unboxed types.  Repeat step 2 until
        a fixed point is reached.
    
    3.  Make abstract all data/newtype defns which refer to an unknown
        type.  eg, data Word = MkW Word# becomes data Word, because
        Word# is unknown.  Hugs is happy to know about abstract boxed
        Words, but not about Word#s.
    
    4.  Step 2 could delete types referred to by values, instances and
        classes.  So filter all entities, and delete those referring to
        unknown types _or_ classes.  This could cause other entities
        to become invalid, so iterate step 4 to a fixed point.
    
        After step 4, the interfaces no longer contain anything
        unpalatable to Hugs.
    
    5.  Steps 1-4 operate purely on the iface syntax trees.  We now start
        creating symbol table entries.  First, create a module table
        entry for each interface, and locate and read in the corresponding
        object file.
    
    6.  Traverse all interfaces.  For each entity, create an entry in
        the name, tycon, class or instance table, and fill in relevant
        fields, but do not attempt to link tycon/class/instance/name uses
        to their symbol table entries.
    
    7.  Revisit all symbol table entries created in step 6.  We should
        now be able to replace all references to tycons/classes/instances/
        names with the relevant symbol table entries.
    
    8.  Traverse all interfaces.  For each iface, examine the export lists
        and use it to build export lists in the module table.  Do the
        implicit 'import Prelude' thing if necessary.  Finally, resolve
        references in the object code for this module.
    
    I'm sure the number of passes could be reduced.  For the moment,
    understandability is of much higher priority.
    
    Hugs can now complete stages 1 through 8 for the whole GHC Prelude,
    excepting doing the object linking, which needs further work.
    0c97d649