From b247f120d5ccd4ca1a3b342e3f6847ae99a02ad8 Mon Sep 17 00:00:00 2001 From: Luke Kenneth Casson Leighton Date: Sun, 11 Jun 2023 13:27:23 +0100 Subject: [PATCH] temporary hack-revert, the original is now in branch "paths" Revert "insndb/core: switch Fields to Dict class" This reverts commit 963fa4fcadf76740083d9fce3ffe986a81f247fe. --- src/openpower/insndb/core.py | 61 +++++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 25 deletions(-) diff --git a/src/openpower/insndb/core.py b/src/openpower/insndb/core.py index 69e0101b..2d0730c7 100644 --- a/src/openpower/insndb/core.py +++ b/src/openpower/insndb/core.py @@ -778,7 +778,7 @@ class Fields(Dict, datatype=type("Bits", (Tuple,), {}, datatype=int)): yield from self.__mapping.items() -class Operands(Dict, datatype=object): +class Operands: __GPR_PAIRS = ( _Reg.RTp, _Reg.RSp, @@ -836,10 +836,10 @@ class Operands(Dict, datatype=object): if "=" in operand: (name, value) = operand.split("=") - mapping[name] = (StaticOperand, ( - ("name", name), - ("value", int(value)), - )) + mapping[name] = (StaticOperand, { + "name": name, + "value": int(value), + }) else: name = operand if name.endswith(")"): @@ -873,37 +873,48 @@ class Operands(Dict, datatype=object): cls = CR5Operand if imm_name is not None: - mapping[imm_name] = (imm_cls, (("name", imm_name),)) - mapping[name] = (cls, (("name", name),)) + mapping[imm_name] = (imm_cls, {"name": imm_name}) + mapping[name] = (cls, {"name": name}) + + static = [] + dynamic = [] + for (name, (cls, kwargs)) in mapping.items(): + kwargs = dict(kwargs) + kwargs["name"] = name + if issubclass(cls, StaticOperand): + static.append((cls, kwargs)) + elif issubclass(cls, DynamicOperand): + dynamic.append((cls, kwargs)) + else: + raise ValueError(name) - return super().__init__(mapping) + self.__mapping = mapping + self.__static = tuple(static) + self.__dynamic = tuple(dynamic) - @walkmethod - def walk(clsself, match=None): - for (key, (cls, pairs)) in clsself.items(): - yield ("/".join((key, "class")), cls.__name__) - for (subkey, value) in pairs: - if subkey == "name": - continue - path = "/".join((key, subkey)) - yield (path, value) + return super().__init__() def __iter__(self): - for (key, items) in self.items(): + for (_, items) in self.__mapping.items(): (cls, kwargs) = items - yield (cls, dict(kwargs)) + yield (cls, kwargs) - @staticmethod - def filter(cls): - return lambda pair: isinstance(pair[0], cls) + def __repr__(self): + return self.__mapping.__repr__() - @cached_property + def __contains__(self, key): + return self.__mapping.__contains__(key) + + def __getitem__(self, key): + return self.__mapping.__getitem__(key) + + @property def static(self): - return filter(self.__class__.filter(StaticOperand), self) + return self.__static @property def dynamic(self): - return filter(self.__class__.filter(DynamicOperand), self) + return self.__dynamic class Arguments(tuple): -- 2.30.2