[pypy-svn] r28502 - pypy/dist/pypy/translator/cli

antocuni at codespeak.net antocuni at codespeak.net
Thu Jun 8 11:08:12 CEST 2006


Author: antocuni
Date: Thu Jun  8 11:08:12 2006
New Revision: 28502

Modified:
   pypy/dist/pypy/translator/cli/database.py
Log:
A bit of refactoring.



Modified: pypy/dist/pypy/translator/cli/database.py
==============================================================================
--- pypy/dist/pypy/translator/cli/database.py	(original)
+++ pypy/dist/pypy/translator/cli/database.py	Thu Jun  8 11:08:12 2006
@@ -25,7 +25,8 @@
         self.classes = {} # classdef --> class_name
         self.functions = {} # graph --> function_name
         self.methods = {} # graph --> method_name
-        self.consts = {}  # value --> const_name
+        self.consts = {}  # value --> AbstractConst, const_name
+        self.pending_consts = {} # value --> AbstractConst, const_name
         self.delegates = {} # StaticMethod --> type_name
         self.const_names = set()
         self.name_count = 0
@@ -64,14 +65,16 @@
         return self.classes.get(classdef, None)
 
     def record_const(self, value):
-        const = AbstractConst.make(self, value)
-        try:
-            name = self.consts[const]
-        except KeyError:
+        if value in self.consts:
+            const, name = self.consts[value]
+        elif value in self.pending_consts:
+            const, name = self.pending_consts[value]
+        else:
+            const = AbstractConst.make(self, value)
             name = const.get_name()
             if name in self.const_names:
                 name += '__%d' % self.next_count()
-            self.consts[const] = name
+            self.pending_consts[value] = const, name
             self.const_names.add(name)
 
         return '%s.%s::%s' % (CONST_NAMESPACE, CONST_CLASS, name)
@@ -122,16 +125,17 @@
         # the last step0.
 
         step = 0
-        while self.consts: 
-            consts = self.consts
-            self.consts = {}
+        while self.pending_consts:
+            pending_consts = self.pending_consts
+            self.consts.update(pending_consts)
+            self.pending_consts = {}
 
             # render field definitions
-            for const, name in consts.iteritems():
+            for const, name in pending_consts.itervalues():
                 ilasm.field(name, const.get_type(), static=True)
 
             ilasm.begin_function('step%d' % step, [], 'void', False, 'static')
-            for const, name in consts.iteritems():
+            for const, name in pending_consts.itervalues():
                 const.init(ilasm)
                 type_ = const.get_type()
                 ilasm.set_static_field (type_, CONST_NAMESPACE, CONST_CLASS, name)



More information about the Pypy-commit mailing list