Cache Struct instances for faster conversions

This commit is contained in:
elicn
2025-10-10 12:35:20 +03:00
parent a82abfd6aa
commit f45eb7042a
+25 -25
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
#
#
# Cross Platform and Multi Architecture Advanced Binary Emulation Framework
#
@@ -25,14 +25,14 @@ class QlCoreStructs:
QL_ENDIAN.EB: '>'
}[endian]
self._fmt8 = f'{modifier}B'
self._fmt8s = f'{modifier}b'
self._fmt16 = f'{modifier}H'
self._fmt16s = f'{modifier}h'
self._fmt32 = f'{modifier}I'
self._fmt32s = f'{modifier}i'
self._fmt64 = f'{modifier}Q'
self._fmt64s = f'{modifier}q'
self._fmt8 = struct.Struct(f'{modifier}B')
self._fmt8s = struct.Struct(f'{modifier}b')
self._fmt16 = struct.Struct(f'{modifier}H')
self._fmt16s = struct.Struct(f'{modifier}h')
self._fmt32 = struct.Struct(f'{modifier}I')
self._fmt32s = struct.Struct(f'{modifier}i')
self._fmt64 = struct.Struct(f'{modifier}Q')
self._fmt64s = struct.Struct(f'{modifier}q')
handlers = {
64 : (self.pack64, self.pack64s, self.unpack64, self.unpack64s),
@@ -51,49 +51,49 @@ class QlCoreStructs:
self.unpacks = ups
def pack64(self, x: int, /) -> bytes:
return struct.pack(self._fmt64, x)
return self._fmt64.pack(x)
def pack64s(self, x: int, /) -> bytes:
return struct.pack(self._fmt64s, x)
return self._fmt64s.pack(x)
def unpack64(self, x: ReadableBuffer, /) -> int:
return struct.unpack(self._fmt64, x)[0]
return self._fmt64.unpack(x)[0]
def unpack64s(self, x: ReadableBuffer, /) -> int:
return struct.unpack(self._fmt64s, x)[0]
return self._fmt64s.unpack(x)[0]
def pack32(self, x: int, /) -> bytes:
return struct.pack(self._fmt32, x)
return self._fmt32.pack(x)
def pack32s(self, x: int, /) -> bytes:
return struct.pack(self._fmt32s, x)
return self._fmt32s.pack(x)
def unpack32(self, x: ReadableBuffer, /) -> int:
return struct.unpack(self._fmt32, x)[0]
return self._fmt32.unpack(x)[0]
def unpack32s(self, x: ReadableBuffer, /) -> int:
return struct.unpack(self._fmt32s, x)[0]
return self._fmt32s.unpack(x)[0]
def pack16(self, x: int, /) -> bytes:
return struct.pack(self._fmt16, x)
return self._fmt16.pack(x)
def pack16s(self, x: int, /) -> bytes:
return struct.pack(self._fmt16s, x)
return self._fmt16s.pack(x)
def unpack16(self, x: ReadableBuffer, /) -> int:
return struct.unpack(self._fmt16, x)[0]
return self._fmt16.unpack(x)[0]
def unpack16s(self, x: ReadableBuffer, /) -> int:
return struct.unpack(self._fmt16s, x)[0]
return self._fmt16s.unpack(x)[0]
def pack8(self, x: int, /) -> bytes:
return struct.pack(self._fmt8, x)
return self._fmt8.pack(x)
def pack8s(self, x: int, /) -> bytes:
return struct.pack(self._fmt8s, x)
return self._fmt8s.pack(x)
def unpack8(self, x: ReadableBuffer, /) -> int:
return struct.unpack(self._fmt8, x)[0]
return self._fmt8.unpack(x)[0]
def unpack8s(self, x: ReadableBuffer, /) -> int:
return struct.unpack(self._fmt8s, x)[0]
return self._fmt8s.unpack(x)[0]