diff options
author | Simon Marlow <marlowsd@gmail.com> | 2017-12-18 11:23:16 -0500 |
---|---|---|
committer | David Feuer <David.Feuer@gmail.com> | 2017-12-18 11:23:19 -0500 |
commit | fb1f0a46983a887057de647eaaae9e83b5ebebd1 (patch) | |
tree | 09f66661401ec97bb36ac91dc78387d5d8b72d82 /rts/sm | |
parent | f1fe5b4adf6a4094ecc600a28f64f7628903d017 (diff) | |
download | haskell-fb1f0a46983a887057de647eaaae9e83b5ebebd1.tar.gz |
Blackholes can be large objects (#14497)
Test Plan: validate
Reviewers: bgamari, niteria, erikd, dfeuer
Reviewed By: dfeuer
Subscribers: Yuras, dfeuer, rwbarton, thomie, carter
GHC Trac Issues: #14497
Differential Revision: https://phabricator.haskell.org/D4254
Diffstat (limited to 'rts/sm')
-rw-r--r-- | rts/sm/Evac.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/rts/sm/Evac.c b/rts/sm/Evac.c index fb1af0f692..526f063336 100644 --- a/rts/sm/Evac.c +++ b/rts/sm/Evac.c @@ -898,9 +898,16 @@ evacuate_BLACKHOLE(StgClosure **p) bd = Bdescr((P_)q); - // blackholes can't be in a compact, or large - ASSERT((bd->flags & (BF_COMPACT | BF_LARGE)) == 0); - + // blackholes can't be in a compact + ASSERT((bd->flags & BF_COMPACT) == 0); + + // blackholes *can* be in a large object: when raiseAsync() creates an + // AP_STACK the payload might be large enough to create a large object. + // See #14497. + if (bd->flags & BF_LARGE) { + evacuate_large((P_)q); + return; + } if (bd->flags & BF_EVACUATED) { if (bd->gen_no < gct->evac_gen_no) { gct->failed_to_evac = true; |