Changeset 1157

Show
Ignore:
Timestamp:
04/10/08 19:32:23 (2 years ago)
Author:
nick
Message:

Applying patch from buge. Fixes #241, Thanks!

Location:
pyamf/trunk/pyamf
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • pyamf/trunk/pyamf/amf3.py

    r1101 r1157  
    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', 
     
    926926        return self.stream.read_double() 
    927927 
    928     def readInteger(self): 
     928    def readUnsignedInteger(self): 
     929        """ 
     930        Reads and returns an unsigned 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): 
    929941        """ 
    930942        Reads and returns an integer from the stream. 
     
    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 
     
    964979        """ 
    965980        def readLength(): 
    966             x = self.readInteger() 
     981            x = self.readUnsignedInteger() 
    967982 
    968983            return (x >> 1, x & REFERENCE_BIT == 0) 
     
    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: 
     
    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: 
     
    10841099                attr = self.readString() 
    10851100 
    1086         ref = self.readInteger() 
     1101        ref = self.readUnsignedInteger() 
    10871102 
    10881103        if ref & REFERENCE_BIT == 0: 
     
    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: 
     
    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: 
     
    13071322        @param  use_references: 
    13081323        """ 
    1309         if n > 0x3fffffff: 
     1324        if n & 0xf0000000 not in [0, 0xf0000000]: 
    13101325            self.writeNumber(n) 
    13111326 
     
    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 
     1739 
     1740    if n < 0: 
     1741        n += 0x20000000 
    17241742 
    17251743    if n > 0x1fffff: 
  • pyamf/trunk/pyamf/tests/test_amf3.py

    r1099 r1157  
    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): 
     
    331339 
    332340        self.encoder.writeString(UnicodeObject()) 
    333         self.assertEquals(self.buf.getvalue(), '\x06+M\xc3\x83\xc3\x82\xc2\xb6tley Cr\xc3\x83\xc3\x82\xc2\xbce') 
     341        self.assertEquals(self.buf.getvalue(), '\x06+M\xc3\x83\xc3\x82\xc2' 
     342            '\xb6tley Cr\xc3\x83\xc3\x82\xc2\xbce') 
    334343        self.buf.truncate() 
    335344        self.context.clear() 
    336345 
    337346        self.encoder.writeString(StrObject()) 
    338         self.assertEquals(self.buf.getvalue(), '\x06+M\xc3\x83\xc3\x82\xc2\xb6tley Cr\xc3\x83\xc3\x82\xc2\xbce') 
     347        self.assertEquals(self.buf.getvalue(), '\x06+M\xc3\x83\xc3\x82\xc2' 
     348            '\xb6tley Cr\xc3\x83\xc3\x82\xc2\xbce') 
    339349        self.buf.truncate() 
    340350        self.context.clear() 
    341351 
    342352        self.encoder.writeString(ReprObject()) 
    343         self.assertEquals(self.buf.getvalue(), '\x06+M\xc3\x83\xc3\x82\xc2\xb6tley Cr\xc3\x83\xc3\x82\xc2\xbce') 
     353        self.assertEquals(self.buf.getvalue(), '\x06+M\xc3\x83\xc3\x82\xc2' 
     354            '\xb6tley Cr\xc3\x83\xc3\x82\xc2\xbce') 
    344355        self.buf.truncate() 
    345356        self.context.clear() 
    346357 
    347         self.encoder.writeString('M\xc3\x83\xc3\x82\xc2\xb6tley Cr\xc3\x83\xc3\x82\xc2\xbce') 
    348         self.assertEquals(self.buf.getvalue(), '\x06+M\xc3\x83\xc3\x82\xc2\xb6tley Cr\xc3\x83\xc3\x82\xc2\xbce') 
     358        self.encoder.writeString('M\xc3\x83\xc3\x82\xc2\xb6tley Cr\xc3\x83' 
     359            '\xc3\x82\xc2\xbce') 
     360        self.assertEquals(self.buf.getvalue(), '\x06+M\xc3\x83\xc3\x82\xc2' 
     361            '\xb6tley Cr\xc3\x83\xc3\x82\xc2\xbce') 
    349362 
    350363 
     
    619632    def test_integer(self): 
    620633        self._run([(0, '\x04\x00')]) 
     634        self._run([(0x35, '\x04\x35')]) 
    621635        self._run([(0x7f, '\x04\x7f')]) 
    622636        self._run([(0x80, '\x04\x81\x00')]) 
     637        self._run([(0xd4, '\x04\x81\x54')]) 
    623638        self._run([(0x3fff, '\x04\xff\x7f')]) 
    624639        self._run([(0x4000, '\x04\x81\x80\x00')]) 
     640        self._run([(0x1a53f, '\x04\x86\xca\x3f')]) 
    625641        self._run([(0x1fffff, '\x04\xff\xff\x7f')]) 
    626642        self._run([(0x200000, '\x04\x80\xc0\x80\x00')]) 
    627         self._run([(0x3fffffff, '\x04\xff\xff\xff\xff')]) 
     643        self._run([(-0x01, '\x04\xff\xff\xff\xff')]) 
     644        self._run([(-0x2a, '\x04\xff\xff\xff\xd6')]) 
     645        self._run([(0xfffffff, '\x04\xbf\xff\xff\xff')]) 
     646        self._run([(-0x10000000, '\x04\xc0\x80\x80\x00')]) 
     647 
     648    def test_unsignedInteger(self): 
     649        tests = [ 
     650            (0, '\x00'), 
     651            (0x7f, '\x7f'), 
     652            (0x80, '\x81\x00'), 
     653            (0x3fff, '\xff\x7f'), 
     654            (0x4000, '\x81\x80\x00'), 
     655            (0x1fffff, '\xff\xff\x7f'), 
     656            (0x200000, '\x80\xc0\x80\x00'), 
     657            (0x3fffffff, '\xff\xff\xff\xff') 
     658        ] 
     659 
     660        for n, s in tests: 
     661            self.buf.truncate(0) 
     662            self.buf.write(s) 
     663            self.buf.seek(0) 
     664            self.assertEqual(self.decoder.readUnsignedInteger(), n) 
    628665 
    629666    def test_infinites(self): 
     
    9961033        self.assertEquals(id(obj1), id(obj2)) 
    9971034 
    998     def test_class_references(self): 
    999         pass 
    1000  
    10011035    def test_static(self): 
    10021036        pyamf.register_class(Spam, 'abc.xyz')