Tue Nov 25 07:32:01 PST 2008  Thomas Schilling <[EMAIL PROTECTED]>
  * Major clean-up of HscMain.
  
  This patch entails a major restructuring of HscMain and a small bugfix
  to MkIface (which required the restructuring in HscMain).
  
  In MkIface:
  
    - mkIface* no longer outputs orphan warnings directly and also no
      longer quits GHC when -Werror is set.  Instead, errors are
      reported using the common IO (Messages, Maybe result) scheme.
  
  In HscMain:
  
    - Get rid of the 'Comp' monad.  This monad was mostly GhcMonad + two
      reader arguments, a ModSummary for the currently compiled module
      and a possible old interface.  The latter actually lead to a small
      space-leak since only its hash was needed (to check whether the
      newly-generated interface file was the same as the original one).
  
      Functions originally of type 'Comp' now only take the arguments
      that they actually need.  This leads to slighly longer argument
      lists in some places, however, it is now much easier to see what
      is actually going on.
  
    - Get rid of 'myParseModule'.  Rename 'parseFile' to 'hscParse'.
  
    - Join 'deSugarModule' and 'hscDesugar' (keeping the latter).
  
    - Rename 'typecheck{Rename}Module{'}' to 'hscTypecheck{Rename}'.
      One variant keeps the renamed syntax, the other doesn't.
  
    - Parameterise 'HscStatus', so that 'InteractiveStatus' is just a
      different parameterisation of 'HscStatus'.
  
    - 'hscCompile{OneShot,Batch,Nothing,Interactive}' are now
      implemented using a (local) typeclass called 'HsCompiler'.  The
      idea is to make the common structure more obvious.  Using this
      typeclass we now have two functions 'genericHscCompile' (original
      'hscCompiler') and 'genericHscRecompile' (original 'genComp')
      describing the default pipeline.  The methods of the typeclass
      describe a sort of "hook" interface (in OO-terms this would be
      called the "template method" pattern).
  
      One problem with this approach is that we parameterise over the
      /result/ type which, in fact, is not actually different for
      "nothing" and "batch" mode.  To avoid functional dependencies or
      associated types, we use type tags to make them artificially
      different and parameterise the type class over the result type.
      A perhaps better approach might be to use records instead.
      
    - Drop some redundant 'HscEnv' arguments.  These were likely
      different from what 'getSession' would return because during
      compilation we temporarily set the module's DynFlags as well as a
      few other fields.  We now use the 'withTempSession' combinator to
      temporarily change the 'HscEnv' and automatically restore the
      original session after the enclosed action has returned (even in
      case of exceptions).
  
    - Rename 'hscCompile' to 'hscGenHardCode' (since that is what it
      does).
  
  Calls in 'GHC' and 'DriverPipeline' accordingly needed small
  adaptions.

    M ./compiler/iface/MkIface.lhs -12 +10
    M ./compiler/main/DriverPipeline.hs -4 +4
    M ./compiler/main/GHC.hs -37 +29
    M ./compiler/main/HscMain.lhs -361 +317
    M ./compiler/main/HscTypes.lhs -1 +11

View patch online:
http://darcs.haskell.org/ghc/_darcs/patches/20081125153201-7c5c6-e541987394c17b618a25c6e58dc22e12635b352e.gz

_______________________________________________
Cvs-ghc mailing list
Cvs-ghc@haskell.org
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to