summaryrefslogtreecommitdiff
path: root/testsuite/tests/dcoercion/DCo_Array.hs
blob: cf3e389a0997fe0a58bef638170f39a340bd221d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{-# LANGUAGE
    MagicHash
  , UnboxedTuples
  , UnliftedFFITypes
 #-}

module DCo_Array where

import DCo_Array_aux
  ( memcpy_thaw )

import GHC.Exts
  ( Ptr, Int(I#), RealWorld
  , MutableByteArray#, ByteArray#
  , newByteArray#
  )
import GHC.IO ( IO(..) )
import GHC.ST ( ST(..) )

data UArray e = UArray !Int ByteArray#
data STUArray s e = STUArray !Int (MutableByteArray# s)

thawSTUArray :: UArray e -> ST RealWorld (STUArray RealWorld e)
thawSTUArray (UArray n@(I# n#) arr#) = ST $ \s1# ->
  case newByteArray# n# s1# of
    (# s2#, marr# #) ->
      case memcpy_thaw marr# arr# (fromIntegral n) of
        IO m ->
          case m s2# of
            (# s3#, _ #) ->
              (# s3#, STUArray n marr# #)