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