Skip to content

Commit c909ee2

Browse files
committed
feat: completely convert codebase to resolver
1 parent d21abff commit c909ee2

14 files changed

Lines changed: 51 additions & 55 deletions

libdestruct/common/array/array_field.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,17 @@
1212
from libdestruct.common.field import Field
1313

1414
if TYPE_CHECKING:
15-
from collections.abc import MutableSequence
16-
15+
from libdestruct.backing.resolver import Resolver
1716
from libdestruct.common.array import array
18-
from libdestruct.common.obj import obj
1917

2018

2119
class ArrayField(Field):
2220
"""A generator for an array of items."""
2321

2422
@abstractmethod
25-
def inflate(self: ArrayField, memory: MutableSequence, address: int | tuple[obj, int]) -> array:
23+
def inflate(self: ArrayField, resolver: Resolver) -> array:
2624
"""Inflate the field.
2725
2826
Args:
29-
memory: The backing memory view.
30-
address: The address of the field in the memory view.
27+
resolver: The backing resolver for the object.
3128
"""

libdestruct/common/array/array_field_inflater.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@
1313
from libdestruct.common.type_registry import TypeRegistry
1414

1515
if TYPE_CHECKING:
16-
from collections.abc import Callable, MutableSequence
16+
from collections.abc import Callable
1717

18+
from libdestruct.backing.resolver import Resolver
1819
from libdestruct.common.obj import obj
1920

2021
registry = TypeRegistry()
@@ -24,7 +25,7 @@ def linear_array_field_inflater(
2425
field: LinearArrayField,
2526
_: type[obj],
2627
__: tuple[obj, type[obj]] | None,
27-
) -> Callable[[MutableSequence, int | tuple[obj, int]], obj]:
28+
) -> Callable[[Resolver], obj]:
2829
"""Returns the inflater for an array field of a struct."""
2930
field.item = registry.inflater_for(field.item)
3031

libdestruct/common/array/array_impl.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@
1212
from libdestruct.common.obj import obj
1313

1414
if TYPE_CHECKING:
15-
from collections.abc import Generator, MutableSequence
15+
from collections.abc import Generator
1616

17+
from libdestruct.backing.resolver import Resolver
1718
from libdestruct.common.obj import obj
1819

1920

@@ -25,13 +26,12 @@ class array_impl(array):
2526

2627
def __init__(
2728
self: array_impl,
28-
memory: MutableSequence,
29-
address: int | tuple[obj, int],
29+
resolver: Resolver,
3030
backing_type: obj,
3131
count: int,
3232
) -> None:
3333
"""Initialize the array."""
34-
super().__init__(memory, address)
34+
super().__init__(resolver)
3535

3636
self.backing_type = backing_type
3737
self.count = count
@@ -59,10 +59,7 @@ def to_bytes(self: array_impl) -> bytes:
5959

6060
def __getitem__(self: array_impl, index: int) -> obj:
6161
"""Get an item from the array."""
62-
if self._address:
63-
return self.backing_type(self.memory, (self._address, index * self.backing_type.size))
64-
65-
return self.backing_type(self.memory, (self._reference, self._offset + index * self.backing_type.size))
62+
return self.backing_type(self.resolver.relative_from_own(index * self.backing_type.size, 0))
6663

6764
def __setitem__(self: array_impl, index: int, value: obj) -> None:
6865
"""Set an item in the array."""

libdestruct/common/array/linear_array_field.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from libdestruct.common.array.array_impl import array_impl
1313

1414
if TYPE_CHECKING:
15+
from libdestruct.backing.resolver import Resolver
1516
from libdestruct.common.array.array import array
1617
from libdestruct.common.obj import obj
1718

@@ -24,11 +25,10 @@ def __init__(self: LinearArrayField, item: type[obj], size: int) -> None:
2425
self.item = item
2526
self.size = size
2627

27-
def inflate(self: LinearArrayField, memory: list, address: int | tuple[obj, int]) -> array:
28+
def inflate(self: LinearArrayField, resolver: Resolver) -> array:
2829
"""Inflate the field.
2930
3031
Args:
31-
memory: The backing memory view.
32-
address: The address of the field in the memory view.
32+
resolver: The backing resolver for the object.
3333
"""
34-
return array_impl(memory, address, self.item, self.size)
34+
return array_impl(resolver, self.item, self.size)

libdestruct/common/enum/enum.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@
1212
from libdestruct.common.type_registry import TypeRegistry
1313

1414
if TYPE_CHECKING:
15-
from collections.abc import MutableSequence
1615
from enum import Enum
1716

17+
from libdestruct.backing.resolver import Resolver
18+
1819

