cvs commit: hugs98/lib Prelude.hs hugs98/lib/exts Exception.hs ConcBase.hs

Alastair Reid reid@glass.cse.ogi.edu
Sun, 1 Apr 2001 21:51:23 -0700


reid        2001/04/01 21:51:23 PDT

  Modified files:
    lib                  Prelude.hs 
    lib/exts             ConcBase.hs 
  Added files:
    lib/exts             Exception.hs 
  Log:
  Even if the previous commits are bad, things should still work because
  I haven't changed anything in the normal evaluation path.  This set of
  commits had better work though!
  
  Prelude.hs:
  There's now two kinds of exception: IOError and HugsException.
  
  IOErrors are propagated using the normal continuation passing
  mechanisms - exception handlers are chained together on the heap.
  (This stuff is unchanged.  Changing that would require changes to
  greencard and every IO primop in Hugs.)
  
  HugsExceptions are propagated using longjmp, etc.  Exception handlers
  are piled up on the stack.  But, what happens when we have to do a
  context switch (e.g., a call to Concurrency.yield or
  Concurrency.takeMVar)?  We have to remember all the HugsException
  catches so that we can restore them when we switch back to that
  thread.  This is what Hugs_Catch is for - it remembers which exception
  handlers we have to reinstall on the stack when we switch back to the
  thread.
  
  (btw, The type names, constructors, etc. associated with IOResult,
  etc. really ought to be renamed so they have the word "Hugs" or "prim"
  in them for the usual namespace-contamination reasons.)
  
  ConcBase.hs:
  Some minor organisation and layout changes - trying to restore a
  consistent style.
  Also, forkIO has to make sure that every thread contains both an
  IOError handler and HugsException handler.
  
  new file exts/Exceptions.hs:
  A (very) cut-down implementation of GHC's Exception module.
  
  One big difference is that, because IOError handling is handled
  separately from HugsExceptions, we can't readily implement
  
    throw :: Exception -> a
  
  But we can provide
  
    throwIO :: Exception -> IO a
  
  (which I'll try to persuade the GHC people to ask to their
  implementation).
  
  The other big difference is that GHC's Exception datatype has many
  constructors for different kinds of errors.  Implementing this would
  require extensive changes to any primops which can raise exceptions -
  lots of changes.  So, instead, you get a HugsException and you can
  convert it to a string and, if you see fit, try to parse the string.
  
  I didn't add GHC's assertions - so they're left out.  Adding Dynamic
  exceptions looked tricky and didn't seem like a pressing need so I
  left them out.
  
  Revision  Changes    Path
  1.7       +32 -1     hugs98/lib/Prelude.hs
  1.3       +14 -9     hugs98/lib/exts/ConcBase.hs