So, to summarize what you guys have been talking about, it's looking like
the primops would become:

copyArray#        ::        Array# a -> Int# -> MutableArray# s a -> Int# ->
Int# -> State# s -> State# s
copyMutableArray# :: MutableArray# a -> Int# -> MutableArray# s a -> Int# ->
Int# -> State# s -> State# s

copyByteArray#        ::        ByteArray#   -> Int# -> MutableByteArray# s
-> Int# -> Int# -> State# s -> State# s
copyMutableByteArray# :: MutableByteArray# s -> Int# -> MutableByteArray# s
-> Int# -> Int# -> State# s -> State# s


cloneArray#        ::        Array#   a -> Int# -> Int# -> State# s -> (#
State# s, Array# a #)
cloneMutableArray# :: MutableArray# s a -> Int# -> Int# -> State# s -> (#
State# s, MutableArray# s a #)

freezeArray# :: MutableArray# s a -> Int# -> Int# -> State# s -> (# State#
s, Array# a #)
thawArray#   ::        Array#   a -> Int# -> Int# -> State# s -> (# State#
s, MutableArray# s a #)

Roman: I'm thinking that even in the absence of GC during foreign calls, it
still seems worthwhile to provide the plain copying primitives, if only to
save "user" code from having to know a) the structure of a (Byte)Array# and
where the "data" lives vs. the metadata b) the card marking stuff for
Array#, both of which could easily change between GHC versions.

Does this seem reasonable? I was thinking of putting in the fillArray#
primitive you suggested too (and making it use memset_pattern on mac OS),
but then we'd need a bunch of different fillArray# for different-sized
things on ByteArray# and that might get ugly. I do however like the idea of
putting in a generic operation that may not be optimized on all platforms
right now, but will only get faster with time (once we come up with
memset_pattern analogues on other platforms).

Thanks,
Dan

On Tue, Jan 25, 2011 at 4:50 PM, Johan Tibell <[email protected]>wrote:

> On Tue, Jan 25, 2011 at 10:30 PM, Roman Leshchinskiy <[email protected]>
> wrote:
> > thawArray# (which creates a mutable copy), update the element, then
> unsafeFreeze#. I thought that's what you wanted (modulo names). In theory,
> since both unsafeFreeze# and unsafeThaw# do some work we might want 4
> different variants of clone:
> >
> >  Array# -> Array#
> >  MutableArray# -> MutableArray#
> >  MutableArray# -> Array#
> >  Array# -> MutableArray#
> >
> > I just proposed to call the latter two thaw and freeze to avoid confusing
> names. I'm not sure if all of them are equally important, even though I
> would probably use all 4 in vector.
>
> I think I like this. The first version (Array# -> Array#) of close is
> only really usable if you want to make sure that an array occupies
> less memory than before, but I can see that being useful when slicing.
>
> Johan
>
_______________________________________________
Cvs-ghc mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to