diff options
author | Andreas Klebinger <klebinger.andreas@gmx.at> | 2020-06-10 17:39:24 +0200 |
---|---|---|
committer | Tamar Christina <tamar@zhox.com> | 2020-06-17 11:03:30 +0100 |
commit | 92bbf6544f640b4a95e59f5a2d966edf45744512 (patch) | |
tree | 5a25536a7494b38789e8e4564dadb6d3e9cfa58d | |
parent | 46f693e8404274453e220db4a7dfb93ffe2fb666 (diff) | |
download | haskell-92bbf6544f640b4a95e59f5a2d966edf45744512.tar.gz |
winio: Don't drop buffer offset in byteView/cwcharView
-rw-r--r-- | libraries/base/GHC/IO/Buffer.hs | 7 | ||||
-rw-r--r-- | libraries/base/GHC/IO/Encoding/CodePage/API.hs | 4 |
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" |