Author: georg.brandl
Date: Tue Dec 19 21:50:34 2006
New Revision: 53080

Modified:
   python/branches/p3yk/Doc/lib/libfuncs.tex
   python/branches/p3yk/Doc/lib/libsys.tex
   python/branches/p3yk/Doc/tut/tut.tex
   python/branches/p3yk/Include/stringobject.h
   python/branches/p3yk/Lib/test/test_builtin.py
   python/branches/p3yk/Lib/test/test_sys.py
   python/branches/p3yk/Misc/NEWS
   python/branches/p3yk/Misc/python-mode.el
   python/branches/p3yk/Python/bltinmodule.c
   python/branches/p3yk/Python/sysmodule.c
   python/branches/p3yk/Tools/pybench/Strings.py
   python/branches/p3yk/Tools/scripts/fixdiv.py
Log:
Patch #1601678: move intern() to sys.intern().



Modified: python/branches/p3yk/Doc/lib/libfuncs.tex
==============================================================================
--- python/branches/p3yk/Doc/lib/libfuncs.tex   (original)
+++ python/branches/p3yk/Doc/lib/libfuncs.tex   Tue Dec 19 21:50:34 2006
@@ -1262,17 +1262,3 @@
   argument).
 \end{funcdesc}
 
-\begin{funcdesc}{intern}{string}
-  Enter \var{string} in the table of ``interned'' strings and return
-  the interned string -- which is \var{string} itself or a copy.
-  Interning strings is useful to gain a little performance on
-  dictionary lookup -- if the keys in a dictionary are interned, and
-  the lookup key is interned, the key comparisons (after hashing) can
-  be done by a pointer compare instead of a string compare.  Normally,
-  the names used in Python programs are automatically interned, and
-  the dictionaries used to hold module, class or instance attributes
-  have interned keys.  \versionchanged[Interned strings are not
-  immortal (like they used to be in Python 2.2 and before);
-  you must keep a reference to the return value of \function{intern()}
-  around to benefit from it]{2.3}
-\end{funcdesc}

Modified: python/branches/p3yk/Doc/lib/libsys.tex
==============================================================================
--- python/branches/p3yk/Doc/lib/libsys.tex     (original)
+++ python/branches/p3yk/Doc/lib/libsys.tex     Tue Dec 19 21:50:34 2006
@@ -340,6 +340,21 @@
   \versionadded{1.5.2}
 \end{datadesc}
 
+\begin{funcdesc}{intern}{string}
+  Enter \var{string} in the table of ``interned'' strings and return
+  the interned string -- which is \var{string} itself or a copy.
+  Interning strings is useful to gain a little performance on
+  dictionary lookup -- if the keys in a dictionary are interned, and
+  the lookup key is interned, the key comparisons (after hashing) can
+  be done by a pointer compare instead of a string compare.  Normally,
+  the names used in Python programs are automatically interned, and
+  the dictionaries used to hold module, class or instance attributes
+  have interned keys.  \versionchanged[Interned strings are not
+  immortal (like they used to be in Python 2.2 and before);
+  you must keep a reference to the return value of \function{intern()}
+  around to benefit from it]{2.3}
+\end{funcdesc}
+
 \begin{datadesc}{last_type}
 \dataline{last_value}
 \dataline{last_traceback}

Modified: python/branches/p3yk/Doc/tut/tut.tex
==============================================================================
--- python/branches/p3yk/Doc/tut/tut.tex        (original)
+++ python/branches/p3yk/Doc/tut/tut.tex        Tue Dec 19 21:50:34 2006
@@ -2700,7 +2700,7 @@
  'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod',
  'enumerate', 'eval', 'exec', 'execfile', 'exit', 'file', 'filter', 'float',
  'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex',
- 'id', 'int', 'intern', 'isinstance', 'issubclass', 'iter',
+ 'id', 'int', 'isinstance', 'issubclass', 'iter',
  'len', 'license', 'list', 'locals', 'long', 'map', 'max', 'min',
  'object', 'oct', 'open', 'ord', 'pow', 'property', 'quit', 'range',
  'reload', 'repr', 'reversed', 'round', 'set',

Modified: python/branches/p3yk/Include/stringobject.h
==============================================================================
--- python/branches/p3yk/Include/stringobject.h (original)
+++ python/branches/p3yk/Include/stringobject.h Tue Dec 19 21:50:34 2006
@@ -28,7 +28,7 @@
    Interning strings (ob_sstate) tries to ensure that only one string
    object with a given value exists, so equality tests can be one pointer
    comparison.  This is generally restricted to strings that "look like"
-   Python identifiers, although the intern() builtin can be used to force
+   Python identifiers, although the sys.intern() function can be used to force
    interning of any string.
    Together, these sped the interpreter by up to 20%. */
 

