Disclaimer: I am not an expert. But I happened to have been looking at this 
code just yesterday, so I’ll try to answer to check my understanding. :)

Fundamentally, a PAP is not fully-saturated, so the number of arguments in its 
payload may be smaller than the information contained in the function’s bitmap. 
scavenge_large_bitmap calls walk_large_bitmap, which uses the bitmap as a 
“ruler” to guide the traversal, lining up each element in the payload to 
information in the bitmap. But the traversal only actually walks a payload of 
the specified size, so if there’s less information in the payload than there is 
information in the bitmap, the traversal will just terminate early.

> On Feb 14, 2020, at 09:30, Ömer Sinan Ağacan <omeraga...@gmail.com> wrote:
> 
> Right, I think that's the problem. We then pass the same "size" to
> scavenge_large_bitmap as the size of the bitmap. So we assume size of the 
> bitmap
> is pap->n_args.
> 
> So the call stack is
> 
> - scavenge_PAP, calls scavenge_PAP_payload with pap->n_args as "size"
> - scavenge_PAP_payload, calls scavenge_large_bitmap with "size" (== 
> pap->n_args)
>  as the bitmap's size
> 
> Is this expected?
> 
> Ömer
_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

Reply via email to