Skip to content

Commit 59ebfdd

Browse files
committed
Cache memory accessors for faster access
1 parent f45eb70 commit 59ebfdd

File tree

1 file changed

+33
-28
lines changed

1 file changed

+33
-28
lines changed

qiling/os/memory.py

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,31 @@ def __init__(self, ql: Qiling, pagesize: int = 0x1000):
6464
# make sure pagesize is a power of 2
6565
assert self.pagesize & (self.pagesize - 1) == 0, 'pagesize has to be a power of 2'
6666

67+
self._packers = {
68+
(1, True): ql.pack8s,
69+
(2, True): ql.pack16s,
70+
(4, True): ql.pack32s,
71+
(8, True): ql.pack64s,
72+
73+
(1, False): ql.pack8,
74+
(2, False): ql.pack16,
75+
(4, False): ql.pack32,
76+
(8, False): ql.pack64
77+
}
78+
79+
self._unpackers = {
80+
(1, True): ql.unpack8s,
81+
(2, True): ql.unpack16s,
82+
(4, True): ql.unpack32s,
83+
(8, True): ql.unpack64s,
84+
85+
(1, False): ql.unpack8,
86+
(2, False): ql.unpack16,
87+
(4, False): ql.unpack32,
88+
(8, False): ql.unpack64
89+
}
90+
91+
6792
def __read_string(self, addr: int) -> str:
6893
ret = bytearray()
6994
c = self.read(addr, 1)
@@ -344,22 +369,12 @@ def read_ptr(self, addr: int, size: int = 0, *, signed = False) -> int:
344369
if not size:
345370
size = self.ql.arch.pointersize
346371

347-
__unpack = ({
348-
1: self.ql.unpack8s,
349-
2: self.ql.unpack16s,
350-
4: self.ql.unpack32s,
351-
8: self.ql.unpack64s
352-
} if signed else {
353-
1: self.ql.unpack8,
354-
2: self.ql.unpack16,
355-
4: self.ql.unpack32,
356-
8: self.ql.unpack64
357-
}).get(size)
358-
359-
if __unpack is None:
372+
try:
373+
_unpack = self._unpackers[(size, signed)]
374+
except KeyError:
360375
raise QlErrorStructConversion(f"Unsupported pointer size: {size}")
361376

362-
return __unpack(self.read(addr, size))
377+
return _unpack(self.read(addr, size))
363378

364379
def write(self, addr: int, data: bytes) -> None:
365380
"""Write bytes to a memory.
@@ -385,22 +400,12 @@ def write_ptr(self, addr: int, value: int, size: int = 0, *, signed = False) ->
385400
if not size:
386401
size = self.ql.arch.pointersize
387402

388-
__pack = ({
389-
1: self.ql.pack8s,
390-
2: self.ql.pack16s,
391-
4: self.ql.pack32s,
392-
8: self.ql.pack64s
393-
} if signed else {
394-
1: self.ql.pack8,
395-
2: self.ql.pack16,
396-
4: self.ql.pack32,
397-
8: self.ql.pack64
398-
}).get(size)
399-
400-
if __pack is None:
403+
try:
404+
_pack = self._packers[(size, signed)]
405+
except KeyError:
401406
raise QlErrorStructConversion(f"Unsupported pointer size: {size}")
402407

403-
self.write(addr, __pack(value))
408+
self.write(addr, _pack(value))
404409

405410
def search(self, needle: Union[bytes, Pattern[bytes]], begin: Optional[int] = None, end: Optional[int] = None) -> List[int]:
406411
"""Search for a sequence of bytes in memory.

0 commit comments

Comments
 (0)