[pypy-svn] r15056 - pypy/dist/pypy/lib

tismer at codespeak.net tismer at codespeak.net
Mon Jul 25 18:58:20 CEST 2005


Author: tismer
Date: Mon Jul 25 18:58:18 2005
New Revision: 15056

Modified:
   pypy/dist/pypy/lib/marshal.py
Log:
made marshal CPython 2.5 compatible.

next step is to geninterp it, to have something
to bootstrap compiled code.

Modified: pypy/dist/pypy/lib/marshal.py
==============================================================================
--- pypy/dist/pypy/lib/marshal.py	(original)
+++ pypy/dist/pypy/lib/marshal.py	Mon Jul 25 18:58:18 2005
@@ -15,6 +15,9 @@
 
 TYPE_NULL     = '0'
 TYPE_NONE     = 'N'
+TYPE_FALSE    = 'F'
+TYPE_TRUE     = 'T'
+TYPE_STOPITER = 'S'
 TYPE_ELLIPSIS = '.'
 TYPE_INT      = 'i'
 TYPE_INT64    = 'I'
@@ -22,13 +25,17 @@
 TYPE_COMPLEX  = 'x'
 TYPE_LONG     = 'l'
 TYPE_STRING   = 's'
+TYPE_INTERNED = 't'
+TYPE_STRINGREF= 'R'
 TYPE_TUPLE    = '('
 TYPE_LIST     = '['
 TYPE_DICT     = '{'
 TYPE_CODE     = 'c'
 TYPE_UNKNOWN  = '?'
-FALSE_CODE    = 'F'
-TRUE_CODE     = 'T'
+TYPE_UNICODE  = 'u'
+TYPE_UNKNOWN  = '?'
+TYPE_SET      = '<'
+TYPE_FROZENSET= '>'
 
 class Marshaller:
 
@@ -62,11 +69,16 @@
 
     def dump_bool(self, x):
         if x:
-            self.f.write(TRUE_CODE)
+            self.f.write(TYPE_TRUE)
         else:
-            self.f.write(FALSE_CODE)
+            self.f.write(TYPE_FALSE)
     dispatch[bool] = dump_bool
 
+    def dump_stopiter(self, x):
+        assert x is StopIteration
+        self.f.write(TYPE_STOPITER)
+    dispatch[type(StopIteration)] = dump_stopiter
+
     def dump_ellipsis(self, x):
         self.f.write(TYPE_ELLIPSIS)
     
@@ -123,11 +135,20 @@
         pass
 
     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.w_long(len(x))
         self.f.write(x)
     dispatch[StringType] = dump_string
 
+    def dump_unicode(self, x):
+        self.f.write(TYPE_UNICODE)
+        s = x.encode('utf8')
+        self.w_long(len(s))
+        self.f.write(s)
+    dispatch[UnicodeType] = dump_unicode
+
     def dump_tuple(self, x):
         self.f.write(TYPE_TUPLE)
         self.w_long(len(x))
@@ -152,17 +173,19 @@
 
     def dump_code(self, x):
         self.f.write(TYPE_CODE)
-        self.w_short(x.co_argcount)
-        self.w_short(x.co_nlocals)
-        self.w_short(x.co_stacksize)
-        self.w_short(x.co_flags)
+        self.w_long(x.co_argcount)
+        self.w_long(x.co_nlocals)
+        self.w_long(x.co_stacksize)
+        self.w_long(x.co_flags)
         self.dump(x.co_code)
         self.dump(x.co_consts)
         self.dump(x.co_names)
         self.dump(x.co_varnames)
+        self.dump(x.co_freevars)
+        self.dump(x.co_cellvars)
         self.dump(x.co_filename)
         self.dump(x.co_name)
-        self.w_short(x.co_firstlineno)
+        self.w_long(x.co_firstlineno)
         self.dump(x.co_lnotab)
     try:
         dispatch[CodeType] = dump_code
@@ -179,6 +202,7 @@
 
     def __init__(self, f):
         self.f = f
+        self._stringtable = []
 
     def load(self):
         c = self.f.read(1)
@@ -232,14 +256,18 @@
 
     def load_true(self):
         return True
-    dispatch[TRUE_CODE] = load_true
+    dispatch[TYPE_TRUE] = load_true
 
     def load_false(self):
         return False
-    dispatch[FALSE_CODE] = load_false
+    dispatch[TYPE_FALSE] = load_false
+
+    def load_stopiter(self):
+        return StopIteration
+    dispatch[TYPE_STOPITER] = load_stopiter
 
     def load_ellipsis(self):
-        return EllipsisType
+        return Ellipsis
     dispatch[TYPE_ELLIPSIS] = load_ellipsis
 
     def load_int(self):
@@ -284,6 +312,25 @@
         return self.f.read(n)
     dispatch[TYPE_STRING] = load_string
 
+    def load_interned(self):
+        n = self.r_long()
+        ret = intern(self.f.read(n))
+        self._stringtable.append(ret)
+        return ret
+    dispatch[TYPE_INTERNED] = load_interned
+
+    def load_stringref(self):
+        n = self.r_long()
+        return self._stringtable[n]
+    dispatch[TYPE_STRINGREF] = load_stringref
+
+    def load_unicode(self):
+        n = self.r_long()
+        s = self.f.read(n)
+        ret = s.decode('utf8')
+        return ret
+    dispatch[TYPE_UNICODE] = load_unicode
+
     def load_tuple(self):
         return tuple(self.load_list())
     dispatch[TYPE_TUPLE] = load_tuple
@@ -308,22 +355,25 @@
     dispatch[TYPE_DICT] = load_dict
 
     def load_code(self):
-        argcount = self.r_short()
-        nlocals = self.r_short()
-        stacksize = self.r_short()
-        flags = self.r_short()
+        argcount = self.r_long()
+        nlocals = self.r_long()
+        stacksize = self.r_long()
+        flags = self.r_long()
         code = self.load()
         consts = self.load()
         names = self.load()
         varnames = self.load()
+        freevars = self.load()
+        cellvars = self.load()
         filename = self.load()
         name = self.load()
-        firstlineno = self.r_short()
+        firstlineno = self.r_long()
         lnotab = self.load()
         if not new:
             raise RuntimeError, "can't unmarshal code objects; no 'new' module"
         return new.code(argcount, nlocals, stacksize, flags, code, consts,
-                        names, varnames, filename, name, firstlineno, lnotab)
+                        names, varnames, filename, name, firstlineno, lnotab,
+                        freevars, cellvars)
     dispatch[TYPE_CODE] = load_code
 
 



More information about the Pypy-commit mailing list