[project @ 1999-12-16 16:34:40 by sewardj]
authorsewardj <unknown>
Thu, 16 Dec 1999 16:34:46 +0000 (16:34 +0000)
committersewardj <unknown>
Thu, 16 Dec 1999 16:34:46 +0000 (16:34 +0000)
commit0c97d6499a6df25503df68181a18507bff234514
tree76a43f2bcf504bf3e1c8311e17941218a9b9665c
parent4c7cb1985eb4bcbbb5e3da46d6b445581da10ec9
[project @ 1999-12-16 16:34:40 by sewardj]
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.
ghc/interpreter/interface.c
ghc/interpreter/link.c
ghc/interpreter/parser.y
ghc/interpreter/storage.c
ghc/interpreter/storage.h
ghc/interpreter/type.c