@@ -14,6 +14,7 @@ module Python.Inline.Literal
1414 , fromPy'
1515 ) where
1616
17+ import Control.Exception (evaluate )
1718import Control.Monad
1819import Control.Monad.Catch
1920import Control.Monad.Trans.Cont
@@ -23,6 +24,7 @@ import Data.Int
2324import Data.Word
2425import Data.ByteString qualified as BS
2526import Data.ByteString.Unsafe qualified as BS
27+ import Data.ByteString.Short qualified as SBS
2628import Data.ByteString.Lazy qualified as BL
2729import Data.Set qualified as Set
2830import Data.Map.Strict qualified as Map
@@ -577,6 +579,36 @@ instance ToPy BL.ByteString where
577579instance FromPy BL. ByteString where
578580 basicFromPy = fmap BL. fromStrict . basicFromPy
579581
582+
583+ -- | @since NEXT_VERSION@. Accepts @bytes@ and @bytearray@
584+ instance FromPy SBS. ShortByteString where
585+ basicFromPy py = pyIO $ do
586+ [CU. exp | int { PyBytes_Check($(PyObject* py)) } |] >>= \ case
587+ TRUE -> do
588+ sz <- [CU. exp | int64_t { PyBytes_GET_SIZE( $(PyObject* py)) } |]
589+ buf <- [CU. exp | char* { PyBytes_AS_STRING($(PyObject* py)) } |]
590+ fini buf (fromIntegral sz)
591+ _ -> [CU. exp | int { PyByteArray_Check($(PyObject* py)) } |] >>= \ case
592+ TRUE -> do
593+ sz <- [CU. exp | int64_t { PyByteArray_GET_SIZE( $(PyObject* py)) } |]
594+ buf <- [CU. exp | char* { PyByteArray_AS_STRING($(PyObject* py)) } |]
595+ fini buf (fromIntegral sz)
596+ _ -> throwM BadPyType
597+ where
598+ fini buf sz = do
599+ bs <- BS. unsafePackCStringLen (buf, sz)
600+ evaluate $ SBS. toShort bs
601+
602+ -- | @since NEXT_VERSION@. Converted to @bytes@
603+ instance ToPy SBS. ShortByteString where
604+ basicToPy bs = pyIO $ SBS. useAsCStringLen bs $ \ (ptr,len) -> do
605+ let c_len = fromIntegral len :: CLLong
606+ py <- [CU. exp | PyObject* { PyBytes_FromStringAndSize($(char* ptr), $(long long c_len)) }|]
607+ case py of
608+ NULL -> unsafeRunPy mustThrowPyError
609+ _ -> return py
610+
611+
580612-- | @since NEXT_VERSION@.
581613instance ToPy T. Text where
582614 -- NOTE: Is there ore efficient way to access
0 commit comments