From 5d6f1f42eec48ae1671e54cdd127f39318416498 Mon Sep 17 00:00:00 2001 From: Tom Smeding Date: Sun, 10 May 2026 17:54:45 +0100 Subject: Generate renderer functions using TH These take (and project from) a data type instead of hash maps, _and_ use text-builder-linear, _and_ have the full template inlined. The result is that this is the fastest renderer yet. --- src/EscapeXML.hs | 37 ------------------------------------- 1 file changed, 37 deletions(-) delete mode 100644 src/EscapeXML.hs (limited to 'src/EscapeXML.hs') diff --git a/src/EscapeXML.hs b/src/EscapeXML.hs deleted file mode 100644 index 662d2ed..0000000 --- a/src/EscapeXML.hs +++ /dev/null @@ -1,37 +0,0 @@ -{-# LANGUAGE BangPatterns #-} -{-# LANGUAGE MagicHash #-} -{-# LANGUAGE UnboxedTuples #-} -{-# LANGUAGE UnliftedFFITypes #-} -module EscapeXML (escapeXML) where - -import Data.Array.Byte -import Data.Text.Internal -import Foreign.C.Types -import GHC.Exts -import GHC.IO (IO(IO)) -import System.IO.Unsafe (unsafePerformIO) - - -foreign import ccall unsafe "tirclogv_escapexml_len" - c_escapexml_len :: ByteArray# -> CSize -> CSize -> IO CSize - -foreign import ccall unsafe "tirclogv_escapexml" - c_escapexml :: MutableByteArray# RealWorld -> ByteArray# -> CSize -> CSize -> IO () - -{-# NOINLINE escapeXML #-} -escapeXML :: Text -> Text -escapeXML (Text (ByteArray src#) off len) = unsafePerformIO $ do - let offCS = fromIntegral @Int @CSize off - lenCS = fromIntegral @Int @CSize len - - reslen <- c_escapexml_len src# offCS lenCS - let !reslenI@(I# reslen#) = fromIntegral @CSize @Int reslen - - MutableByteArray dst# <- - IO $ \s -> case newByteArray# reslen# s of - (# s', mba# #) -> (# s', MutableByteArray mba# #) - c_escapexml dst# src# offCS lenCS - ba <- IO $ \s -> case unsafeFreezeByteArray# dst# s of - (# s', ba# #) -> (# s', ByteArray ba# #) - - return (Text ba 0 reslenI) -- cgit v1.3.1