Skip to content

Commit b5e16c8

Browse files
committed
Simplify _decode_pointer
This doesn't seem to improve performance, but the code is easier to follow.
1 parent e3539f9 commit b5e16c8

File tree

1 file changed

+17
-14
lines changed

1 file changed

+17
-14
lines changed

maxminddb/decoder.py

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -74,22 +74,25 @@ def _decode_map(self, size, offset):
7474
container[key] = value
7575
return container, offset
7676

77-
_pointer_value_offset = {
78-
1: 0,
79-
2: 2048,
80-
3: 526336,
81-
4: 0,
82-
}
83-
8477
def _decode_pointer(self, size, offset):
85-
pointer_size = ((size >> 3) & 0x3) + 1
78+
pointer_size = (size >> 3) + 1
79+
80+
buf = self._buffer[offset:offset + pointer_size]
8681
new_offset = offset + pointer_size
87-
pointer_bytes = self._buffer[offset:new_offset]
88-
packed = pointer_bytes if pointer_size == 4 else struct.pack(
89-
b'!c', byte_from_int(size & 0x7)) + pointer_bytes
90-
unpacked = int_from_bytes(packed)
91-
pointer = unpacked + self._pointer_base + \
92-
self._pointer_value_offset[pointer_size]
82+
83+
if pointer_size == 1:
84+
buf = byte_from_int(size & 0x7) + buf
85+
pointer = struct.unpack(b'!H', buf)[0] + self._pointer_base
86+
elif pointer_size == 2:
87+
buf = b'\x00' + byte_from_int(size & 0x7) + buf
88+
pointer = struct.unpack(b'!I', buf)[0] + 2048 + self._pointer_base
89+
elif pointer_size == 3:
90+
buf = byte_from_int(size & 0x7) + buf
91+
pointer = struct.unpack(b'!I',
92+
buf)[0] + 526336 + self._pointer_base
93+
else:
94+
pointer = struct.unpack(b'!I', buf)[0] + self._pointer_base
95+
9396
if self._pointer_test:
9497
return pointer, new_offset
9598
(value, _) = self.decode(pointer)

0 commit comments

Comments
 (0)