| 538 | |
| 539 | |
| 540 | class PyArraySerializer(Serializer): |
| 541 | typecode_dict = typecode_dict |
| 542 | typecodearray_type = {typecode: ftype for typecode, (_itemsize, ftype, _type_id) in typecode_dict.items()} |
| 543 | |
| 544 | def __init__(self, type_resolver, ftype, type_id: str): |
| 545 | super().__init__(type_resolver, ftype) |
| 546 | self.typecode = typeid_code[type_id] |
| 547 | self.itemsize, ftype, self.type_id = typecode_dict[self.typecode] |
| 548 | |
| 549 | def _array_type_id(self, value): |
| 550 | entry = typecode_dict.get(value.typecode) |
| 551 | if entry is None: |
| 552 | raise TypeError(f"Unsupported array.array typecode {value.typecode!r}") |
| 553 | itemsize, _ftype, type_id = entry |
| 554 | if value.itemsize != itemsize: |
| 555 | raise TypeError(f"array.array typecode {value.typecode!r} has itemsize {value.itemsize}, expected {itemsize}") |
| 556 | return type_id |
| 557 | |
| 558 | def write(self, buffer, value): |
| 559 | actual_type_id = self._array_type_id(value) |
| 560 | if actual_type_id != self.type_id: |
| 561 | raise TypeError(f"array.array typecode {value.typecode!r} maps to type id {actual_type_id}, expected {self.type_id}") |
| 562 | view = memoryview(value) |
| 563 | assert view.itemsize == self.itemsize |
| 564 | assert view.c_contiguous # TODO handle contiguous |
| 565 | nbytes = len(value) * self.itemsize |
| 566 | buffer.write_var_uint32(nbytes) |
| 567 | if is_little_endian or self.itemsize == 1: |
| 568 | buffer.write_buffer(value) |
| 569 | else: |
| 570 | # Swap bytes on big-endian machines for multi-byte types |
| 571 | swapped = array.array(self.typecode, value) |
| 572 | swapped.byteswap() |
| 573 | buffer.write_buffer(swapped) |
| 574 | |
| 575 | def read(self, buffer): |
| 576 | data = buffer.read_bytes_and_size() |
| 577 | arr = array.array(self.typecode, []) |
| 578 | arr.frombytes(data) |
| 579 | if not is_little_endian and self.itemsize > 1: |
| 580 | # Swap bytes on big-endian machines for multi-byte types |
| 581 | arr.byteswap() |
| 582 | return arr |
| 583 | |
| 584 | |
| 585 | FORY_ARRAY_WRAPPERS = { |
no test coverage detected