Compare commits

..

No commits in common. "d2378812ce6e8c27ae02a7ca707c6ffa537858b1" and "5373ddaf9cfd531bbf49a1021c2c46e47cc605c9" have entirely different histories.

6 changed files with 23 additions and 36 deletions

View File

@ -5,8 +5,6 @@ module IRC.Plugins.Loader ( load ) where
import qualified Data.HashMap.Lazy as M import qualified Data.HashMap.Lazy as M
import IRC.Plugins.Plugin
import Control.Exception ( catch, ErrorCall ) import Control.Exception ( catch, ErrorCall )
import GHC.Exts ( addrToAny# ) import GHC.Exts ( addrToAny# )
import GHC.Ptr ( Ptr(..) ) import GHC.Ptr ( Ptr(..) )
@ -14,9 +12,13 @@ import System.Info ( os, arch )
import GHCi.ObjLink import GHCi.ObjLink
import Encoding import Encoding
load :: PluginSet -> String -> IO (Either String PluginSet) type PluginSet = M.HashMap String Plugin
load set path = do
initObjLinker RetainCAFs data Plugin = Plugin { wew :: Int,
lad :: Int }
load :: PluginSet -> IO (Either String (IO PluginSet))
load = do initObjLinker RetainCAFs
loadObj "Plugin.o" loadObj "Plugin.o"
_ret <- resolveObjs _ret <- resolveObjs
ptr <- lookupSymbol (mangleSymbol Nothing "Plugin" "f") ptr <- lookupSymbol (mangleSymbol Nothing "Plugin" "f")
@ -25,15 +27,11 @@ load set path = do
Just (Ptr addr) -> case addrToAny# addr of Just (Ptr addr) -> case addrToAny# addr of
(# f #) -> return $ Right f (# f #) -> return $ Right f
unload :: PluginSet -> String -> IO PluginSet unload :: String -> IO PluginSet
unload set plugin = catch unloadPlugin exceptionHandler unload plugin = catch (unloadObj $ plugin <> ".o") exceptionHandler
where exceptionHandler :: ErrorCall -> IO PluginSet
exceptionHandler _ = return set
unloadPlugin :: IO PluginSet exceptionHandler :: ErrorCall -> IO PluginSet
unloadPlugin = do exceptionHandler _ = return ()
unloadObj $ plugin <> ".o"
return $ M.delete plugin set
mangleSymbol :: Maybe String -> String -> String -> String mangleSymbol :: Maybe String -> String -> String -> String
mangleSymbol pkg module' valsym = mangleSymbol pkg module' valsym =

View File

@ -1,8 +0,0 @@
module IRC.Plugins.Plugin ( PluginSet, Plugin(..) ) where
import qualified Data.HashMap.Lazy as M
type PluginSet = M.HashMap String Plugin
data Plugin = Plugin { pluginEvent :: String, -- e.g. PRIVMSG
pluginEntry :: Int }

View File

@ -1,4 +1,3 @@
include_rules include_rules
: Plugin.hs |> ghc $(GHCFLAGS) -c %f |> %B.o %B.hi : foreach *.hs |> ghc $(GHCFLAGS) -c %f |> %B.o %B.hi
: Loader.hs | Plugin.hi |> ghc $(GHCFLAGS) -c %f |> %B.o %B.hi

View File

@ -1,4 +1,4 @@
include_rules include_rules
: foreach *.hs | IRC/*.hi IRC/Plugins/*.hi |> ghc $(GHCFLAGS) -c %f |> %B.o %B.hi : foreach *.hs | IRC/*.hi |> ghc $(GHCFLAGS) -c %f |> %B.o %B.hi
: *.o IRC/*.o IRC/Plugins/*.o |> ghc -o Main %f |> Main : *.o IRC/*.o |> ghc -o Main %f |> Main

View File

@ -1 +1 @@
GHCFLAGS += -i$(CWD) -Wall -O3 GHCFLAGS += -Wall -O3

View File

@ -9,8 +9,6 @@ if ! command -v tup >/dev/null; then
exit 1 exit 1
fi fi
export CWD="$(readlink -f .)"
case $1 in case $1 in
run) run)
$0 build >&2 || exit 1 $0 build >&2 || exit 1
@ -24,7 +22,7 @@ case $1 in
tup >&2 tup >&2
;; ;;
clean) clean)
rm -f Main *.o *.hi IRC/*.o IRC/*.hi IRC/Plugins/*.o IRC/Plugins/*.hi rm -f Main *.o *.hi IRC/*.o IRC/*.hi
;; ;;
*) *)
usage usage