Thread (1 message) 1 message, 1 author, 2023-05-23

Re: [patch net-next v1 1/2] tools: ynl: Use dict of predefined Structs to decode scalar types

From: Donald Hunter <donald.hunter@gmail.com>
Date: 2023-05-23 09:00:44
Also in: linux-doc

Jakub Kicinski [off-list ref] writes:
On Sun, 21 May 2023 18:07:32 +0100 Donald Hunter wrote:
quoted
Use a dict of predefined Struct() objects to decode scalar types in native,
big or little endian format. This removes the repetitive code for the
scalar variants and ensures all the signed variants are supported.
quoted
@@ -115,17 +116,17 @@ class NlAttr:
         return self.raw
 
     def as_c_array(self, type):
-        format, _ = self.type_formats[type]
-        return list({ x[0] for x in struct.iter_unpack(format, self.raw) })
+        format = self.get_format(type)
+        return list({ x[0] for x in format.iter_unpack(self.raw) })
I probably asked about this before, and maybe not the question 
for this series but - why list({ ... }) and not [...]?
It looks like I cargo-culted something there, and it's just plain
wrong. Reading it now, it's clearly a set comprehension coerced into a
list, which could well change ordering.

I'll fix this in the next version.
quoted
         else:
-            raise Exception(f'Unknown type at {space} {name} {value} {attr["type"]}')
+            try:
+                format = NlAttr.get_format(attr['type'], attr.byte_order)
+                attr_payload = format.pack(int(value))
+            except:
+                raise Exception(f'Unknown type at {space} {name} {value} {attr["type"]}')
Could we do:

	elif attr["type"] in NlAttr.type_formats:

instead? Maybe my C brain treats exceptions as too exceptional..
Good suggestion, that's much cleaner.
quoted
+            elif attr_spec["type"]:
+                try:
+                    decoded = attr.as_scalar(attr_spec['type'], attr_spec.byte_order)
+                except:
+                    raise Exception(f'Unknown {attr_spec["type"]} with name {attr_spec["name"]}')
Same here.
Ack.
Nice cleanup!
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help