Beispiel #1
0
 def _pack_array_header(self, n):
     if n <= 0x0f:
         return self._buffer.write(struct.pack('B', 0x90 + n))
     if n <= 0xffff:
         return self._buffer.write(struct.pack(">BH", 0xdc, n))
     if n <= 0xffffffff:
         return self._buffer.write(struct.pack(">BI", 0xdd, n))
     raise PackValueError("Array is too large")
Beispiel #2
0
 def _pack_map_header(self, n):
     if n <= 0x0f:
         return self._buffer.write(struct.pack('B', 0x80 + n))
     if n <= 0xffff:
         return self._buffer.write(struct.pack(">BH", 0xde, n))
     if n <= 0xffffffff:
         return self._buffer.write(struct.pack(">BI", 0xdf, n))
     raise PackValueError("Dict is too large")
Beispiel #3
0
 def _pack_map_header(self, n):
     if n <= 0x0F:
         return self._buffer.write(struct.pack("B", 0x80 + n))
     if n <= 0xFFFF:
         return self._buffer.write(struct.pack(">BH", 0xDE, n))
     if n <= 0xFFFFFFFF:
         return self._buffer.write(struct.pack(">BI", 0xDF, n))
     raise PackValueError("Dict is too large")
Beispiel #4
0
 def _pack_array_header(self, n):
     if n <= 0x0F:
         return self._buffer.write(struct.pack("B", 0x90 + n))
     if n <= 0xFFFF:
         return self._buffer.write(struct.pack(">BH", 0xDC, n))
     if n <= 0xFFFFFFFF:
         return self._buffer.write(struct.pack(">BI", 0xDD, n))
     raise PackValueError("Array is too large")
 def _pack_raw_header(self, n):
     if n <= 0x1f:
         self._buffer.write(struct.pack('B', 0xa0 + n))
     elif self._use_bin_type and n <= 0xff:
         self._buffer.write(struct.pack('>BB', 0xd9, n))
     elif n <= 0xffff:
         self._buffer.write(struct.pack(">BH", 0xda, n))
     elif n <= 0xffffffff:
         self._buffer.write(struct.pack(">BI", 0xdb, n))
     else:
         raise PackValueError('Raw is too large')
 def _pack_bin_header(self, n):
     if not self._use_bin_type:
         return self._pack_raw_header(n)
     elif n <= 0xff:
         return self._buffer.write(struct.pack('>BB', 0xc4, n))
     elif n <= 0xffff:
         return self._buffer.write(struct.pack(">BH", 0xc5, n))
     elif n <= 0xffffffff:
         return self._buffer.write(struct.pack(">BI", 0xc6, n))
     else:
         raise PackValueError('Bin is too large')
Beispiel #7
0
 def _pack_bin_header(self, n):
     if not self._use_bin_type:
         return self._pack_raw_header(n)
     elif n <= 0xFF:
         return self._buffer.write(struct.pack(">BB", 0xC4, n))
     elif n <= 0xFFFF:
         return self._buffer.write(struct.pack(">BH", 0xC5, n))
     elif n <= 0xFFFFFFFF:
         return self._buffer.write(struct.pack(">BI", 0xC6, n))
     else:
         raise PackValueError("Bin is too large")