1920
class enum(obj):
2021
"""A generic enum."""
@@ -30,17 +31,16 @@ class enum(obj):
3031

3132
def __init__(
3233
self: enum,
33-
memory: MutableSequence,
34-
address: int | tuple[obj, int],
34+
resolver: Resolver,
3535
python_enum: type[Enum],
3636
backing_type: type[obj],
3737
lenient: bool = True,
3838
) -> None:
3939
"""Initialize the enum object."""
40-
super().__init__(memory, address)
40+
super().__init__(resolver)
4141

4242
self.python_enum = python_enum
43-
self._backing_type = TypeRegistry().inflater_for(backing_type)(memory, address)
43+
self._backing_type = TypeRegistry().inflater_for(backing_type)(resolver)
4444
self.lenient = lenient
4545

4646
self.size = self._backing_type.size

libdestruct/common/enum/enum_field.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,17 @@
1212
from libdestruct.common.field import Field
1313

1414
if TYPE_CHECKING:
15-
from collections.abc import MutableSequence
16-
15+
from libdestruct.backing.resolver import Resolver
1716
from libdestruct.common.enum import enum
18-
from libdestruct.common.obj import obj
1917

2018

2119
class EnumField(Field):
2220
"""A generator for an enum."""
2321

2422
@abstractmethod
25-
def inflate(self: EnumField, memory: MutableSequence, address: int | tuple[obj, int]) -> enum:
23+
def inflate(self: EnumField, resolver: Resolver) -> enum:
2624
"""Inflate the field.
2725
2826
Args:
29-
memory: The backing memory view.
30-
address: The address of the field in the memory view.
27+
resolver: The backing resolver for the object.
3128
"""

libdestruct/common/enum/enum_field_inflater.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@
1212
from libdestruct.common.type_registry import TypeRegistry
1313

1414
if TYPE_CHECKING:
15-
from collections.abc import Callable, MutableSequence
15+
from collections.abc import Callable
1616

17+
from libdestruct.backing.resolver import Resolver
1718
from libdestruct.common.enum.enum_field import EnumField
1819
from libdestruct.common.obj import obj
1920

@@ -24,7 +25,7 @@ def generic_enum_field_inflater(
2425
field: EnumField,
2526
_: type[obj],
2627
__: tuple[obj, type[obj]] | None,
27-
) -> Callable[[MutableSequence, int | tuple[obj, int]], obj]:
28+
) -> Callable[[Resolver], obj]:
2829
"""Returns the inflater for an enum field of a struct."""
2930
return field.inflate
3031

libdestruct/common/enum/enum_of.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
from libdestruct.common.enum.int_enum_field import IntEnumField
1313

1414
if TYPE_CHECKING:
15-
1615
from libdestruct.common.enum.enum_field import EnumField
1716

1817

libdestruct/common/enum/int_enum_field.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
if TYPE_CHECKING:
1616
from enum import IntEnum
1717

18+
from libdestruct.backing.resolver import Resolver
19+
1820

1921
class IntEnumField(EnumField):
2022
"""A generator for an enum of integers."""
@@ -45,11 +47,10 @@ def __init__(self: IntEnumField, enum: type[IntEnum], lenient: bool = True, size
4547
case _:
4648
raise ValueError("The size of the field must be a power of 2.")
4749

48-
def inflate(self: IntEnumField, memory: bytearray, address: int) -> int:
50+
def inflate(self: IntEnumField, resolver: Resolver) -> int:
4951
"""Inflate the field.
5052
5153
Args:
52-
memory: The backing memory view.
53-
address: The address of the field in the memory view.
54+
resolver: The backing resolver for the object.
5455
"""
55-
return enum(memory, address, self.enum, self.backing_type, self.lenient)
56+
return enum(resolver, self.enum, self.backing_type, self.lenient)

libdestruct/common/field.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,17 @@
1010
from typing import TYPE_CHECKING
1111

1212
if TYPE_CHECKING:
13-
from collections.abc import MutableSequence
14-
13+
from libdestruct.backing.resolver import Resolver
1514
from libdestruct.common.obj import obj
1615

16+
1717
class Field(ABC):
1818
"""A generator for a generic field."""
1919

2020
@abstractmethod
21-
def inflate(self: Field, memory: MutableSequence, address: int | tuple[obj, int]) -> obj:
21+
def inflate(self: Field, resolver: Resolver) -> obj:
2222
"""Inflate the field.
2323
2424
Args:
25-
memory: The backing memory view.
26-
address: The address of the field in the memory view.
25+
resolver: The backing resolver for the object.
2726
"""

0 commit comments

Comments
 (0)