[pypy-svn] r18692 - pypy/dist/pypy/translator

ac at codespeak.net ac at codespeak.net
Sun Oct 16 17:35:03 CEST 2005


Author: ac
Date: Sun Oct 16 17:35:03 2005
New Revision: 18692

Modified:
   pypy/dist/pypy/translator/geninterplevel.py
Log:
(arre, samuele)
Fix problem with code for classdefinitions being intermixed and
clobbering the shared variable '_dic'



Modified: pypy/dist/pypy/translator/geninterplevel.py
==============================================================================
--- pypy/dist/pypy/translator/geninterplevel.py	(original)
+++ pypy/dist/pypy/translator/geninterplevel.py	Sun Oct 16 17:35:03 2005
@@ -727,6 +727,7 @@
         return name
 
     def nameof_classobj(self, cls):
+        initcode = []
         printable_name = cls.__name__
         if cls.__doc__ and cls.__doc__.lstrip().startswith('NOT_RPYTHON'):
             #raise Exception, "%r should never be reached" % (cls,)
@@ -775,13 +776,13 @@
                     name, self.nameof(key), self.nameof(value))
 
         baseargs = ", ".join(basenames)
-        self.initcode.append('_dic = space.newdict([])')
+        initcode.append('_dic = space.newdict([])')
         for key, value in cls.__dict__.items():
             if key.startswith('__'):
                 if key in ['__module__', '__metaclass__', '__slots__','__new__']:
                     keyname = self.nameof(key)
                     valname = self.nameof(value)
-                    self.initcode.append("space.setitem(_dic, %s, %s)" % (
+                    initcode.append("space.setitem(_dic, %s, %s)" % (
                         keyname, valname))
 
         if cls.__doc__ is not None:
@@ -789,16 +790,19 @@
             docobj = cls.__dict__["__doc__"]
             if type(docobj) in (str, unicode):
                 docstr = render_docstr(cls, "_doc = space.wrap(", ")")
-                self.initcode.append((docstr,)) # not splitted
+                initcode.append((docstr,)) # not splitted
             else:
-                self.initcode.append("_doc = %s" % self.nameof(docobj) )
-            self.initcode.append("space.setitem(_dic, %s, _doc)" % (sdoc,))
+                initcode.append("_doc = %s" % self.nameof(docobj) )
+            initcode.append("space.setitem(_dic, %s, _doc)" % (sdoc,))
+        cls_name = self.nameof(cls.__name__)
+        for l in initcode:
+            self.initcode.append(l)
         self.initcode.append1('_bases = space.newtuple([%(bases)s])\n'
                              '_args = space.newtuple([%(name)s, _bases, _dic])\n'
                              '%(klass)s = space.call(%(meta)s, _args)'
                              % {"bases": baseargs,
                                 "klass": name,
-                                "name" : self.nameof(cls.__name__),
+                                "name" : cls_name,
                                 "meta" : metaclass} )
         
         self.later(initclassobj())



More information about the Pypy-commit mailing list