[pypy-svn] r15101 - pypy/dist/pypy/module/marshal

tismer at codespeak.net tismer at codespeak.net
Tue Jul 26 13:16:19 CEST 2005


Author: tismer
Date: Tue Jul 26 13:16:18 2005
New Revision: 15101

Modified:
   pypy/dist/pypy/module/marshal/app_marshal.py
Log:


Modified: pypy/dist/pypy/module/marshal/app_marshal.py
==============================================================================
--- pypy/dist/pypy/module/marshal/app_marshal.py	(original)
+++ pypy/dist/pypy/module/marshal/app_marshal.py	Tue Jul 26 13:16:18 2005
@@ -1,9 +1,8 @@
 """Marshal module written in Python.
 """
 
-import StringIO
-import string
 import types
+import os
 try:
     import new
 except ImportError:
@@ -36,8 +35,18 @@
 
     dispatch = {}
 
-    def __init__(self, f):
-        self.f = f
+    def __init__(self, fd):
+        self.fd = fd
+        self.buffer = []
+
+    def _write(self, data):
+        if self.fd >= 0:
+            os.write(self.fd, data)
+        else:
+            self.buffer.append(data)
+
+    def getvalue(self):
+        return ''.join(self.buffer)
 
     def dump(self, x):
         try:
@@ -56,36 +65,34 @@
         self.w_long(x>>32)
 
     def w_long(self, x):
-        write = self.f.write
-        write(chr((x)     & 0xff))
-        write(chr((x>> 8) & 0xff))
-        write(chr((x>>16) & 0xff))
-        write(chr((x>>24) & 0xff))
+        self._write(chr((x)     & 0xff))
+        self._write(chr((x>> 8) & 0xff))
+        self._write(chr((x>>16) & 0xff))
+        self._write(chr((x>>24) & 0xff))
 
     def w_short(self, x):
-        write = self.f.write
-        write(chr((x)     & 0xff))
-        write(chr((x>> 8) & 0xff))
+        self._write(chr((x)     & 0xff))
+        self._write(chr((x>> 8) & 0xff))
 
     def dump_none(self, x):
-        self.f.write(TYPE_NONE)
+        self._write(TYPE_NONE)
     dispatch[types.NoneType] = dump_none
 
     def dump_bool(self, x):
         if x:
-            self.f.write(TYPE_TRUE)
+            self._write(TYPE_TRUE)
         else:
-            self.f.write(TYPE_FALSE)
+            self._write(TYPE_FALSE)
     dispatch[bool] = dump_bool
 
     def dump_stopiter(self, x):
         if x is not StopIteration:
             raise ValueError, "unmarshallable object"
-        self.f.write(TYPE_STOPITER)
+        self._write(TYPE_STOPITER)
     dispatch[type(StopIteration)] = dump_stopiter
 
     def dump_ellipsis(self, x):
-        self.f.write(TYPE_ELLIPSIS)
+        self._write(TYPE_ELLIPSIS)
     
     try:
         dispatch[types.EllipsisType] = dump_ellipsis
@@ -95,15 +102,15 @@
     def dump_int(self, x):
         y = x>>31
         if y and y != -1:
-            self.f.write(TYPE_INT64)
+            self._write(TYPE_INT64)
             self.w_long64(x)
         else:
-            self.f.write(TYPE_INT)
+            self._write(TYPE_INT)
             self.w_long(x)
     dispatch[types.IntType] = dump_int
 
     def dump_long(self, x):
-        self.f.write(TYPE_LONG)
+        self._write(TYPE_LONG)
         sign = 1
         if x < 0:
             sign = -1
@@ -118,7 +125,7 @@
     dispatch[types.LongType] = dump_long
 
     def dump_float(self, x):
-        write = self.f.write
+        write = self._write
         write(TYPE_FLOAT)
         s = `x`
         write(chr(len(s)))
@@ -126,7 +133,7 @@
     dispatch[types.FloatType] = dump_float
 
     def dump_complex(self, x):
-        write = self.f.write
+        write = self._write
         write(TYPE_COMPLEX)
         s = `x.real`
         write(chr(len(s)))
@@ -142,42 +149,42 @@
     def dump_string(self, x):
         # XXX we can't check for interned strings, yet,
         # so we (for now) never create TYPE_INTERNED or TYPE_STRINGREF
-        self.f.write(TYPE_STRING)
+        self._write(TYPE_STRING)
         self.w_long(len(x))
-        self.f.write(x)
+        self._write(x)
     dispatch[types.StringType] = dump_string
 
     def dump_unicode(self, x):
-        self.f.write(TYPE_UNICODE)
+        self._write(TYPE_UNICODE)
         s = x.encode('utf8')
         self.w_long(len(s))
-        self.f.write(s)
+        self._write(s)
     dispatch[types.UnicodeType] = dump_unicode
 
     def dump_tuple(self, x):
-        self.f.write(TYPE_TUPLE)
+        self._write(TYPE_TUPLE)
         self.w_long(len(x))
         for item in x:
             self.dump(item)
     dispatch[types.TupleType] = dump_tuple
 
     def dump_list(self, x):
-        self.f.write(TYPE_LIST)
+        self._write(TYPE_LIST)
         self.w_long(len(x))
         for item in x:
             self.dump(item)
     dispatch[types.ListType] = dump_list
 
     def dump_dict(self, x):
-        self.f.write(TYPE_DICT)
+        self._write(TYPE_DICT)
         for key, value in x.items():
             self.dump(key)
             self.dump(value)
