(self, value)
| 760 | self._fp.write(struct.pack('>BBQ', token | 0xF, 0x13, size)) |
| 761 | |
| 762 | def _write_object(self, value): |
| 763 | ref = self._getrefnum(value) |
| 764 | self._object_offsets[ref] = self._fp.tell() |
| 765 | if value is None: |
| 766 | self._fp.write(b'\x00') |
| 767 | |
| 768 | elif value is False: |
| 769 | self._fp.write(b'\x08') |
| 770 | |
| 771 | elif value is True: |
| 772 | self._fp.write(b'\x09') |
| 773 | |
| 774 | elif isinstance(value, int): |
| 775 | if value < 0: |
| 776 | try: |
| 777 | self._fp.write(struct.pack('>Bq', 0x13, value)) |
| 778 | except struct.error: |
| 779 | raise OverflowError(value) from None |
| 780 | elif value < 1 << 8: |
| 781 | self._fp.write(struct.pack('>BB', 0x10, value)) |
| 782 | elif value < 1 << 16: |
| 783 | self._fp.write(struct.pack('>BH', 0x11, value)) |
| 784 | elif value < 1 << 32: |
| 785 | self._fp.write(struct.pack('>BL', 0x12, value)) |
| 786 | elif value < 1 << 63: |
| 787 | self._fp.write(struct.pack('>BQ', 0x13, value)) |
| 788 | elif value < 1 << 64: |
| 789 | self._fp.write(b'\x14' + value.to_bytes(16, 'big', signed=True)) |
| 790 | else: |
| 791 | raise OverflowError(value) |
| 792 | |
| 793 | elif isinstance(value, float): |
| 794 | self._fp.write(struct.pack('>Bd', 0x23, value)) |
| 795 | |
| 796 | elif isinstance(value, datetime.datetime): |
| 797 | if self._aware_datetime: |
| 798 | dt = value.astimezone(datetime.UTC) |
| 799 | offset = dt - datetime.datetime(2001, 1, 1, tzinfo=datetime.UTC) |
| 800 | f = offset.total_seconds() |
| 801 | else: |
| 802 | f = (value - datetime.datetime(2001, 1, 1)).total_seconds() |
| 803 | self._fp.write(struct.pack('>Bd', 0x33, f)) |
| 804 | |
| 805 | elif isinstance(value, (bytes, bytearray)): |
| 806 | self._write_size(0x40, len(value)) |
| 807 | self._fp.write(value) |
| 808 | |
| 809 | elif isinstance(value, str): |
| 810 | try: |
| 811 | t = value.encode('ascii') |
| 812 | self._write_size(0x50, len(value)) |
| 813 | except UnicodeEncodeError: |
| 814 | t = value.encode('utf-16be') |
| 815 | self._write_size(0x60, len(t) // 2) |
| 816 | |
| 817 | self._fp.write(t) |
| 818 | |
| 819 | elif isinstance(value, UID): |
no test coverage detected