1. 04 Feb, 2003 6 commits
    • simonpj's avatar
      [project @ 2003-02-04 13:06:41 by simonpj] · e8f681e4
      simonpj authored
      ---------------------------------------------------
      			External Core fix
      	output implicit bindings in correct dependency order
      	---------------------------------------------------
      
      In coreSyn/MkExternalCore, output constructor wrappers before the
      other implicit bindings, because the latter may use the former.
      
      Thanks to Tobias Gedell for this one.
      e8f681e4
    • simonpj's avatar
      [project @ 2003-02-04 12:40:00 by simonpj] · 74775c6b
      simonpj authored
      Make utils/genprimopcode recognise the type ().
          It was previously written 'Unit', which is easily
          confused with the type 'Unit' (used for generic
          derived instances).
      74775c6b
    • simonpj's avatar
      [project @ 2003-02-04 12:33:05 by simonpj] · e6d00492
      simonpj authored
      ---------------------------------------------------
      	Template-Haskell fix to make the global environment
      		      more side-effect-ful
      	---------------------------------------------------
      
      Consider
      
      	f = $(...foldl...) $(...foldl...)
      
      The first splice sucks in the type sig for foldl, which the second
      splice needs.  That means that the second splice is going to have to
      consult the persistent compiler state to see the effect of imports
      by the first one.
      
      We used to cache the global type environment in the TcGblEnv, but
      this commit switches to the obvious thing: consult the persistent
      state on every global lookup.  After all, reading a MutVar is no
      big deal; and it's a benign, ever-growing cache of type signatures,
      so the side effect is fine.
      
      On the way I tidied up the knot-tying in TcIfaceSig a bit more.
      Previously, I think the setUnfoldingInfo was being strict in the
      unfolding, which forced it to be type-checked.  Now it's lazy.
      That could mean a lot less typechecking overall, for things whose
      unfolding isn't looked at.  I hope I havn't broken it, though.
      e6d00492
    • simonpj's avatar
      [project @ 2003-02-04 12:28:22 by simonpj] · 115f0fae
      simonpj authored
      ---------------------------------------------------
      	Important fix to the handling of class methods that
      	      mention their own class type variable
      	---------------------------------------------------
      
      [NB: I'm not 100% certain that this commit is independent of the
           Template-Haskell-related commit I'm doing at the same time.
           I've tried to separate them but may not have succeeded totally.]
      
      This bug gives utterly bogus (detected by Core Lint) programs.
      Isaac Jones discovered it.  Here's an example, now enshrined as tc165.
      
          class C a where
      	f :: (Eq a) => a
      
          instance C () where
      	f = f
      
      The instance decl was translated as
      
          dfC() = MkC (let f = \dEq -> f in f)
      
      which is utterly wrong.  Reason: the 'f' on the left was being treated
      as an available Inst, but it doesn't obey INVARIANT 2 for Insts, which
      is that they are applied to all their dictionaries.  (See the data type
      decl for Inst.)
      
      Solution: don't include such class methods in the available Insts.
      115f0fae
    • simonpj's avatar
      [project @ 2003-02-04 12:25:21 by simonpj] · 60beff5f
      simonpj authored
      Use nameIsLocalOrFrom instead of open code
      60beff5f
    • simonpj's avatar
      [project @ 2003-02-04 12:23:32 by simonpj] · 23a4e1f0
      simonpj authored
      Add type sig
      23a4e1f0
  2. 03 Feb, 2003 1 commit
  3. 01 Feb, 2003 1 commit
  4. 31 Jan, 2003 1 commit
  5. 30 Jan, 2003 2 commits
    • simonmar's avatar
      [project @ 2003-01-30 10:19:07 by simonmar] · 674e4a46
      simonmar authored
      Quick fix for profiling after I broke it in rev. 1.68.
      
      The profiling system needs some initialisation after module
      registration (hs_add_root()).  Since module registration now happens
      later, the profiling system was getting initialised too early before
      any cost centers had been registered.  This is a quick fix; we still
      can't handle multiple hs_add_root()s with profiling.
      674e4a46
    • simonmar's avatar
      [project @ 2003-01-30 10:06:35 by simonmar] · 858255ab
      simonmar authored
      gcc 2.96 miscompiles LDV_recordDead_FILL_SLOP_DYNAMIC() when DEBUG is
      on, and I think I must have debugged this crash about three times
      already.  So I'm inserting a #error to stop me doing it again.
      858255ab
  6. 29 Jan, 2003 2 commits
    • simonmar's avatar
      [project @ 2003-01-29 10:28:56 by simonmar] · f84bb9a2
      simonmar authored
      Multi-init protection.
      
      Multiple inits now don't crash, but they still don't do anything
      sensible because the finalizers have been run during the first
      hs_exit().
      f84bb9a2
    • simonmar's avatar
      [project @ 2003-01-29 09:54:31 by simonmar] · b1c5d8c6
      simonmar authored
      - re-instate setProgArgv, it is used in System.Environment (bah, could
        have sworn I grepped for it and found nothing...)
      
      - Remove init_stack symbol from the Linker's symbol table; this is
        now static.
      b1c5d8c6
  7. 28 Jan, 2003 8 commits
  8. 27 Jan, 2003 3 commits
  9. 26 Jan, 2003 1 commit
  10. 25 Jan, 2003 1 commit
    • wolfgang's avatar
      [project @ 2003-01-25 15:54:48 by wolfgang] · af136096
      wolfgang authored
      This commit fixes many bugs and limitations in the threaded RTS.
      There are still some issues remaining, though.
      
      The following bugs should have been fixed:
      
      - [+] "safe" calls could cause crashes
      - [+] yieldToReturningWorker/grabReturnCapability
          -     It used to deadlock.
      - [+] couldn't wake blocked workers
          -     Calls into the RTS could go unanswered for a long time, and
                that includes ordinary callbacks in some circumstances.
      - [+] couldn't block on an MVar and expect to be woken up by a signal
            handler
          -     Depending on the exact situation, the RTS shut down or
                blocked forever and ignored the signal.
      - [+] The locking scheme in RtsAPI.c didn't work
      - [+] run_thread label in wrong place (schedule())
      - [+] Deadlock in GHC.Handle
          -     if a signal arrived at the wrong time, an mvar was never
                filled again
      - [+] Signals delivered to the "wrong" thread were ignored or handled
            too late.
      
      Issues:
      *) If GC can move TSO objects (I don't know - can it?), then ghci
      will occasionally crash when calling foreign functions, because the
      parameters are stored on the TSO stack.
      
      *) There is still a race condition lurking in the code
      (both threaded and non-threaded RTS are affected):
      If a signal arrives after the check for pending signals in
      schedule(), but before the call to select() in awaitEvent(),
      select() will be called anyway. The signal handler will be
      executed much later than expected.
      
      *) For Win32, GHC doesn't yet support non-blocking IO, so while a
      thread is waiting for IO, no call-ins can happen. If the RTS is
      blocked in awaitEvent, it uses a polling loop on Win32, so call-ins
      should work (although the polling loop looks ugly).
      
      *) Deadlock detection is disabled for the threaded rts, because I
      don't know how to do it properly in the presence of foreign call-ins
      from foreign threads.
      This causes the tests conc031, conc033 and conc034 to fail.
      
      *) "safe" is currently treated as "threadsafe". Implementing "safe" in
      a way that blocks other Haskell threads is more difficult than was
      thought at first. I think it could be done with a few additional lines
      of code, but personally, I'm strongly in favour of abolishing the
      distinction.
      
      *) Running finalizers at program termination is inefficient - there
      are two OS threads passing messages back and forth for every finalizer
      that is run. Also (just as in the non-threaded case) the finalizers
      are run in parallel to any remaining haskell threads and to any
      foreign call-ins that might still happen.
      af136096
  11. 24 Jan, 2003 4 commits
    • simonmar's avatar
      [project @ 2003-01-24 16:05:57 by simonmar] · be659293
      simonmar authored
      remove setting of $(way_) and $(_way); these are now set in boilerplate.mk
      be659293
    • simonmar's avatar
      [project @ 2003-01-24 14:04:40 by simonmar] · b429adbb
      simonmar authored
      - Generalise seq to allow an unlifted type in its second argument.  This
        works because seq is *always* inlined and replaced by a case.
      
      - Remove getTag, a wired-in Id with an unfolding, with a definition
        in GHC.Base:
      
      	getTag x = x `seq` dataToTag# x
      
        this is why we required the above generalisation to seq (dataToTag#
        returns an Int#).  See the comments in GHC.Base for more details.
      
      - As a side-effect, this fixes a bug in the interpreter, where the
        compiler optimised away the evaluation of the argument to dataToTag#,
        but the interpreter ended up passing it an unevaluated thunk (nullary
        constructors aren't always evaluated in GHCi, but the simplifier
        assumes they are).  Now, in the interpreter, getTag won't be inlined
        so the compiler can't optimise away the evaluation, and we're saved.
      
        The real bug here is either (a) dataToTag# requires an evaluated
        argument or (b) the interpreter doesn't supply it with one, take your
        pick.
      b429adbb
    • simonmar's avatar
      [project @ 2003-01-24 13:56:45 by simonmar] · 519c3db4
      simonmar authored
      - Reverse the code for workers and wrappers for nullary constructors.
        For some reason it was the wrong way around, but the effects were
        harmless since they both evaluate to the same thing.
      
      - When passing a nullary constructor as an argument, we should pass
        the name of the worker rather than the wrapper.  Again, this is
        mostly harmless, but it enables some small simplification in
        pushAtom.
      
      - Rearrange/cleanup pushAtom.
      519c3db4
    • simonpj's avatar
      [project @ 2003-01-24 11:26:39 by simonpj] · 9ceeb6e5
      simonpj authored
      Perform 'tidying' on the implicit bindings before emitting
      	External Core.  We were getting silly bindings like
      		\ tpl -> case tpl of tpl -> (tpl,tpl) -> tpl
      
      	Maybe we should add these implicit bindings in CoreTidy,
      	rather than in both MkExternalCore and CorePrep?
      9ceeb6e5
  12. 23 Jan, 2003 10 commits