[GHC] #14461: Reuse free variable lists through nested closures

GHC ghc-devs at haskell.org
Wed Nov 29 20:06:44 UTC 2017


#14461: Reuse free variable lists through nested closures
-------------------------------------+-------------------------------------
        Reporter:  tdammers          |                Owner:  alexbiehl
            Type:  task              |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.2.1
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:  7258              |  Differential Rev(s):
       Wiki Page:  NestedClosures    |
-------------------------------------+-------------------------------------

Comment (by alexbiehl):

 I have hit a problem. Using ticket #7258 as a base line I figured that
 most of the closures we generate during `Read`/`Show` deriving are
 updatable thunks:

 {{{
 let [fv1 fv2 ... fvn] outer = \u []  -- 'u' for updatable
   let [fv1 fv2 ... fvn] inner = \u []
      ...
 }}}

 Applying the NestedClosure idea gets us:

 {{{
 let [fv1 fv2 ... fvn] outer = \u []
   let [outer{fv1 fv2 ... fvn}] inner = \u []
      ...
 }}}

 Now, when forcing `outer` we push an update frame which overwrites
 `outer`s closure to be an indirection to the resulting value hereby
 turning the free variables effectively into garbage. We now have no safe
 way to access `outer`s free variables from `inner`.

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14461#comment:8>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list