on master help sign in
Merge pull request #480 from david-christiansen/fix-duplicate-libs

Prevent duplicate dynamic linking

commitf6fe5ea6e2a5f74758956996f8419b8afdf063e3 authorEdwin Brady <edwin.brady@gmail.com> dateSat 14 Sep 2013, 05:45 (13 years ago) parent822b5180a1b9d8
3 files changed+23−8
src/Idris/AbsSyntax.hs+16−7 src/Idris/REPL.hs+4−1 src/Util/DynamicLinker.hs+3
src/Idris/AbsSyntax.hs+16−7
@@ -22,6 +22,7 @@ import Control.Monad.State
2222import Data.List
2323import Data.Char
2424import Data.Either
25+import Data.Maybe
2526
2627import Debug.Trace
2728
@@ -54,13 +55,21 @@ addFlag tgt f = do i <- getIState; putIState $ i { idris_cgflags = nub $ (tgt, f
5455
5556addDyLib :: [String] -> Idris (Either DynamicLib String)
5657addDyLib libs = do i <- getIState
57− handle <- lift $ mapM (\l -> catchIO (tryLoadLib l) (\_ -> return Nothing)) libs
58− case msum handle of
59− Nothing -> return (Right $ "Could not load dynamic alternatives \"" ++
60− concat (intersperse "," libs) ++ "\"")
61− Just x -> do let ls = idris_dynamic_libs i
62− putIState $ i { idris_dynamic_libs = x:ls }
63− return (Left x)
58+ let ls = idris_dynamic_libs i
59+ case mapMaybe (findDyLib ls) libs of
60+ x:_ -> return (Left x)
61+ [] -> do
62+ handle <- lift $ mapM (\l -> catchIO (tryLoadLib l) (\_ -> return Nothing)) $ libs
63+ case msum handle of
64+ Nothing -> return (Right $ "Could not load dynamic alternatives \"" ++
65+ concat (intersperse "," libs) ++ "\"")
66+ Just x -> do putIState $ i { idris_dynamic_libs = x:ls }
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+
6473
6574addHdr :: Codegen -> String -> Idris ()
6675addHdr 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
524524 case handle of
525525 Nothing -> iFail $ "Could not load dynamic lib \"" ++ l ++ "\""
526526 Just x -> do let libs = idris_dynamic_libs i
527− putIState $ i { idris_dynamic_libs = x:libs }
527+ if x `elem` libs
528+ then do iLOG ("Tried to load duplicate library " ++ lib_name x)
529+ return ()
530+ else putIState $ i { idris_dynamic_libs = x:libs }
528531 where trim = reverse . dropWhile isSpace . reverse . dropWhile isSpace
529532process fn ListDynamic = do i <- getIState
530533 iputStrLn "Dynamic libraries:"
src/Util/DynamicLinker.hs+3
@@ -36,6 +36,9 @@ data DynamicLib = Lib { lib_name :: String
3636 , lib_handle :: DL
3737 }
3838
39+instance Eq DynamicLib where
40+ (Lib a _) == (Lib b _) = a == b
41+
3942#ifndef WINDOWS
4043tryLoadLib :: String -> IO (Maybe DynamicLib)
4144tryLoadLib lib = do exactName <- doesFileExist lib