Beispiel #8
0
 def _pack_raw_header(self, n):
     if n <= 0x1F:
         self._buffer.write(struct.pack("B", 0xA0 + n))
     elif self._use_bin_type and n <= 0xFF:
         self._buffer.write(struct.pack(">BB", 0xD9, n))
     elif n <= 0xFFFF:
         self._buffer.write(struct.pack(">BH", 0xDA, n))
     elif n <= 0xFFFFFFFF:
         self._buffer.write(struct.pack(">BI", 0xDB, n))
     else:
         raise PackValueError("Raw is too large")
 def _pack(self,
           obj,
           nest_limit=DEFAULT_RECURSE_LIMIT,
           check=isinstance,
           check_type_strict=_check_type_strict):
     default_used = False
     if self._strict_types:
         check = check_type_strict
         list_types = list
     else:
         list_types = (list, tuple)
     while True:
         if nest_limit < 0:
             raise PackValueError("recursion limit exceeded")
         if obj is None:
             return self._buffer.write(b"\xc0")
         if check(obj, bool):
             if obj:
                 return self._buffer.write(b"\xc3")
             return self._buffer.write(b"\xc2")
         if check(obj, int_types):
             if 0 <= obj < 0x80:
                 return self._buffer.write(struct.pack("B", obj))
             if -0x20 <= obj < 0:
                 return self._buffer.write(struct.pack("b", obj))
             if 0x80 <= obj <= 0xff:
                 return self._buffer.write(struct.pack("BB", 0xcc, obj))
             if -0x80 <= obj < 0:
                 return self._buffer.write(struct.pack(">Bb", 0xd0, obj))
             if 0xff < obj <= 0xffff:
                 return self._buffer.write(struct.pack(">BH", 0xcd, obj))
             if -0x8000 <= obj < -0x80:
                 return self._buffer.write(struct.pack(">Bh", 0xd1, obj))
             if 0xffff < obj <= 0xffffffff:
                 return self._buffer.write(struct.pack(">BI", 0xce, obj))
             if -0x80000000 <= obj < -0x8000:
                 return self._buffer.write(struct.pack(">Bi", 0xd2, obj))
             if 0xffffffff < obj <= 0xffffffffffffffff:
                 return self._buffer.write(struct.pack(">BQ", 0xcf, obj))
             if -0x8000000000000000 <= obj < -0x80000000:
                 return self._buffer.write(struct.pack(">Bq", 0xd3, obj))
             if not default_used and self._default is not None:
                 obj = self._default(obj)
                 default_used = True
                 continue
             raise PackOverflowError("Integer value out of range")
         if check(obj, (bytes, bytearray)):
             n = len(obj)
             if n >= 2**32:
                 raise PackValueError("%s is too large" %
                                      type(obj).__name__)
             self._pack_bin_header(n)
             return self._buffer.write(obj)
         if check(obj, Unicode):
             if self._encoding is None:
                 raise TypeError("Can't encode unicode string: "
                                 "no encoding is specified")
             obj = obj.encode(self._encoding, self._unicode_errors)
             n = len(obj)
             if n >= 2**32:
                 raise PackValueError("String is too large")
             self._pack_raw_header(n)
             return self._buffer.write(obj)
         if check(obj, memoryview):
             n = len(obj) * obj.itemsize
             if n >= 2**32:
                 raise PackValueError("Memoryview is too large")
             self._pack_bin_header(n)
             return self._buffer.write(obj)
         if check(obj, float):
             if self._use_float:
                 return self._buffer.write(struct.pack(">Bf", 0xca, obj))
             return self._buffer.write(struct.pack(">Bd", 0xcb, obj))
         if check(obj, ExtType):
             code = obj.code
             data = obj.data
             assert isinstance(code, int)
             assert isinstance(data, bytes)
             L = len(data)
             if L == 1:
                 self._buffer.write(b'\xd4')
             elif L == 2:
                 self._buffer.write(b'\xd5')
             elif L == 4:
                 self._buffer.write(b'\xd6')
             elif L == 8:
                 self._buffer.write(b'\xd7')
             elif L == 16:
                 self._buffer.write(b'\xd8')
             elif L <= 0xff:
                 self._buffer.write(struct.pack(">BB", 0xc7, L))
             elif L <= 0xffff:
                 self._buffer.write(struct.pack(">BH", 0xc8, L))
             else:
                 self._buffer.write(struct.pack(">BI", 0xc9, L))
             self._buffer.write(struct.pack("b", code))
             self._buffer.write(data)
             return
         if check(obj, list_types):
             n = len(obj)
             self._pack_array_header(n)
             for i in range(n):
                 self._pack(obj[i], nest_limit - 1)
             return
         if check(obj, dict):
             return self._pack_map_pairs(len(obj), dict_iteritems(obj),
                                         nest_limit - 1)
         if not default_used and self._default is not None:
             obj = self._default(obj)
             default_used = 1
             continue
         raise TypeError("Cannot serialize %r" % (obj, ))
