@@ -20,6 +20,7 @@ import Control.Applicative
20
20
import Control.DeepSeq (NFData (rnf ))
21
21
import Control.Exception (ArithException (DivideByZero , Overflow , Underflow ),
22
22
throw )
23
+ import Data.IntCast
23
24
24
25
import Compat.Binary
25
26
import Data.MessagePack.Tags
@@ -40,20 +41,20 @@ data MPInteger = MPInteger {- isW64 -} !Bool
40
41
41
42
-- NB: only valid if isW64 is true
42
43
toW64 :: Int64 -> Word64
43
- toW64 = fromIntegral
44
+ toW64 = intCastIso
44
45
45
46
class ToMPInteger a where
46
47
toMPInteger :: a -> MPInteger
47
48
48
- instance ToMPInteger Int8 where toMPInteger i = MPInteger False (fromIntegral i)
49
- instance ToMPInteger Int16 where toMPInteger i = MPInteger False (fromIntegral i)
50
- instance ToMPInteger Int32 where toMPInteger i = MPInteger False (fromIntegral i)
49
+ instance ToMPInteger Int8 where toMPInteger i = MPInteger False (intCast i)
50
+ instance ToMPInteger Int16 where toMPInteger i = MPInteger False (intCast i)
51
+ instance ToMPInteger Int32 where toMPInteger i = MPInteger False (intCast i)
51
52
instance ToMPInteger Int64 where toMPInteger = MPInteger False
52
- instance ToMPInteger Int where toMPInteger i = MPInteger False (fromIntegral i)
53
+ instance ToMPInteger Int where toMPInteger i = MPInteger False (intCast i)
53
54
54
- instance ToMPInteger Word8 where toMPInteger w = MPInteger False (fromIntegral w)
55
- instance ToMPInteger Word16 where toMPInteger w = MPInteger False (fromIntegral w)
56
- instance ToMPInteger Word32 where toMPInteger w = MPInteger False (fromIntegral w)
55
+ instance ToMPInteger Word8 where toMPInteger w = MPInteger False (intCast w)
56
+ instance ToMPInteger Word16 where toMPInteger w = MPInteger False (intCast w)
57
+ instance ToMPInteger Word32 where toMPInteger w = MPInteger False (intCast w)
57
58
instance ToMPInteger Word64 where toMPInteger w = MPInteger (i< 0 ) i where i = fromIntegral w
58
59
instance ToMPInteger Word where toMPInteger w = MPInteger (i< 0 ) i where i = fromIntegral w
59
60
@@ -67,61 +68,46 @@ class FromMPInteger a where
67
68
fromMPInteger :: MPInteger -> Maybe a
68
69
69
70
instance FromMPInteger Word where
70
- fromMPInteger (MPInteger isW64 i)
71
- | 0 <= i || isW64
72
- , toW64 i <= maxW = Just $! fromIntegral i
73
- | otherwise = Nothing
74
- where
75
- maxW = fromIntegral (maxBound :: Word ) :: Word64
71
+ fromMPInteger (MPInteger True w) = intCastMaybe (toW64 w)
72
+ fromMPInteger (MPInteger False i) = intCastMaybe i
76
73
77
74
instance FromMPInteger Word64 where
78
- fromMPInteger (MPInteger True w) = Just $! toW64 w
79
- fromMPInteger (MPInteger False i)
80
- | 0 <= i = Just (toW64 i)
81
- | otherwise = Nothing
75
+ fromMPInteger (MPInteger True w) = Just $! toW64 w
76
+ fromMPInteger (MPInteger False i) = intCastMaybe i
82
77
83
78
instance FromMPInteger Word32 where
84
79
fromMPInteger (MPInteger True _) = Nothing
85
- fromMPInteger (MPInteger False i) = int64toInt i
80
+ fromMPInteger (MPInteger False i) = intCastMaybe i
86
81
87
82
instance FromMPInteger Word16 where
88
83
fromMPInteger (MPInteger True _) = Nothing
89
- fromMPInteger (MPInteger False i) = int64toInt i
84
+ fromMPInteger (MPInteger False i) = intCastMaybe i
90
85
91
86
instance FromMPInteger Word8 where
92
87
fromMPInteger (MPInteger True _) = Nothing
93
- fromMPInteger (MPInteger False i) = int64toInt i
88
+ fromMPInteger (MPInteger False i) = intCastMaybe i
94
89
95
90
-----
96
91
97
92
instance FromMPInteger Int where
98
93
fromMPInteger (MPInteger True _) = Nothing
99
- fromMPInteger (MPInteger False i) = int64toInt i
94
+ fromMPInteger (MPInteger False i) = intCastMaybe i
100
95
101
96
instance FromMPInteger Int64 where
102
97
fromMPInteger (MPInteger True _) = Nothing
103
98
fromMPInteger (MPInteger False i) = Just i
104
99
105
100
instance FromMPInteger Int32 where
106
101
fromMPInteger (MPInteger True _) = Nothing
107
- fromMPInteger (MPInteger False i) = int64toInt i
102
+ fromMPInteger (MPInteger False i) = intCastMaybe i
108
103
109
104
instance FromMPInteger Int16 where
110
105
fromMPInteger (MPInteger True _) = Nothing
111
- fromMPInteger (MPInteger False i) = int64toInt i
106
+ fromMPInteger (MPInteger False i) = intCastMaybe i
112
107
113
108
instance FromMPInteger Int8 where
114
109
fromMPInteger (MPInteger True _) = Nothing
115
- fromMPInteger (MPInteger False i) = int64toInt i
116
-
117
- {-# INLINE int64toInt #-}
118
- int64toInt :: forall i . (Integral i , Bounded i ) => Int64 -> Maybe i
119
- int64toInt i
120
- | minI <= i, i <= maxI = Just $! fromIntegral i
121
- | otherwise = Nothing
122
- where
123
- minI = fromIntegral (minBound :: i ) :: Int64
124
- maxI = fromIntegral (maxBound :: i ) :: Int64
110
+ fromMPInteger (MPInteger False i) = intCastMaybe i
125
111
126
112
----------------------------------------------------------------------------
127
113
@@ -246,20 +232,20 @@ putMPInteger :: MPInteger -> Put
246
232
putMPInteger (MPInteger False i)
247
233
-- positive fixnum stores 7-bit positive integer
248
234
-- negative fixnum stores 5-bit negative integer
249
- | - 32 <= i && i <= 127 = putWord8 (fromIntegral i)
235
+ | - 32 <= i && i <= 127 = putInt8 (fromIntegral i)
250
236
251
237
-- unsigned int encoding
252
238
| i >= 0 = case () of
253
239
_ | i < 0x100 -> putWord8 TAG_uint8 >> putWord8 (fromIntegral i)
254
240
| i < 0x10000 -> putWord8 TAG_uint16 >> putWord16be (fromIntegral i)
255
241
| i < 0x100000000 -> putWord8 TAG_uint32 >> putWord32be (fromIntegral i)
256
- | otherwise -> putWord8 TAG_uint64 >> putWord64be (fromIntegral i)
242
+ | otherwise -> putWord8 TAG_uint64 >> putWord64be (intCastIso i) -- equivalent to 'putInt64be i'
257
243
258
244
-- signed int encoding
259
- | - 0x80 <= i = putWord8 TAG_int8 >> putWord8 (fromIntegral i)
260
- | - 0x8000 <= i = putWord8 TAG_int16 >> putWord16be (fromIntegral i)
261
- | - 0x80000000 <= i = putWord8 TAG_int32 >> putWord32be (fromIntegral i)
262
- | otherwise = putWord8 TAG_int64 >> putWord64be ( fromIntegral i)
245
+ | - 0x80 <= i = putWord8 TAG_int8 >> putInt8 (fromIntegral i)
246
+ | - 0x8000 <= i = putWord8 TAG_int16 >> putInt16be (fromIntegral i)
247
+ | - 0x80000000 <= i = putWord8 TAG_int32 >> putInt32be (fromIntegral i)
248
+ | otherwise = putWord8 TAG_int64 >> putInt64be i
263
249
putMPInteger (MPInteger True w) = putWord8 TAG_uint64 >> putWord64be (toW64 w)
264
250
265
251
-- | Deserializes 'MPInteger' from MessagePack
@@ -269,16 +255,16 @@ getMPInteger :: Get MPInteger
269
255
getMPInteger = getWord8 >>= \ case
270
256
-- positive fixnum stores 7-bit positive integer
271
257
-- negative fixnum stores 5-bit negative integer
272
- c | is_TAG_fixint c -> pure $! toMPInteger (fromIntegral c :: Int8 )
258
+ c | is_TAG_fixint c -> pure $! toMPInteger (intCastIso c :: Int8 )
273
259
274
260
TAG_uint8 -> toMPInteger <$> getWord8
275
261
TAG_uint16 -> toMPInteger <$> getWord16be
276
262
TAG_uint32 -> toMPInteger <$> getWord32be
277
263
TAG_uint64 -> toMPInteger <$> getWord64be
278
264
279
- TAG_int8 -> toMPInteger <$> ( fromIntegral <$> getWord8 :: Get Int8 )
280
- TAG_int16 -> toMPInteger <$> ( fromIntegral <$> getWord16be :: Get Int16 )
281
- TAG_int32 -> toMPInteger <$> ( fromIntegral <$> getWord32be :: Get Int32 )
282
- TAG_int64 -> toMPInteger <$> ( fromIntegral <$> getWord64be :: Get Int64 )
265
+ TAG_int8 -> toMPInteger <$> getInt8
266
+ TAG_int16 -> toMPInteger <$> getInt16be
267
+ TAG_int32 -> toMPInteger <$> getInt32be
268
+ TAG_int64 -> toMPInteger <$> getInt64be
283
269
284
270
_ -> empty
0 commit comments