-        self.f.write(TYPE_NULL)
+        self._write(TYPE_NULL)
     dispatch[types.DictionaryType] = dump_dict
 
     def dump_code(self, x):
-        self.f.write(TYPE_CODE)
+        self._write(TYPE_CODE)
         self.w_long(x.co_argcount)
         self.w_long(x.co_nlocals)
         self.w_long(x.co_stacksize)
@@ -198,7 +205,7 @@
         pass
 
     def dump_set(self, x):
-        self.f.write(TYPE_SET)
+        self._write(TYPE_SET)
         self.w_long(len(x))
         for each in x:
             self.dump(each)
@@ -208,7 +215,7 @@
         pass
 
     def dump_frozenset(self, x):
-        self.f.write(TYPE_FROZENSET)
+        self._write(TYPE_FROZENSET)
         self.w_long(len(x))
         for each in x:
             self.dump(each)
@@ -224,46 +231,66 @@
 
     dispatch = {}
 
-    def __init__(self, f):
-        self.f = f
+    def __init__(self, fd):
+        self.fd = fd
+        self.bufstr = ''
+        self.bufpos = 0
         self._stringtable = []
 
+    def _read(self):
+        if self.fd >= 0:
+            return self.fd.read(1)
+        else:
+            ret = self.bufstr[self.bufpos]
+            self.bufpos += 1
+            return ret
+
+    def _readn(self, n):
+        if self.fd >= 0:
+            return self.fd.read(n)
+        else:
+            ret = self.bufstr[self.bufpos : self.bufpos+n]
+            self.bufpos += n
+            if self.bufpos > len(self.bufstr):
+                raise EOFError, "read past buffer"
+            return ret
+
+    def setvalue(self, data):
+        self.bufstr = data
+
     def load(self):
-        c = self.f.read(1)
+        c = self._read()
         if not c:
             raise EOFError
         return self.dispatch[c](self)
 
     def r_short(self):
-        read = self.f.read
-        lo = ord(read(1))
-        hi = ord(read(1))
+        lo = ord(self._read())
+        hi = ord(self._read())
         x = lo | (hi<<8)
         if x & 0x8000:
             x = x - 0x10000
         return x
 
     def r_long(self):
-        read = self.f.read
-        a = ord(read(1))
-        b = ord(read(1))
-        c = ord(read(1))
-        d = ord(read(1))
+        a = ord(self._read())
+        b = ord(self._read())
+        c = ord(self._read())
+        d = ord(self._read())
         x = a | (b<<8) | (c<<16) | (d<<24)
         if d & 0x80 and x > 0:
             x = -((1L<<32) - x)
         return x
 
     def r_long64(self):
-        read = self.f.read
-        a = ord(read(1))
-        b = ord(read(1))
-        c = ord(read(1))
-        d = ord(read(1))
-        e = long(ord(read(1)))
-        f = long(ord(read(1)))
-        g = long(ord(read(1)))
-        h = long(ord(read(1)))
+        a = ord(self._read())
+        b = ord(self._read())
+        c = ord(self._read())
+        d = ord(self._read())
+        e = long(ord(self._read()))
+        f = long(ord(self._read()))
+        g = long(ord(self._read()))
+        h = long(ord(self._read()))
         x = a | (b<<8) | (c<<16) | (d<<24)
         x = x | (e<<32) | (f<<40) | (g<<48) | (h<<56)
         if h & 0x80 and x > 0:
@@ -316,29 +343,29 @@
     dispatch[TYPE_LONG] = load_long
 
     def load_float(self):
-        n = ord(self.f.read(1))
-        s = self.f.read(n)
-        return string.atof(s)
+        n = ord(self._read())
+        s = self._readn(n)
+        return float(s)
     dispatch[TYPE_FLOAT] = load_float
 
     def load_complex(self):
-        n = ord(self.f.read(1))
-        s = self.f.read(n)
+        n = ord(self._read())
+        s = self._readn(n)
         real = float(s)
-        n = ord(self.f.read(1))
-        s = self.f.read(n)
+        n = ord(self._read())
+        s = self._readn(n)
         imag = float(s)
         return complex(real, imag)
     dispatch[TYPE_COMPLEX] = load_complex
 
     def load_string(self):
         n = self.r_long()
-        return self.f.read(n)
+        return self._readn(n)
     dispatch[TYPE_STRING] = load_string
 
     def load_interned(self):
         n = self.r_long()
-        ret = intern(self.f.read(n))
+        ret = intern(self._readn(n))
         self._stringtable.append(ret)
         return ret
     dispatch[TYPE_INTERNED] = load_interned
@@ -350,7 +377,7 @@
 
     def load_unicode(self):
         n = self.r_long()
-        s = self.f.read(n)
+        s = self._readn(n)
         ret = s.decode('utf8')
         return ret
     dispatch[TYPE_UNICODE] = load_unicode
@@ -420,16 +447,17 @@
     frozenset = set
 
 def dump(x, f):
-    Marshaller(f).dump(x)
+    Marshaller(f.fileno()).dump(x)
 
 def load(f):
-    return Unmarshaller(f).load()
+    return Unmarshaller(f.fileno()).load()
 
 def dumps(x):
-    f = StringIO.StringIO()
-    dump(x, f)
-    return f.getvalue()
+    m = Marshaller(-1)
+    m.dump(x)
+    return m.getvalue()
 
 def loads(s):
-    f = StringIO.StringIO(s)
-    return load(f)
+    um = Unmarshaller(-1)
+    um.setvalue(s)
+    return um.load()



More information about the Pypy-commit mailing list