Author: Armin Rigo <[email protected]>
Branch: 
Changeset: r63100:daab686f929a
Date: 2013-04-06 12:14 +0200
http://bitbucket.org/pypy/pypy/changeset/daab686f929a/

Log:    Remove MANGLE_LEN, the artificial limit which was removed from
        CPython at least as early as 2.5. Add tests and avoid code
        duplication.

diff --git a/pypy/interpreter/astcompiler/misc.py 
b/pypy/interpreter/astcompiler/misc.py
--- a/pypy/interpreter/astcompiler/misc.py
+++ b/pypy/interpreter/astcompiler/misc.py
@@ -1,5 +1,4 @@
 from pypy.interpreter import gateway
-from pypy.interpreter.astcompiler import ast
 from rpython.rlib.objectmodel import we_are_translated
 from rpython.rlib.unroll import unrolling_iterable
 
@@ -28,6 +27,7 @@
 
 
 def parse_future(tree, feature_flags):
+    from pypy.interpreter.astcompiler import ast
     future_lineno = 0
     future_column = 0
     flags = 0
@@ -91,13 +91,9 @@
     return lookup
 
 
-MANGLE_LEN = 256 # magic constant from compile.c
-
 def mangle(name, klass):
     if not name.startswith('__'):
         return name
-    if len(name) + 2 >= MANGLE_LEN:
-        return name
     # Don't mangle __id__ or names with dots. The only time a name with a dot
     # can occur is when we are compiling an import statement that has a package
     # name.
@@ -109,14 +105,4 @@
             i = i + 1
     except IndexError:
         return name
-    klass = klass[i:]
-
-    tlen = len(klass) + len(name)
-    if tlen > MANGLE_LEN:
-        end = len(klass) + MANGLE_LEN-tlen
-        if end < 0:
-            klass = ''     # slices of negative length are invalid in RPython
-        else:
-            klass = klass[:end]
-
-    return "_%s%s" % (klass, name)
+    return "_%s%s" % (klass[i:], name)
diff --git a/pypy/interpreter/astcompiler/test/test_misc.py 
b/pypy/interpreter/astcompiler/test/test_misc.py
new file mode 100644
--- /dev/null
+++ b/pypy/interpreter/astcompiler/test/test_misc.py
@@ -0,0 +1,14 @@
+from pypy.interpreter.astcompiler.misc import mangle
+
+def test_mangle():
+    assert mangle("foo", "Bar") == "foo"
+    assert mangle("__foo__", "Bar") == "__foo__"
+    assert mangle("foo.baz", "Bar") == "foo.baz"
+    assert mangle("__", "Bar") == "__"
+    assert mangle("___", "Bar") == "___"
+    assert mangle("____", "Bar") == "____"
+    assert mangle("__foo", "Bar") == "_Bar__foo"
+    assert mangle("__foo", "_Bar") == "_Bar__foo"
+    assert mangle("__foo", "__Bar") == "_Bar__foo"
+    assert mangle("__foo", "___") == "__foo"
+    assert mangle("___foo", "__Bar") == "_Bar___foo"
diff --git a/pypy/objspace/std/typeobject.py b/pypy/objspace/std/typeobject.py
--- a/pypy/objspace/std/typeobject.py
+++ b/pypy/objspace/std/typeobject.py
@@ -4,6 +4,7 @@
 from pypy.interpreter.function import Function, StaticMethod
 from pypy.interpreter.typedef import weakref_descr, GetSetProperty,\
      descr_get_dict
+from pypy.interpreter.astcompiler.misc import mangle
 from pypy.objspace.std.model import W_Object
 from pypy.objspace.std.register_all import register_all
 from pypy.objspace.std.stdtypedef import std_dict_descr, issubtypedef, Member
@@ -26,34 +27,6 @@
         return w_value.w_value
     return w_value
 
-# from compiler/misc.py
-
-MANGLE_LEN = 256 # magic constant from compile.c
-
-def _mangle(name, klass):
-    if not name.startswith('__'):
-        return name
-    if len(name) + 2 >= MANGLE_LEN:
-        return name
-    if name.endswith('__'):
-        return name
-    try:
-        i = 0
-        while klass[i] == '_':
-            i = i + 1
-    except IndexError:
-        return name
-    klass = klass[i:]
-
-    tlen = len(klass) + len(name)
-    if tlen > MANGLE_LEN:
-        end = len(klass) + MANGLE_LEN-tlen
-        if end < 0:
-            klass = ''     # annotator hint
-        else:
-            klass = klass[:end]
-
-    return "_%s%s" % (klass, name)
 
 class VersionTag(object):
     pass
@@ -987,7 +960,7 @@
         raise OperationError(space.w_TypeError,
                              space.wrap('__slots__ must be identifiers'))
     # create member
-    slot_name = _mangle(slot_name, w_self.name)
+    slot_name = mangle(slot_name, w_self.name)
     if slot_name not in w_self.dict_w:
         # Force interning of slot names.
         slot_name = space.str_w(space.new_interned_str(slot_name))
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to