Create FormatField attributes on demand.

The InstructionFormat objects make their non-value operands available as
FormatField attributes for use by predicates etc.

Compute these on demand instead of up front. This makes it possible for
the mypy tool to infer the types of these attributes from the
__getattr__ signature.
This commit is contained in:
Jakob Stoklund Olesen
2016-10-26 12:24:16 -07:00
parent ed917c394f
commit 2a8f8f79ff

View File

@@ -707,11 +707,24 @@ class InstructionFormat(object):
self.members.append(member)
yield k
# Create `FormatField` instances for the immediates.
if isinstance(k, ImmediateKind):
assert not hasattr(self, member), "Duplicate member name"
field = FormatField(self, i, member)
setattr(self, member, field)
def __getattr__(self, attr):
# type: (str) -> FormatField
"""
Make instruction format members available as attributes.
Each non-value format member becomes a corresponding `FormatField`
attribute.
"""
try:
i = self.members.index(attr)
except ValueError:
raise AttributeError(
'{} is neither a {} member or a '
.format(attr, self.name) +
'normal InstructionFormat attribute')
field = FormatField(self, i, attr)
setattr(self, attr, field)
return field
@staticmethod
def lookup(ins, outs):