Implement {resize,shrink}MutableByteArray# primops
authorHerbert Valerio Riedel <hvr@gnu.org>
Sat, 16 Aug 2014 07:49:30 +0000 (09:49 +0200)
committerHerbert Valerio Riedel <hvr@gnu.org>
Sat, 16 Aug 2014 14:01:35 +0000 (16:01 +0200)
commit246436f13739593d2a211ceb830393338118ca4d
tree90630d9ece70e613ae9f9aa6ccd4b95fa69545bf
parentd39c434a9518b7376857be88503055ecb7d0fe1f
Implement {resize,shrink}MutableByteArray# primops

The two new primops with the type-signatures

  resizeMutableByteArray# :: MutableByteArray# s -> Int#
                          -> State# s -> (# State# s, MutableByteArray# s #)

  shrinkMutableByteArray# :: MutableByteArray# s -> Int#
                          -> State# s -> State# s

allow to resize MutableByteArray#s in-place (when possible), and are useful
for algorithms where memory is temporarily over-allocated. The motivating
use-case is for implementing integer backends, where the final target size of
the result is either N or N+1, and only known after the operation has been
performed.

A future commit will implement a stateful variant of the
`sizeofMutableByteArray#` operation (see #9447 for details), since now the
size of a `MutableByteArray#` may change over its lifetime (i.e before
it gets frozen or GCed).

Test Plan: ./validate --slow

Reviewers: ezyang, austin, simonmar

Reviewed By: austin, simonmar

Differential Revision: https://phabricator.haskell.org/D133
compiler/prelude/primops.txt.pp
includes/Cmm.h
includes/rts/storage/ClosureMacros.h
includes/stg/MiscClosures.h
rts/Linker.c
rts/PrimOps.cmm