FIX #2845: Allow breakpoints on expressions with unlifted type
authorSimon Marlow <marlowsd@gmail.com>
Mon, 20 Apr 2009 14:25:25 +0000 (14:25 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Mon, 20 Apr 2009 14:25:25 +0000 (14:25 +0000)
commit709c9ce0ec4ecaabc1e4ee0f05dbad87fc6aca4d
tree536f32c88f2cdcb6cd60145bd91ed022285cddda
parente562d3a5cefc282213f64f2a3111007ef7987c8b
FIX #2845: Allow breakpoints on expressions with unlifted type

It turns out we can easily support breakpoints on expressions with
unlifted types, by translating

  case tick# of _ -> e

into

  let f = \s . case tick# of _ -> e
  in  f realWorld#

instead of just a plain let-binding.  This is the same trick that GHC
uses for abstracting join points of unlifted type.

In #2845, GHC has eta-expanded the tick expression, changing the
result type from IO a to (# State#, a #), which was the reason the
tick was suddenly being ignored.  By supporting ticks on unlifted
expressions we can make it work again, although some confusion might
arise because _result will no longer be available (it now has
unboxed-tuple type, so we can't bind it in the environment).  The
underlying problem here is that GHC does transformations like
eta-expanding the tick expressions, and there's nothing we can do to
prevent that.
compiler/ghci/ByteCodeGen.lhs
compiler/main/InteractiveEval.hs