Beispiel #10
0
 def _pack(self,
           obj,
           nest_limit=DEFAULT_RECURSE_LIMIT,
           isinstance=isinstance):
     default_used = False
     while True:
         if nest_limit < 0:
             raise PackValueError("recursion limit exceeded")
         if obj is None:
             return self._buffer.write(b"\xc0")
         if isinstance(obj, bool):
             if obj:
                 return self._buffer.write(b"\xc3")
             return self._buffer.write(b"\xc2")
         if isinstance(obj, int_types):
             if 0 <= obj < 0x80:
                 return self._buffer.write(struct.pack("B", obj))
             if -0x20 <= obj < 0:
                 return self._buffer.write(struct.pack("b", obj))
             if 0x80 <= obj <= 0xff:
                 return self._buffer.write(struct.pack("BB", 0xcc, obj))
             if -0x80 <= obj < 0:
                 return self._buffer.write(struct.pack(">Bb", 0xd0, obj))
             if 0xff < obj <= 0xffff:
                 return self._buffer.write(struct.pack(">BH", 0xcd, obj))
             if -0x8000 <= obj < -0x80:
                 return self._buffer.write(struct.pack(">Bh", 0xd1, obj))
             if 0xffff < obj <= 0xffffffff:
                 return self._buffer.write(struct.pack(">BI", 0xce, obj))
             if -0x80000000 <= obj < -0x8000:
                 return self._buffer.write(struct.pack(">Bi", 0xd2, obj))
             if 0xffffffff < obj <= 0xffffffffffffffff:
                 return self._buffer.write(struct.pack(">BQ", 0xcf, obj))
             if -0x8000000000000000 <= obj < -0x80000000:
                 return self._buffer.write(struct.pack(">Bq", 0xd3, obj))
             if not default_used and self._default is not None:
                 obj = self._default(obj)
                 default_used = True
                 continue
             raise PackValueError("Integer value out of range")
         if self._use_bin_type and isinstance(obj, bytes):
             n = len(obj)
             if n <= 0xff:
                 self._buffer.write(struct.pack('>BB', 0xc4, n))
             elif n <= 0xffff:
                 self._buffer.write(struct.pack(">BH", 0xc5, n))
             elif n <= 0xffffffff:
                 self._buffer.write(struct.pack(">BI", 0xc6, n))
             else:
                 raise PackValueError("Bytes is too large")
             return self._buffer.write(obj)
         if isinstance(obj, (Unicode, bytes)):
             if isinstance(obj, Unicode):
                 if self._encoding is None:
                     raise TypeError("Can't encode unicode string: "
                                     "no encoding is specified")
                 obj = obj.encode(self._encoding, self._unicode_errors)
             n = len(obj)
             if n <= 0x1f:
                 self._buffer.write(struct.pack('B', 0xa0 + n))
             elif self._use_bin_type and n <= 0xff:
                 self._buffer.write(struct.pack('>BB', 0xd9, n))
             elif n <= 0xffff:
                 self._buffer.write(struct.pack(">BH", 0xda, n))
             elif n <= 0xffffffff:
                 self._buffer.write(struct.pack(">BI", 0xdb, n))
             else:
                 raise PackValueError("String is too large")
             return self._buffer.write(obj)
         if isinstance(obj, float):
             if self._use_float:
                 return self._buffer.write(struct.pack(">Bf", 0xca, obj))
             return self._buffer.write(struct.pack(">Bd", 0xcb, obj))
         if isinstance(obj, ExtType):
             code = obj.code
             data = obj.data
             assert isinstance(code, int)
             assert isinstance(data, bytes)
             L = len(data)
             if L == 1:
                 self._buffer.write(b'\xd4')
             elif L == 2:
                 self._buffer.write(b'\xd5')
             elif L == 4:
                 self._buffer.write(b'\xd6')
             elif L == 8:
                 self._buffer.write(b'\xd7')
             elif L == 16:
                 self._buffer.write(b'\xd8')
             elif L <= 0xff:
                 self._buffer.write(struct.pack(">BB", 0xc7, L))
             elif L <= 0xffff:
                 self._buffer.write(struct.pack(">BH", 0xc8, L))
             else:
                 self._buffer.write(struct.pack(">BI", 0xc9, L))
             self._buffer.write(struct.pack("b", code))
             self._buffer.write(data)
             return
         if isinstance(obj, (list, tuple)):
             n = len(obj)
             self._fb_pack_array_header(n)
             for i in xrange(n):
                 self._pack(obj[i], nest_limit - 1)
             return
         if isinstance(obj, dict):
             return self._fb_pack_map_pairs(len(obj), dict_iteritems(obj),
                                            nest_limit - 1)
         if not default_used and self._default is not None:
             obj = self._default(obj)
             default_used = 1
             continue
         raise TypeError("Cannot serialize %r" % obj)