Ticket #241: pyamf_int_fix.diff
| File pyamf_int_fix.diff, 6.2 KB (added by buge, 2 years ago) |
|---|
-
tests/test_amf3.py
298 298 299 299 def test_integer(self): 300 300 self._run([(0, '\x04\x00')]) 301 self._run([(0x35, '\x04\x35')]) 301 302 self._run([(0x7f, '\x04\x7f')]) 302 303 self._run([(0x80, '\x04\x81\x00')]) 304 self._run([(0xd4, '\x04\x81\x54')]) 303 305 self._run([(0x3fff, '\x04\xff\x7f')]) 304 306 self._run([(0x4000, '\x04\x81\x80\x00')]) 307 self._run([(0x1a53f, '\x04\x86\xca\x3f')]) 305 308 self._run([(0x1fffff, '\x04\xff\xff\x7f')]) 306 309 self._run([(0x200000, '\x04\x80\xc0\x80\x00')]) 307 self._run([(0x3fffffff, '\x04\xff\xff\xff\xff')]) 310 self._run([(-0x01, '\x04\xff\xff\xff\xff')]) 311 self._run([(-0x2a, '\x04\xff\xff\xff\xd6')]) 312 self._run([(0xfffffff, '\x04\xbf\xff\xff\xff')]) 313 self._run([(-0x10000000, '\x04\xc0\x80\x80\x00')]) 314 self._run([(0x10000000, '\x05\x41\xb0\x00\x00\x00\x00\x00\x00')]) 315 self._run([(-0x10000001, '\x05\xc1\xb0\x00\x00\x01\x00\x00\x00')]) 308 316 309 317 def test_number(self): 310 318 self._run([ … … 618 626 619 627 def test_integer(self): 620 628 self._run([(0, '\x04\x00')]) 629 self._run([(0x35, '\x04\x35')]) 621 630 self._run([(0x7f, '\x04\x7f')]) 622 631 self._run([(0x80, '\x04\x81\x00')]) 632 self._run([(0xd4, '\x04\x81\x54')]) 623 633 self._run([(0x3fff, '\x04\xff\x7f')]) 624 634 self._run([(0x4000, '\x04\x81\x80\x00')]) 635 self._run([(0x1a53f, '\x04\x86\xca\x3f')]) 625 636 self._run([(0x1fffff, '\x04\xff\xff\x7f')]) 626 637 self._run([(0x200000, '\x04\x80\xc0\x80\x00')]) 627 self._run([(0x3fffffff, '\x04\xff\xff\xff\xff')]) 638 self._run([(-0x01, '\x04\xff\xff\xff\xff')]) 639 self._run([(-0x2a, '\x04\xff\xff\xff\xd6')]) 640 self._run([(0xfffffff, '\x04\xbf\xff\xff\xff')]) 641 self._run([(-0x10000000, '\x04\xc0\x80\x80\x00')]) 628 642 643 def test_unsignedInteger(self): 644 tests = [ 645 (0, '\x00'), 646 (0x7f, '\x7f'), 647 (0x80, '\x81\x00'), 648 (0x3fff, '\xff\x7f'), 649 (0x4000, '\x81\x80\x00'), 650 (0x1fffff, '\xff\xff\x7f'), 651 (0x200000, '\x80\xc0\x80\x00'), 652 (0x3fffffff, '\xff\xff\xff\xff') 653 ] 654 for n,s in tests: 655 self.buf.truncate(0) 656 self.buf.write(s) 657 self.buf.seek(0) 658 self.assertEqual(self.decoder.readUnsignedInteger(), n) 659 629 660 def test_infinites(self): 630 661 import fpconst 631 662 -
amf3.py
860 860 ASTypes.NULL: 'readNull', 861 861 ASTypes.BOOL_FALSE: 'readBoolFalse', 862 862 ASTypes.BOOL_TRUE: 'readBoolTrue', 863 ASTypes.INTEGER: 'read Integer',863 ASTypes.INTEGER: 'readSignedInteger', 864 864 ASTypes.NUMBER: 'readNumber', 865 865 ASTypes.STRING: 'readString', 866 866 ASTypes.XML: 'readXML', … … 925 925 """ 926 926 return self.stream.read_double() 927 927 928 def read Integer(self):928 def readUnsignedInteger(self): 929 929 """ 930 Reads and returns a signed integer from the stream. 931 """ 932 return self.readInteger(False) 933 934 def readSignedInteger(self): 935 """ 936 Reads and returns a signed integer from the stream. 937 """ 938 return self.readInteger(True) 939 940 def readInteger(self, signed=False): 941 """ 930 942 Reads and returns an integer from the stream. 931 943 932 944 @see: U{Parsing integers on OSFlash … … 950 962 result |= b 951 963 952 964 if result & 0x10000000 != 0: 953 result <<= 1 954 result += 1 965 if signed: 966 result -= 0x20000000 967 else: 968 result <<= 1 969 result += 1 955 970 956 971 return result 957 972 … … 963 978 @param use_references: 964 979 """ 965 980 def readLength(): 966 x = self.read Integer()981 x = self.readUnsignedInteger() 967 982 968 983 return (x >> 1, x & REFERENCE_BIT == 0) 969 984 … … 986 1001 987 1002 The timezone is ignored as the date is always in UTC. 988 1003 """ 989 ref = self.read Integer()1004 ref = self.readUnsignedInteger() 990 1005 991 1006 if ref & REFERENCE_BIT == 0: 992 1007 return self.context.getObject(ref >> 1) … … 1009 1024 @see: U{Docuverse blog 1010 1025 <http://www.docuverse.com/blog/donpark/2007/05/14/flash-9-amf3-bug>} 1011 1026 """ 1012 size = self.read Integer()1027 size = self.readUnsignedInteger() 1013 1028 1014 1029 if size & REFERENCE_BIT == 0: 1015 1030 return self.context.getObject(size >> 1) … … 1083 1098 setattr(obj, attr, self.readElement()) 1084 1099 attr = self.readString() 1085 1100 1086 ref = self.read Integer()1101 ref = self.readUnsignedInteger() 1087 1102 1088 1103 if ref & REFERENCE_BIT == 0: 1089 1104 return self.context.getObject(ref >> 1) … … 1129 1144 @type legacy: C{bool} 1130 1145 @param legacy: The read XML is in 'legacy' format. 1131 1146 """ 1132 ref = self.read Integer()1147 ref = self.readUnsignedInteger() 1133 1148 1134 1149 if ref & REFERENCE_BIT == 0: 1135 1150 return self.context.getObject(ref >> 1) … … 1171 1186 @see: L{ByteArray} 1172 1187 @note: This is not supported in ActionScript 1.0 and 2.0. 1173 1188 """ 1174 ref = self.read Integer()1189 ref = self.readUnsignedInteger() 1175 1190 1176 1191 if ref & REFERENCE_BIT == 0: 1177 1192 return self.context.getObject(ref >> 1) … … 1306 1321 @type use_references: C{bool} 1307 1322 @param use_references: 1308 1323 """ 1309 if n > 0x3fffffff:1324 if n & 0xf0000000 not in [0, 0xf0000000]: 1310 1325 self.writeNumber(n) 1311 1326 1312 1327 return … … 1716 1731 return buf 1717 1732 1718 1733 def _encode_int(n): 1719 if n > 0x40000000:1734 if n & 0xf0000000 not in [0, 0xf0000000]: 1720 1735 raise ValueError, "Out of range" 1721 1736 1722 1737 bytes = '' 1723 1738 real_value = None 1724 1739 1740 if n < 0: 1741 n += 0x20000000 1742 1725 1743 if n > 0x1fffff: 1726 1744 real_value = n 1727 1745 n >>= 1
