diff --git a/.github/workflows/haskell-ci.yml b/.github/workflows/haskell-ci.yml index 0c2a10d..73d25ac 100644 --- a/.github/workflows/haskell-ci.yml +++ b/.github/workflows/haskell-ci.yml @@ -1,6 +1,6 @@ # This GitHub workflow config has been generated by a script via # -# haskell-ci 'github' '--config=cabal.haskell-ci' 'cabal.project' +# haskell-ci 'github' 'cabal.project' # # To regenerate the script (for example after adjusting tested-with) run # @@ -8,9 +8,9 @@ # # For more information, see https://github.com/haskell-CI/haskell-ci # -# version: 0.14.3 +# version: 0.15.20220920 # -# REGENDATA ("0.14.3",["github","--config=cabal.haskell-ci","cabal.project"]) +# REGENDATA ("0.15.20220920",["github","cabal.project"]) # name: Haskell-CI on: @@ -19,7 +19,7 @@ on: jobs: linux: name: Haskell-CI - Linux - ${{ matrix.compiler }} - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 timeout-minutes: 60 container: @@ -28,6 +28,11 @@ jobs: strategy: matrix: include: + - compiler: ghc-9.4.2 + compilerKind: ghc + compilerVersion: 9.4.2 + setup-method: ghcup + allow-failure: false - compiler: ghc-9.2.2 compilerKind: ghc compilerVersion: 9.2.2 @@ -38,10 +43,10 @@ jobs: compilerVersion: 9.0.1 setup-method: hvr-ppa allow-failure: false - - compiler: ghc-8.10.1 + - compiler: ghc-8.10.7 compilerKind: ghc - compilerVersion: 8.10.1 - setup-method: hvr-ppa + compilerVersion: 8.10.7 + setup-method: ghcup allow-failure: false - compiler: ghc-8.8.3 compilerKind: ghc @@ -58,16 +63,6 @@ jobs: compilerVersion: 8.4.4 setup-method: hvr-ppa allow-failure: false - - compiler: ghc-8.2.2 - compilerKind: ghc - compilerVersion: 8.2.2 - setup-method: hvr-ppa - allow-failure: false - - compiler: ghc-8.0.2 - compilerKind: ghc - compilerVersion: 8.0.2 - setup-method: hvr-ppa - allow-failure: false fail-fast: false steps: - name: apt @@ -76,18 +71,18 @@ jobs: apt-get install -y --no-install-recommends gnupg ca-certificates dirmngr curl git software-properties-common libtinfo5 if [ "${{ matrix.setup-method }}" = ghcup ]; then mkdir -p "$HOME/.ghcup/bin" - curl -sL https://downloads.haskell.org/ghcup/0.1.17.5/x86_64-linux-ghcup-0.1.17.5 > "$HOME/.ghcup/bin/ghcup" + curl -sL https://downloads.haskell.org/ghcup/0.1.18.0/x86_64-linux-ghcup-0.1.18.0 > "$HOME/.ghcup/bin/ghcup" chmod a+x "$HOME/.ghcup/bin/ghcup" - "$HOME/.ghcup/bin/ghcup" install ghc "$HCVER" - "$HOME/.ghcup/bin/ghcup" install cabal 3.6.2.0 + "$HOME/.ghcup/bin/ghcup" install ghc "$HCVER" || (cat "$HOME"/.ghcup/logs/*.* && false) + "$HOME/.ghcup/bin/ghcup" install cabal 3.6.2.0 || (cat "$HOME"/.ghcup/logs/*.* && false) else apt-add-repository -y 'ppa:hvr/ghc' apt-get update apt-get install -y "$HCNAME" mkdir -p "$HOME/.ghcup/bin" - curl -sL https://downloads.haskell.org/ghcup/0.1.17.5/x86_64-linux-ghcup-0.1.17.5 > "$HOME/.ghcup/bin/ghcup" + curl -sL https://downloads.haskell.org/ghcup/0.1.18.0/x86_64-linux-ghcup-0.1.18.0 > "$HOME/.ghcup/bin/ghcup" chmod a+x "$HOME/.ghcup/bin/ghcup" - "$HOME/.ghcup/bin/ghcup" install cabal 3.6.2.0 + "$HOME/.ghcup/bin/ghcup" install cabal 3.6.2.0 || (cat "$HOME"/.ghcup/logs/*.* && false) fi env: HCKIND: ${{ matrix.compilerKind }} @@ -210,17 +205,18 @@ jobs: echo "packages: ${PKGDIR_serialise}" >> cabal.project echo "packages: ${PKGDIR_binary_serialise_cbor}" >> cabal.project echo "packages: ${PKGDIR_cborg_json}" >> cabal.project - if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo "package cborg" >> cabal.project ; fi - if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo " ghc-options: -Werror=missing-methods" >> cabal.project ; fi - if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo "package cbor-tool" >> cabal.project ; fi - if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo " ghc-options: -Werror=missing-methods" >> cabal.project ; fi - if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo "package serialise" >> cabal.project ; fi - if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo " ghc-options: -Werror=missing-methods" >> cabal.project ; fi - if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo "package binary-serialise-cbor" >> cabal.project ; fi - if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo " ghc-options: -Werror=missing-methods" >> cabal.project ; fi - if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo "package cborg-json" >> cabal.project ; fi - if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo " ghc-options: -Werror=missing-methods" >> cabal.project ; fi + echo "package cborg" >> cabal.project + echo " ghc-options: -Werror=missing-methods" >> cabal.project + echo "package cbor-tool" >> cabal.project + echo " ghc-options: -Werror=missing-methods" >> cabal.project + echo "package serialise" >> cabal.project + echo " ghc-options: -Werror=missing-methods" >> cabal.project + echo "package binary-serialise-cbor" >> cabal.project + echo " ghc-options: -Werror=missing-methods" >> cabal.project + echo "package cborg-json" >> cabal.project + echo " ghc-options: -Werror=missing-methods" >> cabal.project cat >> cabal.project <> cabal.project.local cat cabal.project @@ -262,7 +258,7 @@ jobs: ${CABAL} -vnormal check - name: haddock run: | - $CABAL v2-haddock $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all + $CABAL v2-haddock --haddock-all $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all - name: unconstrained build run: | rm -f cabal.project.local diff --git a/binary-serialise-cbor/binary-serialise-cbor.cabal b/binary-serialise-cbor/binary-serialise-cbor.cabal index 5c9516f..8a17658 100644 --- a/binary-serialise-cbor/binary-serialise-cbor.cabal +++ b/binary-serialise-cbor/binary-serialise-cbor.cabal @@ -13,14 +13,13 @@ category: Codec build-type: Simple cabal-version: 1.22 tested-with: - GHC == 8.0.2, - GHC == 8.2.2, GHC == 8.4.4, GHC == 8.6.5, GHC == 8.8.3, - GHC == 8.10.1, + GHC == 8.10.7, GHC == 9.0.1, - GHC == 9.2.2 + GHC == 9.2.2, + GHC == 9.4.2 description: This package is a shim around @cborg@, exposing an interface compatible with @@ -49,7 +48,7 @@ library exposed-modules: Data.Binary.Serialise.CBOR.Read build-depends: - base >= 4.8 && < 4.17, + base >= 4.8 && < 4.18, bytestring < 1.0, cborg == 0.2.*, serialise == 0.2.* diff --git a/cabal.project b/cabal.project index 14d2fac..fe66065 100644 --- a/cabal.project +++ b/cabal.project @@ -4,3 +4,7 @@ packages: serialise/ binary-serialise-cbor/ cborg-json/ + +-- Needed for serialise benchmarks +allow-newer: + store-core:text diff --git a/cbor-tool/cbor-tool.cabal b/cbor-tool/cbor-tool.cabal index 7fcc241..15439ad 100644 --- a/cbor-tool/cbor-tool.cabal +++ b/cbor-tool/cbor-tool.cabal @@ -15,23 +15,22 @@ build-type: Simple extra-source-files: ChangeLog.md cabal-version: >=1.10 tested-with: - GHC == 8.0.2, - GHC == 8.2.2, GHC == 8.4.4, GHC == 8.6.5, GHC == 8.8.3, - GHC == 8.10.1, + GHC == 8.10.7, GHC == 9.0.1, - GHC == 9.2.2 + GHC == 9.2.2, + GHC == 9.4.2 executable cbor-tool main-is: Main.hs other-extensions: CPP, BangPatterns ghc-options: -Wall build-depends: - base >=4.7 && <4.17, + base >=4.7 && <4.18, filepath >=1.0 && <1.5, - aeson >=0.7 && <2.1, + aeson >=0.7 && <2.2, aeson-pretty >=0.8 && <0.9, scientific >=0.3 && <0.4, bytestring >=0.10 && <0.12, diff --git a/cborg-json/cborg-json.cabal b/cborg-json/cborg-json.cabal index 8b0a891..b6ee5db 100644 --- a/cborg-json/cborg-json.cabal +++ b/cborg-json/cborg-json.cabal @@ -17,21 +17,20 @@ build-type: Simple extra-source-files: ChangeLog.md cabal-version: >=1.10 tested-with: - GHC == 8.0.2, - GHC == 8.2.2, GHC == 8.4.4, GHC == 8.6.5, GHC == 8.8.3, - GHC == 8.10.1, + GHC == 8.10.7, GHC == 9.0.1, - GHC == 9.2.2 + GHC == 9.2.2, + GHC == 9.4.2 library exposed-modules: Codec.CBOR.JSON ghc-options: -Wall build-depends: - base >=4.7 && < 4.17, - aeson >=0.7 && <2.1, + base >=4.7 && < 4.18, + aeson >=0.7 && <2.2, aeson-pretty >=0.8 && <0.9, unordered-containers >=0.2 && <0.3, scientific >=0.3 && <0.4, @@ -58,7 +57,7 @@ benchmark bench other-modules: build-depends: - base >= 4.6 && < 4.17, + base >= 4.6 && < 4.18, cborg , cborg-json , aeson , diff --git a/cborg/cborg.cabal b/cborg/cborg.cabal index 4af86da..8a869b5 100644 --- a/cborg/cborg.cabal +++ b/cborg/cborg.cabal @@ -13,14 +13,13 @@ category: Codec build-type: Simple cabal-version: >= 1.10 tested-with: - GHC == 8.0.2, - GHC == 8.2.2, GHC == 8.4.4, GHC == 8.6.5, GHC == 8.8.3, - GHC == 8.10.1, + GHC == 8.10.7, GHC == 9.0.1, - GHC == 9.2.2 + GHC == 9.2.2, + GHC == 9.4.2 extra-source-files: ChangeLog.md @@ -90,11 +89,11 @@ library build-depends: array >= 0.4 && < 0.6, - base >= 4.8 && < 4.17, + base >= 4.8 && < 4.18, bytestring >= 0.10.4 && < 0.12, containers >= 0.5 && < 0.7, deepseq >= 1.0 && < 1.5, - ghc-prim >= 0.3.1.0 && < 0.9, + ghc-prim >= 0.3.1.0 && < 0.10, half >= 0.2.2.3 && < 0.4, primitive >= 0.5 && < 0.8, text >= 1.1 && < 1.3 || >= 2.0 && <2.1 @@ -148,12 +147,12 @@ test-suite tests build-depends: array >= 0.4 && < 0.6, - base >= 4.7 && < 4.17, + base >= 4.7 && < 4.18, base-orphans, bytestring >= 0.10.4 && < 0.12, text >= 1.1 && < 2.1, cborg, - aeson >= 0.7 && < 2.1, + aeson >= 0.7 && < 2.2, base64-bytestring >= 1.0 && < 1.3, base16-bytestring >= 1.0 && < 1.1, deepseq >= 1.0 && < 1.5, diff --git a/cborg/src/Codec/CBOR/Decoding.hs b/cborg/src/Codec/CBOR/Decoding.hs index 2d18e51..a7d774c 100644 --- a/cborg/src/Codec/CBOR/Decoding.hs +++ b/cborg/src/Codec/CBOR/Decoding.hs @@ -328,8 +328,13 @@ toWord8 n = W8# (wordToWord8# n) toWord16 n = W16# (wordToWord16# n) toWord32 n = W32# (wordToWord32# n) #if WORD_SIZE_IN_BITS == 64 +#if MIN_VERSION_base(4,17,0) +toInt64 n = I64# (intToInt64# n) +toWord64 n = W64# (wordToWord64# n) +#else toInt64 n = I64# n toWord64 n = W64# n +#endif #else toInt64 n = I64# (intToInt64# n) toWord64 n = W64# (wordToWord64# n) @@ -748,7 +753,13 @@ decodeTag64 :: Decoder s Word64 {-# INLINE decodeTag64 #-} decodeTag64 = #if defined(ARCH_64bit) - Decoder (\k -> return (ConsumeTag (\w# -> k (W64# w#)))) + Decoder (\k -> return (ConsumeTag (\w# -> k (W64# +#if MIN_VERSION_base(4,17,0) + (wordToWord64# w#) +#else + w# +#endif + )))) #else Decoder (\k -> return (ConsumeTag64 (\w64# -> k (W64# w64#)))) #endif @@ -769,7 +780,13 @@ decodeTag64Canonical :: Decoder s Word64 {-# INLINE decodeTag64Canonical #-} decodeTag64Canonical = #if defined(ARCH_64bit) - Decoder (\k -> return (ConsumeTagCanonical (\w# -> k (W64# w#)))) + Decoder (\k -> return (ConsumeTagCanonical (\w# -> k (W64# +#if MIN_VERSION_base(4,17,0) + (wordToWord64# w#) +#else + w# +#endif + )))) #else Decoder (\k -> return (ConsumeTag64Canonical (\w64# -> k (W64# w64#)))) #endif @@ -968,7 +985,13 @@ type ByteOffset = Int64 -- -- @since 0.2.2.0 peekByteOffset :: Decoder s ByteOffset -peekByteOffset = Decoder (\k -> return (PeekByteOffset (\off# -> k (I64# off#)))) +peekByteOffset = Decoder (\k -> return (PeekByteOffset (\off# -> k (I64# +#if MIN_VERSION_base(4,17,0) + (intToInt64# off#) +#else + off# +#endif + )))) {-# INLINE peekByteOffset #-} -- | This captures the pattern of getting the byte offsets before and after diff --git a/cborg/src/Codec/CBOR/FlatTerm.hs b/cborg/src/Codec/CBOR/FlatTerm.hs index 9d8b20a..a630624 100644 --- a/cborg/src/Codec/CBOR/FlatTerm.hs +++ b/cborg/src/Codec/CBOR/FlatTerm.hs @@ -170,12 +170,24 @@ decodePreEncoded bs0 = -- always starts by requesting initial input. Only decoders that -- fail or return a value without looking at their input can give -- a different initial result. - Read.Partial k <- Read.deserialiseIncremental decodeTermToken + result <- Read.deserialiseIncremental decodeTermToken + let + k = + case result of + Read.Partial a -> a + _ -> error "Failed to get a Partial" k (Just bs) collectOutput next collectOutput :: Read.IDecode s TermToken -> ST.Lazy.ST s FlatTerm - collectOutput (Read.Fail _ _ err) = fail $ "toFlatTerm: encodePreEncoded " + collectOutput (Read.Fail _ _ err) = +#if MIN_VERSION_base(4,17,0) + error +#else + fail +#endif + + $ "toFlatTerm: encodePreEncoded " ++ "used with invalid CBOR: " ++ show err collectOutput (Read.Partial k) = ST.Lazy.strictToLazyST (k Nothing) diff --git a/cborg/src/Codec/CBOR/Magic.hs b/cborg/src/Codec/CBOR/Magic.hs index b1ff177..1b497a2 100644 --- a/cborg/src/Codec/CBOR/Magic.hs +++ b/cborg/src/Codec/CBOR/Magic.hs @@ -167,7 +167,11 @@ grabWord16 (Ptr ip#) = W16# (narrow16Word# (byteSwap16# (indexWord16OffAddr# ip# grabWord32 (Ptr ip#) = W32# (narrow32Word# (byteSwap32# (indexWord32OffAddr# ip# 0#))) #endif #if defined(ARCH_64bit) +#if MIN_VERSION_base(4,17,0) +grabWord64 (Ptr ip#) = W64# (wordToWord64# (byteSwap# (word64ToWord# (indexWord64OffAddr# ip# 0#)))) +#else grabWord64 (Ptr ip#) = W64# (byteSwap# (indexWord64OffAddr# ip# 0#)) +#endif #else grabWord64 (Ptr ip#) = W64# (byteSwap64# (word64ToWord# (indexWord64OffAddr# ip# 0#))) #endif @@ -196,8 +200,8 @@ grabWord16 (Ptr ip#) = where #if MIN_VERSION_ghc_prim(0,8,0) w16 w# = W16# (wordToWord16# (word8ToWord# w#)) -#else - w16 w# = W16# w# +#else + w16 w# = W16# w# #endif grabWord32 (Ptr ip#) = @@ -212,11 +216,11 @@ grabWord32 (Ptr ip#) = w32 w1# `unsafeShiftL` 16 .|. w32 w2# `unsafeShiftL` 8 .|. w32 w3# - where + where #if MIN_VERSION_ghc_prim(0,8,0) w32 w# = W32# (wordToWord32# (word8ToWord# w#)) -#else - w32 w# = W32# w# +#else + w32 w# = W32# w# #endif grabWord64 (Ptr ip#) = @@ -247,14 +251,14 @@ grabWord64 (Ptr ip#) = #if MIN_VERSION_ghc_prim(0,8,0) toWord :: Word8# -> Word# toWord w# = word8ToWord# w# -#else +#else toWord :: Word# -> Word# - toWord w# = w# + toWord w# = w# #endif #if WORD_SIZE_IN_BITS == 64 w64 w# = W64# (toWord w#) -#else +#else w64 w# = W64# (wordToWord64# (toWord w#)) #endif @@ -439,7 +443,11 @@ word8ToWord (W8# w#) = W# (word8ToWord# w#) word16ToWord (W16# w#) = W# (word16ToWord# w#) word32ToWord (W32# w#) = W# (word32ToWord# w#) #if defined(ARCH_64bit) +#if MIN_VERSION_base(4,17,0) +word64ToWord (W64# w#) = W# (word64ToWord# w#) +#else word64ToWord (W64# w#) = W# w# +#endif #else word64ToWord (W64# w64#) = case isTrue# (w64# `leWord64#` wordToWord64# 0xffffffff##) of @@ -492,8 +500,18 @@ word32ToInt (W32# w#) = #if defined(ARCH_64bit) word64ToInt (W64# w#) = +#if MIN_VERSION_base(4,17,0) + case isTrue# (word64ToWord# w# `ltWord#` 0x8000000000000000##) of +#else case isTrue# (w# `ltWord#` 0x8000000000000000##) of - True -> Just (I# (word2Int# w#)) +#endif + True -> +#if MIN_VERSION_base(4,17,0) + Just (I# (word2Int# (word64ToWord# w#))) + +#else + Just (I# (word2Int# w#)) +#endif False -> Nothing #else word64ToInt (W64# w#) = diff --git a/cborg/src/Codec/CBOR/Read.hs b/cborg/src/Codec/CBOR/Read.hs index 0dbb0b6..6546575 100644 --- a/cborg/src/Codec/CBOR/Read.hs +++ b/cborg/src/Codec/CBOR/Read.hs @@ -1270,7 +1270,14 @@ go_slow da bs !offset = do !offset' = offset + intToInt64 (BS.length bs - BS.length bs') SlowPeekByteOffset bs' k -> - lift (k off#) >>= \daz -> go_slow daz bs' offset' + lift +#if MIN_VERSION_base(4,17,0) + (k (int64ToInt# off#)) +#else + (k off#) + +#endif + >>= \daz -> go_slow daz bs' offset' where !offset'@(I64# off#) = offset + intToInt64 (BS.length bs - BS.length bs') @@ -1373,7 +1380,13 @@ go_slow_overlapped da sz bs_cur bs_next !offset = SlowPeekByteOffset bs_empty k -> assert (BS.null bs_empty) $ do - lift (k off#) >>= \daz -> go_slow daz bs' offset' + lift +#if MIN_VERSION_base(4,17,0) + (k (int64ToInt# off#)) +#else + (k off#) +#endif + >>= \daz -> go_slow daz bs' offset' where !(I64# off#) = offset' diff --git a/serialise/serialise.cabal b/serialise/serialise.cabal index 57e8b9f..aef895c 100644 --- a/serialise/serialise.cabal +++ b/serialise/serialise.cabal @@ -30,14 +30,13 @@ cabal-version: >=1.10 category: Codec build-type: Simple tested-with: - GHC == 8.0.2, - GHC == 8.2.2, GHC == 8.4.4, GHC == 8.6.5, GHC == 8.8.3, - GHC == 8.10.1, + GHC == 8.10.7, GHC == 9.0.1, - GHC == 9.2.2 + GHC == 9.2.2, + GHC == 9.4.2 extra-source-files: ChangeLog.md @@ -71,11 +70,11 @@ library build-depends: array >= 0.4 && < 0.6, - base >= 4.7 && < 4.17, + base >= 4.7 && < 4.18, bytestring >= 0.10.4 && < 0.12, cborg == 0.2.*, containers >= 0.5 && < 0.7, - ghc-prim >= 0.3.1.0 && < 0.9, + ghc-prim >= 0.3.1.0 && < 0.10, half >= 0.2.2.3 && < 0.4, hashable >= 1.2 && < 2.0, primitive >= 0.5 && < 0.8, @@ -125,7 +124,7 @@ test-suite tests Tests.GeneralisedUTF8 build-depends: - base >= 4.7 && < 4.17, + base >= 4.7 && < 4.18, bytestring >= 0.10.4 && < 0.12, directory >= 1.0 && < 1.4, filepath >= 1.0 && < 1.5, @@ -162,7 +161,7 @@ benchmark instances Instances.Time build-depends: - base >= 4.7 && < 4.17, + base >= 4.7 && < 4.18, binary >= 0.7 && < 0.11, bytestring >= 0.10.4 && < 0.12, vector >= 0.10 && < 0.13, @@ -206,15 +205,15 @@ benchmark micro SimpleVersus build-depends: - base >= 4.7 && < 4.17, + base >= 4.7 && < 4.18, binary >= 0.7 && < 0.11, bytestring >= 0.10.4 && < 0.12, - ghc-prim >= 0.3.1.0 && < 0.9, + ghc-prim >= 0.3.1.0 && < 0.10, vector >= 0.10 && < 0.13, cborg, serialise, - aeson >= 0.7 && < 2.1, + aeson >= 0.7 && < 2.2, deepseq >= 1.0 && < 1.5, criterion >= 1.0 && < 1.6, cereal >= 0.5.2.0 && < 0.6, @@ -253,11 +252,11 @@ benchmark versus build-depends: array >= 0.4 && < 0.6, - base >= 4.7 && < 4.17, + base >= 4.7 && < 4.18, binary >= 0.7 && < 0.11, bytestring >= 0.10.4 && < 0.12, directory >= 1.0 && < 1.4, - ghc-prim >= 0.3.1.0 && < 0.9, + ghc-prim >= 0.3.1.0 && < 0.10, fail >= 4.9.0.0 && < 4.10, text >= 1.1 && < 2.1, vector >= 0.10 && < 0.13, @@ -267,7 +266,7 @@ benchmark versus filepath >= 1.0 && < 1.5, containers >= 0.5 && < 0.7, deepseq >= 1.0 && < 1.5, - aeson >= 0.7 && < 2.1, + aeson >= 0.7 && < 2.2, cereal >= 0.5.2.0 && < 0.6, half >= 0.2.2.3 && < 0.4, tar >= 0.4 && < 0.6,