summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Klebinger <klebinger.andreas@gmx.at>2020-06-10 17:39:24 +0200
committerTamar Christina <tamar@zhox.com>2020-06-17 11:03:30 +0100
commit92bbf6544f640b4a95e59f5a2d966edf45744512 (patch)
tree5a25536a7494b38789e8e4564dadb6d3e9cfa58d
parent46f693e8404274453e220db4a7dfb93ffe2fb666 (diff)
downloadhaskell-92bbf6544f640b4a95e59f5a2d966edf45744512.tar.gz
winio: Don't drop buffer offset in byteView/cwcharView
-rw-r--r--libraries/base/GHC/IO/Buffer.hs7
-rw-r--r--libraries/base/GHC/IO/Encoding/CodePage/API.hs4
2 files changed, 5 insertions, 6 deletions
diff --git a/libraries/base/GHC/IO/Buffer.hs b/libraries/base/GHC/IO/Buffer.hs
index 85d7e7c310..167bc2a346 100644
--- a/libraries/base/GHC/IO/Buffer.hs
+++ b/libraries/base/GHC/IO/Buffer.hs
@@ -64,10 +64,6 @@ module GHC.IO.Buffer (
charSize,
) where
-#if defined(CHARBUF_UTF16)
-import Data.Word (Word64)
-#endif
-
import GHC.Base
-- import GHC.IO
import GHC.Num
@@ -268,6 +264,9 @@ bufferOffset Buffer{ bufOffset=off } = off
bufferAdjustOffset :: Word64 -> Buffer e -> Buffer e
bufferAdjustOffset offs buf = buf{ bufOffset=offs }
+-- The adjustment to the offset can be 32bit int on 32 platforms.
+-- This is fine, we only use this after reading into/writing from
+-- the buffer so we will never overflow here.
bufferAddOffset :: Int -> Buffer e -> Buffer e
bufferAddOffset offs buf@Buffer{ bufOffset=w } =
buf{ bufOffset=w+(fromIntegral offs) }
diff --git a/libraries/base/GHC/IO/Encoding/CodePage/API.hs b/libraries/base/GHC/IO/Encoding/CodePage/API.hs
index 48afa90f69..41bc8d0f07 100644
--- a/libraries/base/GHC/IO/Encoding/CodePage/API.hs
+++ b/libraries/base/GHC/IO/Encoding/CodePage/API.hs
@@ -180,10 +180,10 @@ saner code ibuf obuf = do
else return (why, bufL ibuf' - bufL ibuf, ibuf', obuf')
byteView :: Buffer CWchar -> Buffer Word8
-byteView (Buffer {..}) = Buffer { bufState = bufState, bufRaw = castForeignPtr bufRaw, bufSize = bufSize * 2, bufOffset = 0, bufL = bufL * 2, bufR = bufR * 2 }
+byteView (Buffer {..}) = Buffer { bufState = bufState, bufRaw = castForeignPtr bufRaw, bufSize = bufSize * 2, bufOffset = bufOffset, bufL = bufL * 2, bufR = bufR * 2 }
cwcharView :: Buffer Word8 -> Buffer CWchar
-cwcharView (Buffer {..}) = Buffer { bufState = bufState, bufRaw = castForeignPtr bufRaw, bufSize = half bufSize, bufOffset = 0, bufL = half bufL, bufR = half bufR }
+cwcharView (Buffer {..}) = Buffer { bufState = bufState, bufRaw = castForeignPtr bufRaw, bufSize = half bufSize, bufOffset = bufOffset, bufL = half bufL, bufR = half bufR }
where half x = case x `divMod` 2 of (y, 0) -> y
_ -> errorWithoutStackTrace "cwcharView: utf16_(encode|decode) (wrote out|consumed) non multiple-of-2 number of bytes"