Skip to content

Commit

Permalink
Move lru_cache definitions to __init__ (#17)
Browse files Browse the repository at this point in the history
Using the lru_cache decorators on class methods, the ones that have a reference to `self`,
will also cache self. So we move it to the __init__ of the class

(DIS-2913)
  • Loading branch information
Miauwkeru committed Feb 21, 2024
1 parent f628545 commit 5b9f2bc
Showing 1 changed file with 5 additions and 4 deletions.
9 changes: 5 additions & 4 deletions dissect/squashfs/squashfs.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@ def __init__(self, fh: BinaryIO):
self.minor = self.sb.s_minor
self.size = self.sb.bytes_used

self._read_block = lru_cache(1024)(self._read_block)
self._lookup_id = lru_cache(1024)(self._lookup_id)
self._lookup_inode = lru_cache(1024)(self._lookup_inode)
self._lookup_fragment = lru_cache(1024)(self._lookup_fragment)

self._compression_options = None
if (self.sb.flags >> c_squashfs.SQUASHFS_COMP_OPT) & 1:
self._compression_options = self._read_block(len(self.sb))[1]
Expand Down Expand Up @@ -131,7 +136,6 @@ def _read_metadata(self, block: int, offset: int, length: int) -> tuple[int, int

return block, offset, b"".join(result)

@lru_cache(1024)
def _read_block(self, block: int, length: Optional[int] = None) -> tuple[int, bytes]:
if length is not None:
# Data block
Expand Down Expand Up @@ -162,21 +166,18 @@ def _read_fragment(self, fragment: int, offset: int, length: int) -> bytes:
_, data = self._read_block(entry.start_block, entry.size)
return data[offset : offset + length]

@lru_cache(1024)
def _lookup_id(self, id: int) -> int:
block, offset = divmod(id * 4, c_squashfs.SQUASHFS_METADATA_SIZE)
_, _, data = self._read_metadata(self.id_table[block], offset, 4)
return struct.unpack("<I", data)[0]

@lru_cache(1024)
def _lookup_inode(self, inode_number: int) -> INode:
if inode_number <= 0 or inode_number > self.sb.inodes:
raise IndexError(f"inode number out of bounds (1, {self.sb.inodes}): {inode_number}")
block, offset = divmod((inode_number - 1) * 8, c_squashfs.SQUASHFS_METADATA_SIZE)
_, _, data = self._read_metadata(self.lookup_table[block], offset, 8)
return self.get(struct.unpack("<Q", data)[0])

@lru_cache(1024)
def _lookup_fragment(self, fragment: int) -> bytes:
fragment_offset = fragment * len(c_squashfs.squashfs_fragment_entry)
block, offset = divmod(fragment_offset, c_squashfs.SQUASHFS_METADATA_SIZE)
Expand Down

0 comments on commit 5b9f2bc

Please sign in to comment.