@@ -285,6 +285,12 @@ execApp' env ctxt (EP _ (UN "mkForeignPrim") _) (_:fn:(EPtr p):rest)
285 if p == nullPtr then 1 else 0
285 if p == nullPtr then 1 else 0
286 in execApp' env ctxt res (tail rest)
286 in execApp' env ctxt res (tail rest)
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)
288-- Throw away the 'World' argument to the foreign function
294-- Throw away the 'World' argument to the foreign function
290execApp' env ctxt f@(EP _ (UN "mkForeignPrim") _) args@(ty:fn:xs)
296execApp' env ctxt f@(EP _ (UN "mkForeignPrim") _) args@(ty:fn:xs)
@@ -440,9 +446,10 @@ call (FFun name argTypes retType) args =
440 res <- execIO $ callFFI h retCChar (prepArgs args)
446 res <- execIO $ callFFI h retCChar (prepArgs args)
441 return (EConstant (Ch (castCCharToChar res)))
447 return (EConstant (Ch (castCCharToChar res)))
442 call' (Fun _ h) args FString = do res <- execIO $ callFFI h retCString (prepArgs args)
448 call' (Fun _ h) args FString = do res <- execIO $ callFFI h retCString (prepArgs args)
450+ then return (EPtr res)
443− hStr <- execIO $ peekCString res
451+ else do hStr <- execIO $ peekCString res
445− return (EConstant (Str hStr))
452+ return (EConstant (Str hStr))
447 call' (Fun _ h) args FPtr = EPtr <$> (execIO $ callFFI h (retPtr retVoid) (prepArgs args))
454 call' (Fun _ h) args FPtr = EPtr <$> (execIO $ callFFI h (retPtr retVoid) (prepArgs args))
448 call' (Fun _ h) args FUnit = do _ <- execIO $ callFFI h retVoid (prepArgs args)
455 call' (Fun _ h) args FUnit = do _ <- execIO $ callFFI h retVoid (prepArgs args)