[commit: ghc] ghc-8.2: Fix #13433 (bdcb0c8)

git at git.haskell.org git at git.haskell.org
Wed Mar 29 23:41:34 UTC 2017


Repository : ssh://git@git.haskell.org/ghc

On branch  : ghc-8.2
Link       : http://ghc.haskell.org/trac/ghc/changeset/bdcb0c8572044f2a93981910bb4ed6e9d65160c0/ghc

>---------------------------------------------------------------

commit bdcb0c8572044f2a93981910bb4ed6e9d65160c0
Author: Simon Marlow <marlowsd at gmail.com>
Date:   Mon Mar 27 13:15:04 2017 +0100

    Fix #13433
    
    Summary: See comments for details.
    
    Test Plan: validate
    
    Reviewers: mpickering, bgamari, austin, erikd
    
    Subscribers: rwbarton, thomie
    
    Differential Revision: https://phabricator.haskell.org/D3386
    
    (cherry picked from commit 074d13eb3b6489e8b2f555f61496761614a3e207)


>---------------------------------------------------------------

bdcb0c8572044f2a93981910bb4ed6e9d65160c0
 rts/Apply.cmm | 21 +++++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)

diff --git a/rts/Apply.cmm b/rts/Apply.cmm
index b3a04ca..4c34f0f 100644
--- a/rts/Apply.cmm
+++ b/rts/Apply.cmm
@@ -156,13 +156,26 @@ again:
              THUNK_STATIC,
              THUNK_SELECTOR:
         {
-            // The thunk might evaluate to a function, so we have to come
-            // back here again to adjust its CCS if necessary.  The
-            // stg_restore_ccs_eval stack frame does that.
+            // We have a thunk of some kind, so evaluate it.
+
+            // The thunk might evaluate to a function, so we have to
+            // come back here again to adjust its CCS if necessary.
+            // Therefore we need to push a stack frame to look at the
+            // function that gets returned (a stg_restore_ccs_eval
+            // frame), and therefore we need a stack check.
             STK_CHK_GEN();
+
+            // We can't use the value of 'info' any more, because if
+            // STK_CHK_GEN() did a GC then the closure we're looking
+            // at may have changed, e.g. a THUNK_SELECTOR may have
+            // been evaluated by the GC.  So we reload the info
+            // pointer now.
+            untaggedfun = UNTAG(fun);
+            info = %INFO_PTR(untaggedfun);
+
             jump %ENTRY_CODE(info)
                 (stg_restore_cccs_eval_info, CCCS)
-                (UNTAG(fun));
+                (untaggedfun);
         }
         default:
         {



More information about the ghc-commits mailing list