git.iko.soy/typeable/pandoc
on master help sign in
Lua filters: store constructors in registry

Lua functions used to construct AST element values are stored in the Lua registry for quicker access. Getting a value from the registry is much faster than getting a global value (partly to idiosyncrasies of hslua); this change results in a considerable performance boost.

commit517f65a7cc3e94b9c4ad574369a32c48e0a95be6 authorAlbert Krewinkel <albert@zeitkraut.de> dateTue 23 Jan 2018, 21:29 (9 years ago) parent2e0bb77
3 files changed+29−3
src/Text/Pandoc/Lua/Init.hs+25 src/Text/Pandoc/Lua/Module/Pandoc.hs+1−1 src/Text/Pandoc/Lua/Util.hs+3−2
src/Text/Pandoc/Lua/Init.hs+25
@@ -34,6 +34,7 @@ module Text.Pandoc.Lua.Init
3434 ) where
3535
3636import Control.Monad.Trans (MonadIO (..))
37+import Data.Data (Data, dataTypeConstrs, dataTypeOf, showConstr)
3738import Data.IORef (newIORef, readIORef)
3839import Data.Version (Version (versionBranch))
3940import Foreign.Lua (Lua, LuaException (..))
@@ -48,6 +49,7 @@ import Text.Pandoc.Lua.Util (loadScriptFromDataDir)
4849
4950import qualified Foreign.Lua as Lua
5051import qualified Foreign.Lua.Module.Text as Lua
52+import qualified Text.Pandoc.Definition as Pandoc
5153
5254-- | Run the lua interpreter, using pandoc's default way of environment
5355-- initalization.
@@ -84,3 +86,26 @@ initLuaState luaPkgParams = do
8486 Lua.setglobal "PANDOC_API_VERSION"
8587 installPandocPackageSearcher luaPkgParams
8688 loadScriptFromDataDir (luaPkgDataDir luaPkgParams) "init.lua"
89+ putConstructorsInRegistry
90+
91+putConstructorsInRegistry :: Lua ()
92+putConstructorsInRegistry = do
93+ Lua.getglobal "pandoc"
94+ constrsToReg $ Pandoc.Pandoc mempty mempty
95+ constrsToReg $ Pandoc.Str mempty
96+ constrsToReg $ Pandoc.Para mempty
97+ constrsToReg $ Pandoc.Meta mempty
98+ constrsToReg $ Pandoc.MetaList mempty
99+ constrsToReg $ Pandoc.Citation mempty mempty mempty Pandoc.AuthorInText 0 0
100+ putInReg "Attr" -- used for Attr type alias
101+ Lua.pop 1
102+ where
103+ constrsToReg :: Data a => a -> Lua ()
104+ constrsToReg = mapM_ putInReg . map showConstr . dataTypeConstrs . dataTypeOf
105+
106+ putInReg :: String -> Lua ()
107+ putInReg name = do
108+ Lua.push ("pandoc." ++ name) -- name in registry
109+ Lua.push name -- in pandoc module
110+ Lua.rawget (Lua.nthFromTop 3)
111+ Lua.rawset Lua.registryindex
src/Text/Pandoc/Lua/Module/Pandoc.hs+1−1
@@ -82,7 +82,7 @@ readDoc content formatSpecOrNil = do
8282 res <- liftIO $ runIO $ r def{ readerExtensions = es } (pack content)
8383 case res of
8484 Right pd -> (1 :: NumResults) <$ Lua.push pd -- success, push Pandoc
85− Left s -> Lua.raiseError (show s) -- error while reading
85+ Left s -> Lua.raiseError (show s) -- error while reading
8686 _ -> Lua.raiseError "Only string formats are supported at the moment."
8787
8888-- | Pipes input through a command.
src/Text/Pandoc/Lua/Util.hs+3−2
@@ -50,7 +50,7 @@ import Control.Monad (when)
5050import Control.Monad.Catch (finally)
5151import Data.ByteString.Char8 (unpack)
5252import Foreign.Lua (FromLuaStack (..), NumResults, Lua, NumArgs, StackIndex,
53− ToLuaStack (..), ToHaskellFunction, getglobal')
53+ ToLuaStack (..), ToHaskellFunction)
5454import Foreign.Lua.Api (Status, call, pop, rawget, rawgeti, rawset, rawseti)
5555import Text.Pandoc.Class (readDataFile, runIOorExplode, setUserDataDir)
5656
@@ -131,7 +131,8 @@ class PushViaCall a where
131131
132132instance PushViaCall (Lua ()) where
133133 pushViaCall' fn pushArgs num = do
134− getglobal' fn
134+ Lua.push fn
135+ Lua.rawget (Lua.registryindex)
135136 pushArgs
136137 call num 1
137138