on master help sign in
Merge pull request #480 from david-christiansen/fix-duplicate-libs
f6fe5eaEdwin Brady
src/Idris/AbsSyntax.hs+16−7
@@ -22,6 +22,7 @@ import Control.Monad.State
22import Data.List
22import Data.List
23import Data.Char
23import Data.Char
24import Data.Either
24import Data.Either
25+import Data.Maybe
25
26
26import Debug.Trace
27import Debug.Trace
27
28
@@ -54,13 +55,21 @@ addFlag tgt f = do i <- getIState; putIState $ i { idris_cgflags = nub $ (tgt, f
54
55
55addDyLib :: [String] -> Idris (Either DynamicLib String)
56addDyLib :: [String] -> Idris (Either DynamicLib String)
56addDyLib libs = do i <- getIState
57addDyLib libs = do i <- getIState
58+ let ls = idris_dynamic_libs i
59+ case mapMaybe (findDyLib ls) libs of
60+ x:_ -> return (Left x)
61+ [] -> do
57− handle <- lift $ mapM (\l -> catchIO (tryLoadLib l) (\_ -> return Nothing)) libs
62+ handle <- lift $ mapM (\l -> catchIO (tryLoadLib l) (\_ -> return Nothing)) $ libs
58− case msum handle of
63+ case msum handle of
59− Nothing -> return (Right $ "Could not load dynamic alternatives \"" ++
64+ Nothing -> return (Right $ "Could not load dynamic alternatives \"" ++
60− concat (intersperse "," libs) ++ "\"")
65+ concat (intersperse "," libs) ++ "\"")
61− Just x -> do let ls = idris_dynamic_libs i
62− putIState $ i { idris_dynamic_libs = x:ls }
66+ Just x -> do putIState $ i { idris_dynamic_libs = x:ls }
63− return (Left x)
67+ return (Left x)
68+ where findDyLib :: [DynamicLib] -> String -> Maybe DynamicLib
69+ findDyLib [] l = Nothing
70+ findDyLib (lib:libs) l | l == lib_name lib = Just lib
71+ | otherwise = findDyLib libs l
72+
64
73
65addHdr :: Codegen -> String -> Idris ()
74addHdr :: Codegen -> String -> Idris ()
66addHdr tgt f = do i <- getIState; putIState $ i { idris_hdrs = nub $ (tgt, f) : idris_hdrs i }
75addHdr tgt f = do i <- getIState; putIState $ i { idris_hdrs = nub $ (tgt, f) : idris_hdrs i }
src/Idris/REPL.hs+4−1
@@ -524,7 +524,10 @@ process fn (DynamicLink l) = do i <- getIState
524 case handle of
524 case handle of
525 Nothing -> iFail $ "Could not load dynamic lib \"" ++ l ++ "\""
525 Nothing -> iFail $ "Could not load dynamic lib \"" ++ l ++ "\""
526 Just x -> do let libs = idris_dynamic_libs i
526 Just x -> do let libs = idris_dynamic_libs i
527+ if x `elem` libs
528+ then do iLOG ("Tried to load duplicate library " ++ lib_name x)
529+ return ()
527− putIState $ i { idris_dynamic_libs = x:libs }
530+ else putIState $ i { idris_dynamic_libs = x:libs }
528 where trim = reverse . dropWhile isSpace . reverse . dropWhile isSpace
531 where trim = reverse . dropWhile isSpace . reverse . dropWhile isSpace
529process fn ListDynamic = do i <- getIState
532process fn ListDynamic = do i <- getIState
530 iputStrLn "Dynamic libraries:"
533 iputStrLn "Dynamic libraries:"
src/Util/DynamicLinker.hs+3
@@ -36,6 +36,9 @@ data DynamicLib = Lib { lib_name :: String
36 , lib_handle :: DL
36 , lib_handle :: DL
37 }
37 }
38
38
39+instance Eq DynamicLib where
40+ (Lib a _) == (Lib b _) = a == b
41+
39#ifndef WINDOWS
42#ifndef WINDOWS
40tryLoadLib :: String -> IO (Maybe DynamicLib)
43tryLoadLib :: String -> IO (Maybe DynamicLib)
41tryLoadLib lib = do exactName <- doesFileExist lib
44tryLoadLib lib = do exactName <- doesFileExist lib