• Simon Marlow's avatar
    FIX #2845: Allow breakpoints on expressions with unlifted type · 709c9ce0
    Simon Marlow authored
    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.
    709c9ce0
ByteCodeGen.lhs 55.4 KB