diff options
Diffstat (limited to '')
-rw-r--r-- | ipc/ipdl/ipdl/checker.py | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/ipc/ipdl/ipdl/checker.py b/ipc/ipdl/ipdl/checker.py new file mode 100644 index 0000000000..c93dc3e0e8 --- /dev/null +++ b/ipc/ipdl/ipdl/checker.py @@ -0,0 +1,79 @@ +# vim: set ts=4 sw=4 tw=99 et: +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +import sys +from ipdl.ast import Visitor, ASYNC + + +class SyncMessageChecker(Visitor): + syncMsgList = [] + seenProtocols = [] + seenSyncMessages = [] + + def __init__(self, syncMsgList): + SyncMessageChecker.syncMsgList = syncMsgList + self.errors = [] + + def prettyMsgName(self, msg): + return "%s::%s" % (self.currentProtocol, msg) + + def errorUnknownSyncMessage(self, loc, msg): + self.errors.append("%s: error: Unknown sync IPC message %s" % (str(loc), msg)) + + def errorAsyncMessageCanRemove(self, loc, msg): + self.errors.append( + "%s: error: IPC message %s is async, can be delisted" % (str(loc), msg) + ) + + def visitProtocol(self, p): + self.errors = [] + self.currentProtocol = p.name + SyncMessageChecker.seenProtocols.append(p.name) + Visitor.visitProtocol(self, p) + + def visitMessageDecl(self, md): + pn = self.prettyMsgName(md.name) + if md.sendSemantics is not ASYNC: + if pn not in SyncMessageChecker.syncMsgList: + self.errorUnknownSyncMessage(md.loc, pn) + SyncMessageChecker.seenSyncMessages.append(pn) + elif pn in SyncMessageChecker.syncMsgList: + self.errorAsyncMessageCanRemove(md.loc, pn) + + @staticmethod + def getFixedSyncMessages(): + return set(SyncMessageChecker.syncMsgList) - set( + SyncMessageChecker.seenSyncMessages + ) + + +def checkSyncMessage(tu, syncMsgList, errout=sys.stderr): + checker = SyncMessageChecker(syncMsgList) + tu.accept(checker) + if len(checker.errors): + for error in checker.errors: + print(error, file=errout) + return False + return True + + +def checkFixedSyncMessages(config, errout=sys.stderr): + fixed = SyncMessageChecker.getFixedSyncMessages() + error_free = True + for item in fixed: + protocol = item.split("::")[0] + # Ignore things like sync messages in test protocols we didn't compile. + # Also, ignore platform-specific IPC messages. + if ( + protocol in SyncMessageChecker.seenProtocols + and "platform" not in config.options(item) + ): + print( + "Error: Sync IPC message %s not found, it appears to be fixed.\n" + "Please remove it from sync-messages.ini." % item, + file=errout, + ) + error_free = False + return error_free |