cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

source.py (2095B)


      1#
      2# QAPI frontend source file info
      3#
      4# Copyright (c) 2019 Red Hat Inc.
      5#
      6# Authors:
      7#  Markus Armbruster <armbru@redhat.com>
      8#
      9# This work is licensed under the terms of the GNU GPL, version 2.
     10# See the COPYING file in the top-level directory.
     11
     12import copy
     13from typing import List, Optional, TypeVar
     14
     15
     16class QAPISchemaPragma:
     17    # Replace with @dataclass in Python 3.7+
     18    # pylint: disable=too-few-public-methods
     19
     20    def __init__(self) -> None:
     21        # Are documentation comments required?
     22        self.doc_required = False
     23        # Commands whose names may use '_'
     24        self.command_name_exceptions: List[str] = []
     25        # Commands allowed to return a non-dictionary
     26        self.command_returns_exceptions: List[str] = []
     27        # Types whose member names may violate case conventions
     28        self.member_name_exceptions: List[str] = []
     29
     30
     31class QAPISourceInfo:
     32    T = TypeVar('T', bound='QAPISourceInfo')
     33
     34    def __init__(self, fname: str, parent: Optional['QAPISourceInfo']):
     35        self.fname = fname
     36        self.line = 1
     37        self.parent = parent
     38        self.pragma: QAPISchemaPragma = (
     39            parent.pragma if parent else QAPISchemaPragma()
     40        )
     41        self.defn_meta: Optional[str] = None
     42        self.defn_name: Optional[str] = None
     43
     44    def set_defn(self, meta: str, name: str) -> None:
     45        self.defn_meta = meta
     46        self.defn_name = name
     47
     48    def next_line(self: T) -> T:
     49        info = copy.copy(self)
     50        info.line += 1
     51        return info
     52
     53    def loc(self) -> str:
     54        return f"{self.fname}:{self.line}"
     55
     56    def in_defn(self) -> str:
     57        if self.defn_name:
     58            return "%s: In %s '%s':\n" % (self.fname,
     59                                          self.defn_meta, self.defn_name)
     60        return ''
     61
     62    def include_path(self) -> str:
     63        ret = ''
     64        parent = self.parent
     65        while parent:
     66            ret = 'In file included from %s:\n' % parent.loc() + ret
     67            parent = parent.parent
     68        return ret
     69
     70    def __str__(self) -> str:
     71        return self.include_path() + self.in_defn() + self.loc()