Modified: python/branches/p3yk/Lib/test/test_builtin.py
==============================================================================
--- python/branches/p3yk/Lib/test/test_builtin.py       (original)
+++ python/branches/p3yk/Lib/test/test_builtin.py       Tue Dec 19 21:50:34 2006
@@ -842,30 +842,6 @@
         self.assertEqual(int(Foo4()), 42L)
         self.assertRaises(TypeError, int, Foo5())
 
-    def test_intern(self):
-        self.assertRaises(TypeError, intern)
-        s = "never interned before"
-        self.assert_(intern(s) is s)
-        s2 = s.swapcase().swapcase()
-        self.assert_(intern(s2) is s)
-
-        # Subclasses of string can't be interned, because they
-        # provide too much opportunity for insane things to happen.
-        # We don't want them in the interned dict and if they aren't
-        # actually interned, we don't want to create the appearance
-        # that they are by allowing intern() to succeeed.
-        class S(str):
-            def __hash__(self):
-                return 123
-
-        self.assertRaises(TypeError, intern, S("abc"))
-
-        # It's still safe to pass these strings to routines that
-        # call intern internally, e.g. PyObject_SetAttr().
-        s = S("abc")
-        setattr(s, s, s)
-        self.assertEqual(getattr(s, s), s)
-
     def test_iter(self):
         self.assertRaises(TypeError, iter)
         self.assertRaises(TypeError, iter, 42, 42)

Modified: python/branches/p3yk/Lib/test/test_sys.py
==============================================================================
--- python/branches/p3yk/Lib/test/test_sys.py   (original)
+++ python/branches/p3yk/Lib/test/test_sys.py   Tue Dec 19 21:50:34 2006
@@ -350,6 +350,31 @@
         # the test runs under regrtest.
         self.assert_(sys.__stdout__.encoding == sys.__stderr__.encoding)
 
+    def test_intern(self):
+        self.assertRaises(TypeError, sys.intern)
+        s = "never interned before"
+        self.assert_(sys.intern(s) is s)
+        s2 = s.swapcase().swapcase()
+        self.assert_(sys.intern(s2) is s)
+
+        # Subclasses of string can't be interned, because they
+        # provide too much opportunity for insane things to happen.
+        # We don't want them in the interned dict and if they aren't
+        # actually interned, we don't want to create the appearance
+        # that they are by allowing intern() to succeeed.
+        class S(str):
+            def __hash__(self):
+                return 123
+
+        self.assertRaises(TypeError, sys.intern, S("abc"))
+
+        # It's still safe to pass these strings to routines that
+        # call intern internally, e.g. PyObject_SetAttr().
+        s = S("abc")
+        setattr(s, s, s)
+        self.assertEqual(getattr(s, s), s)
+
+
 def test_main():
     test.test_support.run_unittest(SysModuleTest)
 

Modified: python/branches/p3yk/Misc/NEWS
==============================================================================
--- python/branches/p3yk/Misc/NEWS      (original)
+++ python/branches/p3yk/Misc/NEWS      Tue Dec 19 21:50:34 2006
@@ -12,7 +12,7 @@
 TO DO
 -----
 
-- See PEP 3000.
+- See PEP 3000, 3100.
 
 - Test merging certain changes from the 2.5 HEAD code.
 
@@ -36,7 +36,11 @@
 Core and Builtins
 -----------------
 
-- Renamed nb_nonzero to nb_bool and __nonzero__ to __bool__
+- Moved intern() to sys.intern().
+
+- exec is now a function.
+
+- Renamed nb_nonzero to nb_bool and __nonzero__ to __bool__.
 
 - Classic classes are a thing of the past.  All classes are new style.
 
@@ -90,7 +94,7 @@
 - zip returns an iterator
 
 - Additions:
-  set literals
+  set literals, ellipsis literal
 
 
 Extension Modules

Modified: python/branches/p3yk/Misc/python-mode.el
==============================================================================
--- python/branches/p3yk/Misc/python-mode.el    (original)
+++ python/branches/p3yk/Misc/python-mode.el    Tue Dec 19 21:50:34 2006
@@ -382,7 +382,7 @@
                          "delattr" "dict" "dir" "divmod"
                          "enumerate" "eval" "execfile" "exit" "file"
                          "filter" "float" "getattr" "globals" "hasattr"
-                         "hash" "hex" "id" "int" "intern"
+                         "hash" "hex" "id" "int"
                          "isinstance" "issubclass" "iter" "len" "license"
                          "list" "locals" "long" "map" "max" "min" "object"
                          "oct" "open" "ord" "pow" "property" "range"

Modified: python/branches/p3yk/Python/bltinmodule.c
==============================================================================
--- python/branches/p3yk/Python/bltinmodule.c   (original)
+++ python/branches/p3yk/Python/bltinmodule.c   Tue Dec 19 21:50:34 2006
@@ -1119,31 +1119,6 @@
 
 
 static PyObject *
-builtin_intern(PyObject *self, PyObject *args)
-{
-       PyObject *s;
-       if (!PyArg_ParseTuple(args, "S:intern", &s))
-               return NULL;
-       if (!PyString_CheckExact(s)) {
-               PyErr_SetString(PyExc_TypeError,
-                               "can't intern subclass of string");
-               return NULL;
-       }
-       Py_INCREF(s);
-       PyString_InternInPlace(&s);
-       return s;
-}
-
-PyDoc_STRVAR(intern_doc,
-"intern(string) -> string\n\
-\n\
-``Intern'' the given string.  This enters the string in the (global)\n\
-table of interned strings whose purpose is to speed up dictionary lookups.\n\
-Return the string itself or the previously interned string object with the\n\
-same value.");
-
-
-static PyObject *
 builtin_iter(PyObject *self, PyObject *args)
 {
        PyObject *v, *w = NULL;
@@ -2069,7 +2044,6 @@
        {"hash",        builtin_hash,       METH_O, hash_doc},
        {"hex",         builtin_hex,        METH_O, hex_doc},
        {"id",          builtin_id,         METH_O, id_doc},
-       {"intern",      builtin_intern,     METH_VARARGS, intern_doc},
        {"isinstance",  builtin_isinstance, METH_VARARGS, isinstance_doc},
        {"issubclass",  builtin_issubclass, METH_VARARGS, issubclass_doc},
        {"iter",        builtin_iter,       METH_VARARGS, iter_doc},

Modified: python/branches/p3yk/Python/sysmodule.c
==============================================================================
--- python/branches/p3yk/Python/sysmodule.c     (original)
+++ python/branches/p3yk/Python/sysmodule.c     Tue Dec 19 21:50:34 2006
@@ -264,6 +264,32 @@
 
 #endif
 
+
+static PyObject *
+sys_intern(PyObject *self, PyObject *args)
+{
+       PyObject *s;
+       if (!PyArg_ParseTuple(args, "S:intern", &s))
+               return NULL;
+       if (!PyString_CheckExact(s)) {
+               PyErr_SetString(PyExc_TypeError,
+                               "can't intern subclass of string");
+               return NULL;
+       }
+       Py_INCREF(s);
+       PyString_InternInPlace(&s);
+       return s;
+}
+
+PyDoc_STRVAR(intern_doc,
+"intern(string) -> string\n\
+\n\
+``Intern'' the given string.  This enters the string in the (global)\n\
+table of interned strings whose purpose is to speed up dictionary lookups.\n\
+Return the string itself or the previously interned string object with the\n\
+same value.");
+
+
 /*
  * Cached interned string objects used for calling the profile and
  * trace functions.  Initialized by trace_init().
@@ -772,6 +798,7 @@
        {"getwindowsversion", (PyCFunction)sys_getwindowsversion, METH_NOARGS,
         getwindowsversion_doc},
 #endif /* MS_WINDOWS */
+       {"intern",      sys_intern,     METH_VARARGS, intern_doc},
 #ifdef USE_MALLOPT
        {"mdebug",      sys_mdebug, METH_VARARGS},
 #endif

Modified: python/branches/p3yk/Tools/pybench/Strings.py
==============================================================================
--- python/branches/p3yk/Tools/pybench/Strings.py       (original)
+++ python/branches/p3yk/Tools/pybench/Strings.py       Tue Dec 19 21:50:34 2006
@@ -1,5 +1,6 @@
 from pybench import Test
 from string import join
+import sys
 
 class ConcatStrings(Test):
 
@@ -174,7 +175,7 @@
     def test(self):
 
         # Make sure the strings *are* interned
-        s = intern(join(map(str,range(10))))
+        s = sys.intern(join(map(str,range(10))))
         t = s
 
         for i in xrange(self.rounds):
@@ -240,7 +241,7 @@
 
     def calibrate(self):
 
-        s = intern(join(map(str,range(10))))
+        s = sys.intern(join(map(str,range(10))))
         t = s
 
         for i in xrange(self.rounds):

Modified: python/branches/p3yk/Tools/scripts/fixdiv.py
==============================================================================
--- python/branches/p3yk/Tools/scripts/fixdiv.py        (original)
+++ python/branches/p3yk/Tools/scripts/fixdiv.py        Tue Dec 19 21:50:34 2006
@@ -198,7 +198,7 @@
         list = warnings.get(filename)
         if list is None:
             warnings[filename] = list = []
-        list.append((int(lineno), intern(what)))
+        list.append((int(lineno), sys.intern(what)))
     f.close()
     return warnings
 
_______________________________________________
Python-3000-checkins mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-3000-checkins

Reply via email to