summaryrefslogtreecommitdiff
path: root/libraries/base/GHC/IO/Encoding/Failure.hs
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/base/GHC/IO/Encoding/Failure.hs')
-rw-r--r--libraries/base/GHC/IO/Encoding/Failure.hs18
1 files changed, 17 insertions, 1 deletions
diff --git a/libraries/base/GHC/IO/Encoding/Failure.hs b/libraries/base/GHC/IO/Encoding/Failure.hs
index fb885bd45b..d9817aa950 100644
--- a/libraries/base/GHC/IO/Encoding/Failure.hs
+++ b/libraries/base/GHC/IO/Encoding/Failure.hs
@@ -1,5 +1,8 @@
{-# LANGUAGE Trustworthy #-}
{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE BangPatterns #-}
-----------------------------------------------------------------------------
-- |
@@ -18,7 +21,8 @@
module GHC.IO.Encoding.Failure (
CodingFailureMode(..), codingFailureModeSuffix,
isSurrogate,
- recoverDecode, recoverEncode
+ recoverDecode, recoverEncode,
+ recoverDecode#, recoverEncode#,
) where
import GHC.IO
@@ -142,6 +146,12 @@ unescapeRoundtripCharacterSurrogate c
| otherwise = Nothing
where x = ord c
+recoverDecode# :: CodingFailureMode -> Buffer Word8 -> Buffer Char
+ -> State# RealWorld -> (# State# RealWorld, Buffer Word8, Buffer Char #)
+recoverDecode# cfm input output st =
+ let !(# st', (bIn, bOut) #) = unIO (recoverDecode cfm input output) st
+ in (# st', bIn, bOut #)
+
recoverDecode :: CodingFailureMode -> Buffer Word8 -> Buffer Char
-> IO (Buffer Word8, Buffer Char)
recoverDecode cfm input@Buffer{ bufRaw=iraw, bufL=ir, bufR=_ }
@@ -160,6 +170,12 @@ recoverDecode cfm input@Buffer{ bufRaw=iraw, bufL=ir, bufR=_ }
ow' <- writeCharBuf oraw ow (escapeToRoundtripCharacterSurrogate b)
return (input { bufL=ir+1 }, output { bufR=ow' })
+recoverEncode# :: CodingFailureMode -> Buffer Char -> Buffer Word8
+ -> State# RealWorld -> (# State# RealWorld, Buffer Char, Buffer Word8 #)
+recoverEncode# cfm input output st =
+ let !(# st', (bIn, bOut) #) = unIO (recoverEncode cfm input output) st
+ in (# st', bIn, bOut #)
+
recoverEncode :: CodingFailureMode -> Buffer Char -> Buffer Word8
-> IO (Buffer Char, Buffer Word8)
recoverEncode cfm input@Buffer{ bufRaw=iraw, bufL=ir, bufR=_ }