[pypy-svn] r7692 - pypy/trunk/src/pypy/translator

arigo at codespeak.net arigo at codespeak.net
Sat Nov 27 23:48:57 CET 2004


Author: arigo
Date: Sat Nov 27 23:48:57 2004
New Revision: 7692

Modified:
   pypy/trunk/src/pypy/translator/genc.py
Log:
Generic handling of characters forbidden in C identifiers.
Triggered by the bug that "gfunc_<lambda>" isn't a valid C identifier :-)


Modified: pypy/trunk/src/pypy/translator/genc.py
==============================================================================
--- pypy/trunk/src/pypy/translator/genc.py	(original)
+++ pypy/trunk/src/pypy/translator/genc.py	Sat Nov 27 23:48:57 2004
@@ -93,6 +93,7 @@
             return name
 
     def uniquename(self, basename):
+        basename = basename.translate(C_IDENTIFIER)
         n = self.seennames.get(basename, 0)
         self.seennames[basename] = n+1
         if n == 0:
@@ -145,22 +146,13 @@
         name = 'gfloat_%s' % value
         name = (name.replace('-', 'minus')
                     .replace('.', 'dot'))
-        chrs = [c for c in name if ('a' <= c <='z' or
-                                    'A' <= c <='Z' or
-                                    '0' <= c <='9' or
-                                    '_' == c )]
-        name = ''.join(chrs)
         name = self.uniquename(name)
         self.initcode.append('INITCHK(%s = '
                              'PyFloat_FromDouble(%r))' % (name, value))
         return name
 
     def nameof_str(self, value):
-        chrs = [c for c in value[:32] if ('a' <= c <='z' or
-                                          'A' <= c <='Z' or
-                                          '0' <= c <='9' or
-                                          '_' == c )]
-        name = self.uniquename('gstr_' + ''.join(chrs))
+        name = self.uniquename('gstr_' + value[:32])
         if [c for c in value if c<' ' or c>'~' or c=='"' or c=='\\']:
             # non-printable string
             s = 'chr_%s' % name
@@ -837,3 +829,10 @@
         return type.replace('@', name)
     else:
         return ('%s %s' % (type, name)).rstrip()
+
+# a translation table suitable for str.translate() to remove
+# non-C characters from an identifier
+C_IDENTIFIER = ''.join([(('0' <= chr(i) <= '9' or
+                          'a' <= chr(i) <= 'z' or
+                          'A' <= chr(i) <= 'Z') and chr(i) or '_')
+                        for i in range(256)])



More information about the Pypy-commit mailing list