diff options
author | Albert Krewinkel <albert.krewinkel@tourstream.eu> | 2017-06-27 17:55:47 +0200 |
---|---|---|
committer | Albert Krewinkel <albert@zeitkraut.de> | 2017-06-27 17:55:47 +0200 |
commit | f5f84859230568ddafb2e7e23b5d9b3e98fdbba5 (patch) | |
tree | 8c512c48e0c4de27697a25146f05267224a39072 | |
parent | 4282abbd0781cf5e6731a9b43dc8cfeb1dca58fa (diff) | |
download | pandoc-f5f84859230568ddafb2e7e23b5d9b3e98fdbba5.tar.gz |
Text.Pandoc.Lua: catch lua errors in filter functions
Replace lua errors with `LuaException`s.
-rw-r--r-- | src/Text/Pandoc/Lua.hs | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/src/Text/Pandoc/Lua.hs b/src/Text/Pandoc/Lua.hs index 3770880f3..2ee8d0847 100644 --- a/src/Text/Pandoc/Lua.hs +++ b/src/Text/Pandoc/Lua.hs @@ -196,17 +196,26 @@ runFilterFunction :: StackValue a => LuaState -> LuaFilterFunction -> a -> IO a runFilterFunction lua lf x = do pushFilterFunction lua lf Lua.push lua x - Lua.call lua 1 1 - resType <- Lua.ltype lua (-1) - case resType of - Lua.TNIL -> Lua.pop lua 1 *> return x - _ -> do - mbres <- Lua.peek lua (-1) - case mbres of - Nothing -> throwIO $ LuaException - ("Error while trying to get a filter's return " - ++ "value from lua stack.") - Just res -> res <$ Lua.pop lua 1 + z <- Lua.pcall lua 1 1 0 + if (z /= 0) + then do + msg <- Lua.peek lua (-1) + let prefix = "Error while running filter function: " + throwIO . LuaException $ + case msg of + Nothing -> prefix ++ "could not read error message" + Just msg' -> prefix ++ msg' + else do + resType <- Lua.ltype lua (-1) + case resType of + Lua.TNIL -> Lua.pop lua 1 *> return x + _ -> do + mbres <- Lua.peek lua (-1) + case mbres of + Nothing -> throwIO $ LuaException + ("Error while trying to get a filter's return " + ++ "value from lua stack.") + Just res -> res <$ Lua.pop lua 1 -- | Push the filter function to the top of the stack. pushFilterFunction :: Lua.LuaState -> LuaFilterFunction -> IO () |