Skip to content

Commit ed91f5c

Browse files
committed
Structs: remove '_from_values', create '_push_to' method
1 parent 70eea18 commit ed91f5c

File tree

2 files changed

+20
-8
lines changed

2 files changed

+20
-8
lines changed

src/extrainterpreters/utils.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -144,14 +144,6 @@ def _fields(cls):
144144
if isinstance(v, RawField):
145145
yield k
146146

147-
@classmethod
148-
def _from_values(cls, *args):
149-
data = bytearray(b"\x00" * cls._size)
150-
self = cls(data, 0)
151-
for arg, field_name in zip(args, self._fields):
152-
setattr(self, field_name, arg)
153-
return self
154-
155147
@property
156148
def _bytes(self):
157149
return bytes(self._data[self._offset : self._offset + self._size])
@@ -173,6 +165,14 @@ def _get_offset_for_field(cls, field_name):
173165
field = getattr(cls, field_name)
174166
return field._calc_offset(cls)
175167

168+
def _push_to(self, data, offset=0):
169+
"""Paste struct data into a new buffer given by data, offset
170+
171+
Returns a new instance pointing to the data in the new copy.
172+
"""
173+
data[offset: offset + self._size] = self._bytes
174+
return self._from_data(data, offset)
175+
176176
def __repr__(self):
177177
field_data = []
178178
for field_name in self._fields:

tests/test_struct.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,18 @@ class Struct(StructBase):
6565
assert s.data_offset == 1000
6666
assert s.length == 2_000_000
6767

68+
def test_struct_push_to():
69+
class Struct(StructBase):
70+
data_offset = Field(2)
71+
length = Field(4)
72+
73+
s = Struct(data_offset=1000, length=2_000_000)
74+
75+
data = bytearray(Struct._size)
76+
n = s._push_to(data, 0)
77+
assert n.data_offset == 1000
78+
assert n.length == 2_000_000
79+
6880

6981
def test_struct_bytes():
7082
class Struct(StructBase):

0 commit comments

Comments
 (0)