Skip to content
Snippets Groups Projects
Commit a2bf3109 authored by Jens Nolte's avatar Jens Nolte
Browse files

Fix invalid opcode handling

parent cf162f10
No related branches found
No related tags found
No related merge requests found
...@@ -32,6 +32,7 @@ module Quasar.Wayland.Protocol.Core ( ...@@ -32,6 +32,7 @@ module Quasar.Wayland.Protocol.Core (
-- * Message decoder operations -- * Message decoder operations
WireFormat(..), WireFormat(..),
dropRemaining, dropRemaining,
invalidOpcode,
) where ) where
import Control.Monad (replicateM_) import Control.Monad (replicateM_)
......
...@@ -224,16 +224,23 @@ isMessageInstanceD :: Q Type -> [MessageContext] -> Q Dec ...@@ -224,16 +224,23 @@ isMessageInstanceD :: Q Type -> [MessageContext] -> Q Dec
isMessageInstanceD t msgs = instanceD (pure []) [t|IsMessage $t|] [opcodeNameD, getMessageD, putMessageD] isMessageInstanceD t msgs = instanceD (pure []) [t|IsMessage $t|] [opcodeNameD, getMessageD, putMessageD]
where where
opcodeNameD :: Q Dec opcodeNameD :: Q Dec
opcodeNameD = funD 'opcodeName (opcodeNameClauseD <$> msgs) opcodeNameD = funD 'opcodeName ((opcodeNameClause <$> msgs) <> [opcodeNameInvalidClause])
opcodeNameClauseD :: MessageContext -> Q Clause opcodeNameClause :: MessageContext -> Q Clause
opcodeNameClauseD msg = clause [litP (integerL (fromIntegral msg.msgSpec.opcode))] (normalB ([|Just $(stringE msg.msgSpec.name)|])) [] opcodeNameClause msg = clause [litP (integerL (fromIntegral msg.msgSpec.opcode))] (normalB ([|Just $(stringE msg.msgSpec.name)|])) []
opcodeNameInvalidClause :: Q Clause
opcodeNameInvalidClause = clause [wildP] (normalB ([|Nothing|])) []
getMessageD :: Q Dec getMessageD :: Q Dec
getMessageD = funD 'getMessage (getMessageClauseD <$> msgs) getMessageD = funD 'getMessage ((getMessageClause <$> msgs) <> [getMessageInvalidOpcodeClause])
getMessageClauseD :: MessageContext -> Q Clause getMessageClause :: MessageContext -> Q Clause
getMessageClauseD msg = clause [wildP, litP (integerL (fromIntegral msg.msgSpec.opcode))] (normalB getMessageE) [] getMessageClause msg = clause [wildP, litP (integerL (fromIntegral msg.msgSpec.opcode))] (normalB getMessageE) []
where where
getMessageE :: Q Exp getMessageE :: Q Exp
getMessageE = applyA (conE (msg.msgConName)) ((\argT -> [|getArgument @($argT)|]) . argumentSpecType <$> msg.msgSpec.arguments) getMessageE = applyA (conE (msg.msgConName)) ((\argT -> [|getArgument @($argT)|]) . argumentSpecType <$> msg.msgSpec.arguments)
getMessageInvalidOpcodeClause :: Q Clause
getMessageInvalidOpcodeClause = do
let object = mkName "object"
let opcode = mkName "opcode"
clause [varP object, varP opcode] (normalB [|invalidOpcode $(varE object) $(varE opcode)|]) []
putMessageD :: Q Dec putMessageD :: Q Dec
putMessageD = funD 'putMessage (putMessageClauseD <$> msgs) putMessageD = funD 'putMessage (putMessageClauseD <$> msgs)
putMessageClauseD :: MessageContext -> Q Clause putMessageClauseD :: MessageContext -> Q Clause
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment