Ticket #241: pyamf_int_fix.diff

File pyamf_int_fix.diff, 6.2 KB (added by buge, 2 years ago)

Exemplary patch

  • tests/test_amf3.py

     
    298298 
    299299    def test_integer(self): 
    300300        self._run([(0, '\x04\x00')]) 
     301        self._run([(0x35, '\x04\x35')]) 
    301302        self._run([(0x7f, '\x04\x7f')]) 
    302303        self._run([(0x80, '\x04\x81\x00')]) 
     304        self._run([(0xd4, '\x04\x81\x54')]) 
    303305        self._run([(0x3fff, '\x04\xff\x7f')]) 
    304306        self._run([(0x4000, '\x04\x81\x80\x00')]) 
     307        self._run([(0x1a53f, '\x04\x86\xca\x3f')]) 
    305308        self._run([(0x1fffff, '\x04\xff\xff\x7f')]) 
    306309        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')]) 
    308316 
    309317    def test_number(self): 
    310318        self._run([ 
     
    618626 
    619627    def test_integer(self): 
    620628        self._run([(0, '\x04\x00')]) 
     629        self._run([(0x35, '\x04\x35')]) 
    621630        self._run([(0x7f, '\x04\x7f')]) 
    622631        self._run([(0x80, '\x04\x81\x00')]) 
     632        self._run([(0xd4, '\x04\x81\x54')]) 
    623633        self._run([(0x3fff, '\x04\xff\x7f')]) 
    624634        self._run([(0x4000, '\x04\x81\x80\x00')]) 
     635        self._run([(0x1a53f, '\x04\x86\xca\x3f')]) 
    625636        self._run([(0x1fffff, '\x04\xff\xff\x7f')]) 
    626637        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')]) 
    628642 
     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 
    629660    def test_infinites(self): 
    630661        import fpconst 
    631662 
  • amf3.py

     
    860860        ASTypes.NULL:       'readNull', 
    861861        ASTypes.BOOL_FALSE: 'readBoolFalse', 
    862862        ASTypes.BOOL_TRUE:  'readBoolTrue', 
    863         ASTypes.INTEGER:    'readInteger', 
     863        ASTypes.INTEGER:    'readSignedInteger', 
    864864        ASTypes.NUMBER:     'readNumber', 
    865865        ASTypes.STRING:     'readString', 
    866866        ASTypes.XML:        'readXML', 
     
    925925        """ 
    926926        return self.stream.read_double() 
    927927 
    928     def readInteger(self): 
     928    def readUnsignedInteger(self): 
    929929        """ 
     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        """ 
    930942        Reads and returns an integer from the stream. 
    931943 
    932944        @see: U{Parsing integers on OSFlash 
     
    950962            result |= b 
    951963 
    952964            if result & 0x10000000 != 0: 
    953                 result <<= 1 
    954                 result += 1 
     965                if signed: 
     966                    result -= 0x20000000 
     967                else: 
     968                    result <<= 1 
     969                    result += 1 
    955970 
    956971        return result 
    957972 
     
    963978        @param use_references: 
    964979        """ 
    965980        def readLength(): 
    966             x = self.readInteger() 
     981            x = self.readUnsignedInteger() 
    967982 
    968983            return (x >> 1, x & REFERENCE_BIT == 0) 
    969984 
     
    9861001 
    9871002        The timezone is ignored as the date is always in UTC. 
    9881003        """ 
    989         ref = self.readInteger() 
     1004        ref = self.readUnsignedInteger() 
    9901005 
    9911006        if ref & REFERENCE_BIT == 0: 
    9921007            return self.context.getObject(ref >> 1) 
     
    10091024        @see: U{Docuverse blog 
    10101025        <http://www.docuverse.com/blog/donpark/2007/05/14/flash-9-amf3-bug>} 
    10111026        """ 
    1012         size = self.readInteger() 
     1027        size = self.readUnsignedInteger() 
    10131028 
    10141029        if size & REFERENCE_BIT == 0: 
    10151030            return self.context.getObject(size >> 1) 
     
    10831098                setattr(obj, attr, self.readElement()) 
    10841099                attr = self.readString() 
    10851100 
    1086         ref = self.readInteger() 
     1101        ref = self.readUnsignedInteger() 
    10871102 
    10881103        if ref & REFERENCE_BIT == 0: 
    10891104            return self.context.getObject(ref >> 1) 
     
    11291144        @type legacy: C{bool} 
    11301145        @param legacy: The read XML is in 'legacy' format. 
    11311146        """ 
    1132         ref = self.readInteger() 
     1147        ref = self.readUnsignedInteger() 
    11331148 
    11341149        if ref & REFERENCE_BIT == 0: 
    11351150            return self.context.getObject(ref >> 1) 
     
    11711186        @see: L{ByteArray} 
    11721187        @note: This is not supported in ActionScript 1.0 and 2.0. 
    11731188        """ 
    1174         ref = self.readInteger() 
     1189        ref = self.readUnsignedInteger() 
    11751190 
    11761191        if ref & REFERENCE_BIT == 0: 
    11771192            return self.context.getObject(ref >> 1) 
     
    13061321        @type   use_references: C{bool} 
    13071322        @param  use_references: 
    13081323        """ 
    1309         if n > 0x3fffffff: 
     1324        if n & 0xf0000000 not in [0, 0xf0000000]: 
    13101325            self.writeNumber(n) 
    13111326 
    13121327            return 
     
    17161731    return buf 
    17171732 
    17181733def _encode_int(n): 
    1719     if n > 0x40000000: 
     1734    if n & 0xf0000000 not in [0, 0xf0000000]: 
    17201735        raise ValueError, "Out of range" 
    17211736 
    17221737    bytes = '' 
    17231738    real_value = None 
    17241739 
     1740    if n < 0: 
     1741        n += 0x20000000 
     1742 
    17251743    if n > 0x1fffff: 
    17261744        real_value = n 
    17271745        n >>= 1