diff Include/stringobject.h @ 24901:bc660f73795c legacy-trunk

SF patch 576101, by Oren Tirosh: alternative implementation of interning. I modified Oren's patch significantly, but the basic idea and most of the implementation is unchanged. Interned strings created with PyString_InternInPlace() are now mortal, and you must keep a reference to the resulting string around; use the new function PyString_InternImmortal() to create immortal interned strings.
author Guido van Rossum <guido@python.org>
date Mon, 19 Aug 2002 21:43:18 +0000
parents ab63af3ec349
children 6c21e95a4881
line wrap: on
line diff
--- a/Include/stringobject.h	Mon Aug 19 21:17:53 2002 +0000
+++ b/Include/stringobject.h	Mon Aug 19 21:43:18 2002 +0000
@@ -25,7 +25,7 @@
 */
 
 /* Caching the hash (ob_shash) saves recalculation of a string's hash value.
-   Interning strings (ob_sinterned) tries to ensure that only one string
+   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
@@ -35,10 +35,14 @@
 typedef struct {
     PyObject_VAR_HEAD
     long ob_shash;
-    PyObject *ob_sinterned;
+    int ob_sstate;
     char ob_sval[1];
 } PyStringObject;
 
+#define SSTATE_NOT_INTERNED 0
+#define SSTATE_INTERNED_MORTAL 1
+#define SSTATE_INTERNED_IMMORTAL 2
+
 PyAPI_DATA(PyTypeObject) PyBaseString_Type;
 PyAPI_DATA(PyTypeObject) PyString_Type;
 
@@ -66,9 +70,13 @@
 						   const char *);
 
 PyAPI_FUNC(void) PyString_InternInPlace(PyObject **);
+PyAPI_FUNC(void) PyString_InternImmortal(PyObject **);
 PyAPI_FUNC(PyObject *) PyString_InternFromString(const char *);
 PyAPI_FUNC(void) _Py_ReleaseInternedStrings(void);
 
+/* Use only if you know it's a string */
+#define PyString_CHECK_INTERNED(op) (((PyStringObject *)(op))->ob_sstate)
+
 /* Macro, trading safety for speed */
 #define PyString_AS_STRING(op) (((PyStringObject *)(op))->ob_sval)
 #define PyString_GET_SIZE(op)  (((PyStringObject *)(op))->ob_size)