Skip to content

Commit c3be2ad

Browse files
authored
Merge pull request #305 from obsidiansystems/wip/no-extend-narrow-primop-names
Use new primops names for converting numbers to and from the native size
2 parents 2f88390 + 2db29ea commit c3be2ad

File tree

7 files changed

+69
-16
lines changed

7 files changed

+69
-16
lines changed

benchmarks/text-benchmarks.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ executable text-benchmarks
102102
Data.Text.Internal.Builder.Int.Digits
103103
Data.Text.Internal.Builder.RealFloat.Functions
104104
Data.Text.Internal.ByteStringCompat
105+
Data.Text.Internal.PrimCompat
105106
Data.Text.Internal.Encoding.Fusion
106107
Data.Text.Internal.Encoding.Fusion.Common
107108
Data.Text.Internal.Encoding.Utf16

src/Data/Text/Internal/Encoding/Utf16.hs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
{-# LANGUAGE MagicHash, BangPatterns #-}
1+
{-# LANGUAGE CPP #-}
2+
{-# LANGUAGE MagicHash #-}
3+
{-# LANGUAGE BangPatterns #-}
24

35
-- |
46
-- Module : Data.Text.Internal.Encoding.Utf16
@@ -26,11 +28,16 @@ module Data.Text.Internal.Encoding.Utf16
2628
import GHC.Exts
2729
import GHC.Word (Word16(..))
2830

31+
#if !MIN_VERSION_base(4,16,0)
32+
-- harmless to import, except for warnings that it is unused.
33+
import Data.Text.Internal.PrimCompat ( word16ToWord# )
34+
#endif
35+
2936
chr2 :: Word16 -> Word16 -> Char
3037
chr2 (W16# a#) (W16# b#) = C# (chr# (upper# +# lower# +# 0x10000#))
3138
where
32-
!x# = word2Int# a#
33-
!y# = word2Int# b#
39+
!x# = word2Int# (word16ToWord# a#)
40+
!y# = word2Int# (word16ToWord# b#)
3441
!upper# = uncheckedIShiftL# (x# -# 0xD800#) 10#
3542
!lower# = y# -# 0xDC00#
3643
{-# INLINE chr2 #-}

src/Data/Text/Internal/Encoding/Utf8.hs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ import Data.Text.Internal.Unsafe.Shift (shiftR)
4646
import GHC.Exts
4747
import GHC.Word (Word8(..))
4848

49+
#if !MIN_VERSION_base(4,16,0)
50+
-- harmless to import, except for warnings that it is unused.
51+
import Data.Text.Internal.PrimCompat (word8ToWord#)
52+
#endif
53+
4954
default(Int)
5055

5156
between :: Word8 -- ^ byte to check
@@ -94,18 +99,18 @@ ord4 c =
9499
chr2 :: Word8 -> Word8 -> Char
95100
chr2 (W8# x1#) (W8# x2#) = C# (chr# (z1# +# z2#))
96101
where
97-
!y1# = word2Int# x1#
98-
!y2# = word2Int# x2#
102+
!y1# = word2Int# (word8ToWord# x1#)
103+
!y2# = word2Int# (word8ToWord# x2#)
99104
!z1# = uncheckedIShiftL# (y1# -# 0xC0#) 6#
100105
!z2# = y2# -# 0x80#
101106
{-# INLINE chr2 #-}
102107

103108
chr3 :: Word8 -> Word8 -> Word8 -> Char
104109
chr3 (W8# x1#) (W8# x2#) (W8# x3#) = C# (chr# (z1# +# z2# +# z3#))
105110
where
106-
!y1# = word2Int# x1#
107-
!y2# = word2Int# x2#
108-
!y3# = word2Int# x3#
111+
!y1# = word2Int# (word8ToWord# x1#)
112+
!y2# = word2Int# (word8ToWord# x2#)
113+
!y3# = word2Int# (word8ToWord# x3#)
109114
!z1# = uncheckedIShiftL# (y1# -# 0xE0#) 12#
110115
!z2# = uncheckedIShiftL# (y2# -# 0x80#) 6#
111116
!z3# = y3# -# 0x80#
@@ -115,10 +120,10 @@ chr4 :: Word8 -> Word8 -> Word8 -> Word8 -> Char
115120
chr4 (W8# x1#) (W8# x2#) (W8# x3#) (W8# x4#) =
116121
C# (chr# (z1# +# z2# +# z3# +# z4#))
117122
where
118-
!y1# = word2Int# x1#
119-
!y2# = word2Int# x2#
120-
!y3# = word2Int# x3#
121-
!y4# = word2Int# x4#
123+
!y1# = word2Int# (word8ToWord# x1#)
124+
!y2# = word2Int# (word8ToWord# x2#)
125+
!y3# = word2Int# (word8ToWord# x3#)
126+
!y4# = word2Int# (word8ToWord# x4#)
122127
!z1# = uncheckedIShiftL# (y1# -# 0xF0#) 18#
123128
!z2# = uncheckedIShiftL# (y2# -# 0x80#) 12#
124129
!z3# = uncheckedIShiftL# (y3# -# 0x80#) 6#

src/Data/Text/Internal/PrimCompat.hs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
{-# LANGUAGE CPP #-}
2+
{-# LANGUAGE MagicHash #-}
3+
4+
module Data.Text.Internal.PrimCompat
5+
( word8ToWord#
6+
, wordToWord8#
7+
8+
, word16ToWord#
9+
, wordToWord16#
10+
11+
, wordToWord32#
12+
, word32ToWord#
13+
) where
14+
15+
#if MIN_VERSION_base(4,16,0)
16+
17+
import GHC.Base
18+
19+
#else
20+
21+
import GHC.Prim (Word#)
22+
23+
wordToWord8#, word8ToWord# :: Word# -> Word#
24+
wordToWord16#, word16ToWord# :: Word# -> Word#
25+
wordToWord32#, word32ToWord# :: Word# -> Word#
26+
word8ToWord# w = w
27+
word16ToWord# w = w
28+
word32ToWord# w = w
29+
wordToWord8# w = w
30+
wordToWord16# w = w
31+
wordToWord32# w = w
32+
{-# INLINE wordToWord16# #-}
33+
{-# INLINE word16ToWord# #-}
34+
{-# INLINE wordToWord32# #-}
35+
{-# INLINE word32ToWord# #-}
36+
37+
#endif

src/Data/Text/Internal/Unsafe/Char.hs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,21 +35,22 @@ import Data.Text.Internal.Unsafe.Shift (shiftR)
3535
import GHC.Exts (Char(..), Int(..), chr#, ord#, word2Int#)
3636
import GHC.Word (Word8(..), Word16(..), Word32(..))
3737
import qualified Data.Text.Array as A
38+
import Data.Text.Internal.PrimCompat ( word8ToWord#, word16ToWord#, word32ToWord# )
3839

3940
ord :: Char -> Int
4041
ord (C# c#) = I# (ord# c#)
4142
{-# INLINE ord #-}
4243

4344
unsafeChr :: Word16 -> Char
44-
unsafeChr (W16# w#) = C# (chr# (word2Int# w#))
45+
unsafeChr (W16# w#) = C# (chr# (word2Int# (word16ToWord# w#)))
4546
{-# INLINE unsafeChr #-}
4647

4748
unsafeChr8 :: Word8 -> Char
48-
unsafeChr8 (W8# w#) = C# (chr# (word2Int# w#))
49+
unsafeChr8 (W8# w#) = C# (chr# (word2Int# (word8ToWord# w#)))
4950
{-# INLINE unsafeChr8 #-}
5051

5152
unsafeChr32 :: Word32 -> Char
52-
unsafeChr32 (W32# w#) = C# (chr# (word2Int# w#))
53+
unsafeChr32 (W32# w#) = C# (chr# (word2Int# (word32ToWord# w#)))
5354
{-# INLINE unsafeChr32 #-}
5455

5556
-- | Write a character into the array at the given offset. Returns

tests/text-tests.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ test-suite tests
122122
Data.Text.Internal.Builder.Int.Digits
123123
Data.Text.Internal.Builder.RealFloat.Functions
124124
Data.Text.Internal.ByteStringCompat
125+
Data.Text.Internal.PrimCompat
125126
Data.Text.Internal.Encoding.Fusion
126127
Data.Text.Internal.Encoding.Fusion.Common
127128
Data.Text.Internal.Encoding.Utf16

text.cabal

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ library
121121
Data.Text.Internal.Builder.Int.Digits
122122
Data.Text.Internal.Builder.RealFloat.Functions
123123
Data.Text.Internal.ByteStringCompat
124+
Data.Text.Internal.PrimCompat
124125
Data.Text.Internal.Encoding.Fusion
125126
Data.Text.Internal.Encoding.Fusion.Common
126127
Data.Text.Internal.Encoding.Utf16
@@ -162,7 +163,7 @@ library
162163
base >= 4.3 && < 5,
163164
binary >= 0.5 && < 0.9,
164165
deepseq >= 1.1 && < 1.5,
165-
ghc-prim >= 0.2 && < 0.8,
166+
ghc-prim >= 0.2 && < 0.9,
166167
template-haskell >= 2.5 && < 2.18
167168

168169
if flag(bytestring-builder)

0 commit comments

Comments
 (0)