(
self,
obj,
nest_limit=DEFAULT_RECURSE_LIMIT,
check=isinstance,
check_type_strict=_check_type_strict,
)
| 696 | self._default = default |
| 697 | |
| 698 | def _pack( |
| 699 | self, |
| 700 | obj, |
| 701 | nest_limit=DEFAULT_RECURSE_LIMIT, |
| 702 | check=isinstance, |
| 703 | check_type_strict=_check_type_strict, |
| 704 | ): |
| 705 | default_used = False |
| 706 | if self._strict_types: |
| 707 | check = check_type_strict |
| 708 | list_types = list |
| 709 | else: |
| 710 | list_types = (list, tuple) |
| 711 | while True: |
| 712 | if nest_limit < 0: |
| 713 | raise ValueError("recursion limit exceeded") |
| 714 | if obj is None: |
| 715 | return self._buffer.write(b"\xc0") |
| 716 | if check(obj, bool): |
| 717 | if obj: |
| 718 | return self._buffer.write(b"\xc3") |
| 719 | return self._buffer.write(b"\xc2") |
| 720 | if check(obj, int): |
| 721 | if 0 <= obj < 0x80: |
| 722 | return self._buffer.write(struct.pack("B", obj)) |
| 723 | if -0x20 <= obj < 0: |
| 724 | return self._buffer.write(struct.pack("b", obj)) |
| 725 | if 0x80 <= obj <= 0xFF: |
| 726 | return self._buffer.write(struct.pack("BB", 0xCC, obj)) |
| 727 | if -0x80 <= obj < 0: |
| 728 | return self._buffer.write(struct.pack(">Bb", 0xD0, obj)) |
| 729 | if 0xFF < obj <= 0xFFFF: |
| 730 | return self._buffer.write(struct.pack(">BH", 0xCD, obj)) |
| 731 | if -0x8000 <= obj < -0x80: |
| 732 | return self._buffer.write(struct.pack(">Bh", 0xD1, obj)) |
| 733 | if 0xFFFF < obj <= 0xFFFFFFFF: |
| 734 | return self._buffer.write(struct.pack(">BI", 0xCE, obj)) |
| 735 | if -0x80000000 <= obj < -0x8000: |
| 736 | return self._buffer.write(struct.pack(">Bi", 0xD2, obj)) |
| 737 | if 0xFFFFFFFF < obj <= 0xFFFFFFFFFFFFFFFF: |
| 738 | return self._buffer.write(struct.pack(">BQ", 0xCF, obj)) |
| 739 | if -0x8000000000000000 <= obj < -0x80000000: |
| 740 | return self._buffer.write(struct.pack(">Bq", 0xD3, obj)) |
| 741 | if not default_used and self._default is not None: |
| 742 | obj = self._default(obj) |
| 743 | default_used = True |
| 744 | continue |
| 745 | raise OverflowError("Integer value out of range") |
| 746 | if check(obj, (bytes, bytearray)): |
| 747 | n = len(obj) |
| 748 | if n >= 2**32: |
| 749 | raise ValueError("%s is too large" % type(obj).__name__) |
| 750 | self._pack_bin_header(n) |
| 751 | return self._buffer.write(obj) |
| 752 | if check(obj, str): |
| 753 | obj = obj.encode("utf-8", self._unicode_errors) |
| 754 | n = len(obj) |
| 755 | if n >= 2**32: |
no test coverage detected