Fix #13433
authorSimon Marlow <marlowsd@gmail.com>
Mon, 27 Mar 2017 12:15:04 +0000 (13:15 +0100)
committerSimon Marlow <marlowsd@gmail.com>
Tue, 28 Mar 2017 10:31:22 +0000 (11:31 +0100)
Summary: See comments for details.

Test Plan: validate

Reviewers: mpickering, bgamari, austin, erikd

Subscribers: rwbarton, thomie

Differential Revision: https://phabricator.haskell.org/D3386

rts/Apply.cmm

index b3a04ca..4c34f0f 100644 (file)
@@ -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:
         {