@@ -285,6 +285,12 @@ execApp' env ctxt (EP _ (UN "mkForeignPrim") _) (_:fn:(EPtr p):rest)
285285 if p == nullPtr then 1 else 0
286286 in execApp' env ctxt res (tail rest)
287287
288+-- A foreign-returned char* has to be tested for NULL sometimes
289+execApp' env ctxt (EP _ (UN "mkForeignPrim") _) (_:fn:EConstant (Str s):rest)
290+ | Just (FFun "isNull" _ _) <- foreignFromTT fn
291+ = let res = ioWrap . EConstant . I $ 0
292+ in execApp' env ctxt res (tail rest)
293+
288294-- Throw away the 'World' argument to the foreign function
289295
290296execApp' env ctxt f@(EP _ (UN "mkForeignPrim") _) args@(ty:fn:xs)
@@ -440,9 +446,10 @@ call (FFun name argTypes retType) args =
440446 res <- execIO $ callFFI h retCChar (prepArgs args)
441447 return (EConstant (Ch (castCCharToChar res)))
442448 call' (Fun _ h) args FString = do res <- execIO $ callFFI h retCString (prepArgs args)
443− hStr <- execIO $ peekCString res
444−-- lift $ free res
445− return (EConstant (Str hStr))
449+ if res == nullPtr
450+ then return (EPtr res)
451+ else do hStr <- execIO $ peekCString res
452+ return (EConstant (Str hStr))
446453
447454 call' (Fun _ h) args FPtr = EPtr <$> (execIO $ callFFI h (retPtr retVoid) (prepArgs args))
448455 call' (Fun _ h) args FUnit = do _ <- execIO $ callFFI h retVoid (prepArgs args)