@@ -228,55 +228,69 @@ execApp env ctxt (f, args) = do newF <- doExec env ctxt f
228228
229229execApp' :: ExecEnv -> Context -> ExecVal -> [ExecVal] -> Exec ExecVal
230230execApp' env ctxt v [] = return v -- no args is just a constant! can result from function calls
231−execApp' env ctxt (EP _ (UN "unsafePerformIO") _) (ty:action:rest) | (prim__IO, [_, v]) <- unApplyV action =
231+execApp' env ctxt (EP _ (UN "unsafePerformPrimIO") _) (ty:action:rest) | (prim__IO, [_, v]) <- unApplyV action =
232232 execApp' env ctxt v rest
233233
234−execApp' env ctxt (EP _ (UN "io_bind") _) args@(_:_:v:k:rest) | (prim__IO, [_, v']) <- unApplyV v =
234+execApp' env ctxt (EP _ (UN "prim_io_bind") _) args@(_:_:v:k:rest) | (prim__IO, [_, v']) <- unApplyV v =
235235 do v'' <- tryForce v'
236236 res <- execApp' env ctxt k [v''] >>= tryForce
237237 execApp' env ctxt res rest
238−execApp' env ctxt con@(EP _ (UN "io_return") _) args@(tp:v:rest) =
238+execApp' env ctxt con@(EP _ (UN "prim_io_return") _) args@(tp:v:rest) =
239239 do v' <- tryForce v
240240 execApp' env ctxt (mkEApp con [tp, v']) rest
241241
242242-- Special cases arising from not having access to the C RTS in the interpreter
243−execApp' env ctxt (EP _ (UN "mkForeign") _) (_:fn:EConstant (Str arg):rest)
244− | Just (FFun "putStr" _ _) <- foreignFromTT fn = do execIO (putStr arg)
245− execApp' env ctxt ioUnit rest
246−execApp' env ctxt (EP _ (UN "mkForeign") _) (_:fn:EConstant (Str f):EConstant (Str mode):rest)
247− | Just (FFun "fileOpen" _ _) <- foreignFromTT fn = do m <- case mode of
248− "r" -> return ReadMode
249− "w" -> return WriteMode
250− "a" -> return AppendMode
251− "rw" -> return ReadWriteMode
252− "wr" -> return ReadWriteMode
253− "r+" -> return ReadWriteMode
254− _ -> execFail ("Invalid mode for " ++ f ++ ": " ++ mode)
255− h <- execIO $ openFile f m
256− execApp' env ctxt (ioWrap (EHandle h)) rest
257−
258−execApp' env ctxt (EP _ (UN "mkForeign") _) (_:fn:(EHandle h):rest)
259− | Just (FFun "fileEOF" _ _) <- foreignFromTT fn = do eofp <- execIO $ hIsEOF h
260− let res = ioWrap (EConstant (I $ if eofp then 1 else 0))
261− execApp' env ctxt res rest
262−
263−execApp' env ctxt (EP _ (UN "mkForeign") _) (_:fn:(EHandle h):rest)
264− | Just (FFun "fileClose" _ _) <- foreignFromTT fn = do execIO $ hClose h
265− execApp' env ctxt ioUnit rest
266−
267−execApp' env ctxt (EP _ (UN "mkForeign") _) (_:fn:(EPtr p):rest)
268− | Just (FFun "isNull" _ _) <- foreignFromTT fn = let res = ioWrap . EConstant . I $
269− if p == nullPtr then 1 else 0
270− in execApp' env ctxt res rest
271−
272−execApp' env ctxt f@(EP _ (UN "mkForeign") _) args@(ty:fn:xs) | Just (FFun f argTs retT) <- foreignFromTT fn
273− , length xs >= length argTs =
274− do res <- stepForeign (ty:fn:take (length argTs) xs)
243+execApp' env ctxt (EP _ (UN "mkForeignPrim") _) (_:fn:EConstant (Str arg):_:rest)
244+ | Just (FFun "putStr" _ _) <- foreignFromTT fn
245+ = do execIO (putStr arg)
246+ execApp' env ctxt ioUnit rest
247+execApp' env ctxt (EP _ (UN "mkForeignPrim") _) (_:fn:_:EHandle h:_:rest)
248+ | Just (FFun "idris_readStr" _ _) <- foreignFromTT fn
249+ = do contents <- execIO $ hGetLine h
250+ execApp' env ctxt (EConstant (Str (contents ++ "\n"))) rest
251+execApp' env ctxt (EP _ (UN "mkForeignPrim") _) (_:fn:EConstant (Str f):EConstant (Str mode):rest)
252+ | Just (FFun "fileOpen" _ _) <- foreignFromTT fn
253+ = do m <- case mode of
254+ "r" -> return ReadMode
255+ "w" -> return WriteMode
256+ "a" -> return AppendMode
257+ "rw" -> return ReadWriteMode
258+ "wr" -> return ReadWriteMode
259+ "r+" -> return ReadWriteMode
260+ _ -> execFail ("Invalid mode for " ++ f ++ ": " ++ mode)
261+ h <- execIO $ openFile f m
262+ execApp' env ctxt (ioWrap (EHandle h)) (tail rest)
263+
264+execApp' env ctxt (EP _ (UN "mkForeignPrim") _) (_:fn:(EHandle h):rest)
265+ | Just (FFun "fileEOF" _ _) <- foreignFromTT fn
266+ = do eofp <- execIO $ hIsEOF h
267+ let res = ioWrap (EConstant (I $ if eofp then 1 else 0))
268+ execApp' env ctxt res (tail rest)
269+
270+execApp' env ctxt (EP _ (UN "mkForeignPrim") _) (_:fn:(EHandle h):rest)
271+ | Just (FFun "fileClose" _ _) <- foreignFromTT fn
272+ = do execIO $ hClose h
273+ execApp' env ctxt ioUnit (tail rest)
274+
275+execApp' env ctxt (EP _ (UN "mkForeignPrim") _) (_:fn:(EPtr p):rest)
276+ | Just (FFun "isNull" _ _) <- foreignFromTT fn
277+ = let res = ioWrap . EConstant . I $
278+ if p == nullPtr then 1 else 0
279+ in execApp' env ctxt res (tail rest)
280+
281+-- Throw away the 'World' argument to the foreign function
282+
283+execApp' env ctxt f@(EP _ (UN "mkForeignPrim") _) args@(ty:fn:xs)
284+ | Just (FFun f argTs retT) <- foreignFromTT fn
285+ , length xs >= length argTs =
286+ do let (args', xs') = (take (length argTs) xs, -- foreign args
287+ drop (length argTs + 1) xs) -- rest
288+ res <- stepForeign (ty:fn:args')
275289 case res of
276290 Nothing -> fail $ "Could not call foreign function \"" ++ f ++
277− "\" with args " ++ show (take (length argTs) xs)
278− Just r -> return (mkEApp r (drop (length argTs) xs))
279− | otherwise = return (mkEApp f args)
291+ "\" with args " ++ show args
292+ Just r -> return (mkEApp r xs')
293+ | otherwise = return (mkEApp f args)
280294
281295execApp' env ctxt c@(EP (DCon _ arity) n _) args =
282296 do args' <- mapM tryForce (take arity args)
@@ -502,7 +516,7 @@ stepForeign (ty:fn:args) = do let ffun = foreignFromTT fn
502516 Just f -> f args
503517 Nothing -> return Nothing
504518 return f'
505−stepForeign _ = fail "Tried to call foreign function that wasn't mkForeign"
519+stepForeign _ = fail "Tried to call foreign function that wasn't mkForeignPrim"
506520
507521mapMaybeM :: Monad m => (a -> m (Maybe b)) -> [a] -> m [b]
508522mapMaybeM f [] = return []