From beaf733bae2acdf2cc1a2b1234e4532a0ccc655d Mon Sep 17 00:00:00 2001 From: krasimir Date: Fri, 24 Dec 2004 12:12:28 +0000 Subject: [PATCH] [project @ 2004-12-24 12:12:28 by krasimir] minor performance update for withCAStringLen and newCAStringLen functions. We don't need to calculate the string length twice. --- Foreign/C/String.hs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/Foreign/C/String.hs b/Foreign/C/String.hs index b03d32b..720330c 100644 --- a/Foreign/C/String.hs +++ b/Foreign/C/String.hs @@ -278,12 +278,10 @@ newCAStringLen str = do newCAStringLen str = do ptr <- mallocArray0 len let - go [] n = n `seq` return () -- make it strict in n + go [] n = n `seq` return n -- make it strict in n go (c:cs) n = do pokeElemOff ptr n (castCharToCChar c); go cs (n+1) - go str 0 + len <- go str 0 return (ptr, len) - where - len = length str #endif -- | Marshal a Haskell string into a NUL terminated C string using temporary @@ -325,13 +323,11 @@ withCAStringLen str act = withArray (charsToCChars str) $ act . pairLength str withCAStringLen str f = allocaArray len $ \ptr -> let - go [] n = n `seq` return () -- make it strict in n + go [] n = n `seq` return n -- make it strict in n go (c:cs) n = do pokeElemOff ptr n (castCharToCChar c); go cs (n+1) in do - go str 0 + len <- go str 0 f (ptr,len) - where - len = length str #endif -- auxiliary definitions -- 1.7.10.4