Remove the CACHE_HASH and INTERN_STRINGS preprocessor symbols.
diff --git a/Include/stringobject.h b/Include/stringobject.h
index a5d97fa..9049455 100644
--- a/Include/stringobject.h
+++ b/Include/stringobject.h
@@ -24,28 +24,18 @@
 functions should be applied to nil objects.
 */
 
-/* Two speedup hacks.  Caching the hash saves recalculation of a
-   string's hash value.  Interning strings (which requires hash
-   caching) tries to ensure that only one string object with a given
-   value exists, so equality tests are one pointer comparison.
-   Together, these can speed the interpreter up by as much as 20%.
-   Each costs the size of a long or pointer per string object.  In
-   addition, interned strings live until the end of times.  If you are
-   concerned about memory footprint, simply comment the #define out
-   here (and rebuild everything!). */
-#define CACHE_HASH
-#ifdef CACHE_HASH
-#define INTERN_STRINGS
-#endif
+/* Caching the hash (ob_shash) saves recalculation of a string's hash value.
+   Interning strings (ob_sinterned) 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
+   interning of any string.
+   Together, these sped the interpreter by up to 20%. */
 
 typedef struct {
     PyObject_VAR_HEAD
-#ifdef CACHE_HASH
     long ob_shash;
-#endif
-#ifdef INTERN_STRINGS
     PyObject *ob_sinterned;
-#endif
     char ob_sval[1];
 } PyStringObject;
 
@@ -70,15 +60,9 @@
 extern DL_IMPORT(PyObject *) _PyString_FormatLong(PyObject*, int, int,
 						  int, char**, int*);
 
-#ifdef INTERN_STRINGS
 extern DL_IMPORT(void) PyString_InternInPlace(PyObject **);
 extern DL_IMPORT(PyObject *) PyString_InternFromString(const char *);
 extern DL_IMPORT(void) _Py_ReleaseInternedStrings(void);
-#else
-#define PyString_InternInPlace(p)
-#define PyString_InternFromString(cp) PyString_FromString(cp)
-#define _Py_ReleaseInternedStrings()
-#endif
 
 /* Macro, trading safety for speed */
 #define PyString_AS_STRING(op) (((PyStringObject *)(op))->ob_sval)
diff --git a/Misc/NEWS b/Misc/NEWS
index 8ad196d..2275676 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -89,6 +89,10 @@
 
 Build
 
+- References to the CACHE_HASH and INTERN_STRINGS preprocessor symbols
+  were eliminated.  They were always defined, and the internal features
+  they enabled stopped being experimental long ago.
+
 C API
 
 - Objects allocated using the new PyMalloc_New and PyMalloc_NewVar
diff --git a/Objects/bufferobject.c b/Objects/bufferobject.c
index 57d031c..51b9ef9 100644
--- a/Objects/bufferobject.c
+++ b/Objects/bufferobject.c
@@ -10,9 +10,7 @@
 	void *b_ptr;
 	int b_size;
 	int b_readonly;
-#ifdef CACHE_HASH
 	long b_hash;
-#endif
 } PyBufferObject;
 
 
@@ -36,9 +34,7 @@
 	b->b_ptr = ptr;
 	b->b_size = size;
 	b->b_readonly = readonly;
-#ifdef CACHE_HASH
 	b->b_hash = -1;
-#endif
 
 	return (PyObject *) b;
 }
@@ -152,9 +148,7 @@
 	b->b_ptr = (void *)(b + 1);
 	b->b_size = size;
 	b->b_readonly = 0;
-#ifdef CACHE_HASH
 	b->b_hash = -1;
-#endif
 
 	return o;
 }
@@ -211,10 +205,8 @@
 	register unsigned char *p;
 	register long x;
 
-#ifdef CACHE_HASH
 	if ( self->b_hash != -1 )
 		return self->b_hash;
-#endif
 
 	if ( !self->b_readonly )
 	{
@@ -231,9 +223,7 @@
 	x ^= self->b_size;
 	if (x == -1)
 		x = -2;
-#ifdef CACHE_HASH
 	self->b_hash = x;
-#endif
 	return x;
 }
 
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index a83a851..f4cf0df 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -480,10 +480,8 @@
 	if (!PyDict_Check(op)) {
 		return NULL;
 	}
-#ifdef CACHE_HASH
 	if (!PyString_CheckExact(key) ||
 	    (hash = ((PyStringObject *) key)->ob_shash) == -1)
-#endif
 	{
 		hash = PyObject_Hash(key);
 		if (hash == -1) {
@@ -512,24 +510,18 @@
 		return -1;
 	}
 	mp = (dictobject *)op;
-#ifdef CACHE_HASH
 	if (PyString_CheckExact(key)) {
-#ifdef INTERN_STRINGS
 		if (((PyStringObject *)key)->ob_sinterned != NULL) {
 			key = ((PyStringObject *)key)->ob_sinterned;
 			hash = ((PyStringObject *)key)->ob_shash;
 		}
-		else
-#endif
-		{
+		else {
 			hash = ((PyStringObject *)key)->ob_shash;
 			if (hash == -1)
 				hash = PyObject_Hash(key);
 		}
 	}
-	else
-#endif
-	{
+	else {
 		hash = PyObject_Hash(key);
 		if (hash == -1)
 			return -1;
@@ -564,11 +556,8 @@
 		PyErr_BadInternalCall();
 		return -1;
 	}
-#ifdef CACHE_HASH
 	if (!PyString_CheckExact(key) ||
-	    (hash = ((PyStringObject *) key)->ob_shash) == -1)
-#endif
-	{
+	    (hash = ((PyStringObject *) key)->ob_shash) == -1) {
 		hash = PyObject_Hash(key);
 		if (hash == -1)
 			return -1;
@@ -844,11 +833,8 @@
 	PyObject *v;
 	long hash;
 	assert(mp->ma_table != NULL);
-#ifdef CACHE_HASH
 	if (!PyString_CheckExact(key) ||
-	    (hash = ((PyStringObject *) key)->ob_shash) == -1)
-#endif
-	{
+	    (hash = ((PyStringObject *) key)->ob_shash) == -1) {
 		hash = PyObject_Hash(key);
 		if (hash == -1)
 			return NULL;
@@ -1436,11 +1422,8 @@
 {
 	long hash;
 	register long ok;
-#ifdef CACHE_HASH
 	if (!PyString_CheckExact(key) ||
-	    (hash = ((PyStringObject *) key)->ob_shash) == -1)
-#endif
-	{
+	    (hash = ((PyStringObject *) key)->ob_shash) == -1) {
 		hash = PyObject_Hash(key);
 		if (hash == -1)
 			return NULL;
@@ -1460,11 +1443,8 @@
 	if (!PyArg_ParseTuple(args, "O|O:get", &key, &failobj))
 		return NULL;
 
-#ifdef CACHE_HASH
 	if (!PyString_CheckExact(key) ||
-	    (hash = ((PyStringObject *) key)->ob_shash) == -1)
-#endif
-	{
+	    (hash = ((PyStringObject *) key)->ob_shash) == -1) {
 		hash = PyObject_Hash(key);
 		if (hash == -1)
 			return NULL;
@@ -1489,11 +1469,8 @@
 	if (!PyArg_ParseTuple(args, "O|O:setdefault", &key, &failobj))
 		return NULL;
 
-#ifdef CACHE_HASH
 	if (!PyString_CheckExact(key) ||
-	    (hash = ((PyStringObject *) key)->ob_shash) == -1)
-#endif
-	{
+	    (hash = ((PyStringObject *) key)->ob_shash) == -1) {
 		hash = PyObject_Hash(key);
 		if (hash == -1)
 			return NULL;
@@ -1725,11 +1702,8 @@
 {
 	long hash;
 
-#ifdef CACHE_HASH
 	if (!PyString_CheckExact(key) ||
-	    (hash = ((PyStringObject *) key)->ob_shash) == -1)
-#endif
-	{
+	    (hash = ((PyStringObject *) key)->ob_shash) == -1) {
 		hash = PyObject_Hash(key);
 		if (hash == -1)
 			return -1;
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index b39d9e5..d8e6ff8 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -72,12 +72,8 @@
 	if (op == NULL)
 		return PyErr_NoMemory();
 	PyObject_INIT_VAR(op, &PyString_Type, size);
-#ifdef CACHE_HASH
 	op->ob_shash = -1;
-#endif
-#ifdef INTERN_STRINGS
 	op->ob_sinterned = NULL;
-#endif
 	if (str != NULL)
 		memcpy(op->ob_sval, str, size);
 	op->ob_sval[size] = '\0';
@@ -135,12 +131,8 @@
 	if (op == NULL)
 		return PyErr_NoMemory();
 	PyObject_INIT_VAR(op, &PyString_Type, size);
-#ifdef CACHE_HASH
 	op->ob_shash = -1;
-#endif
-#ifdef INTERN_STRINGS
 	op->ob_sinterned = NULL;
-#endif
 	memcpy(op->ob_sval, str, size+1);
 #ifndef DONT_SHARE_SHORT_STRINGS
 	if (size == 0) {
@@ -737,12 +729,8 @@
 	if (op == NULL)
 		return PyErr_NoMemory();
 	PyObject_INIT_VAR(op, &PyString_Type, size);
-#ifdef CACHE_HASH
 	op->ob_shash = -1;
-#endif
-#ifdef INTERN_STRINGS
 	op->ob_sinterned = NULL;
-#endif
 	memcpy(op->ob_sval, a->ob_sval, (int) a->ob_size);
 	memcpy(op->ob_sval + a->ob_size, b->ob_sval, (int) b->ob_size);
 	op->ob_sval[size] = '\0';
@@ -784,12 +772,8 @@
 	if (op == NULL)
 		return PyErr_NoMemory();
 	PyObject_INIT_VAR(op, &PyString_Type, size);
-#ifdef CACHE_HASH
 	op->ob_shash = -1;
-#endif
-#ifdef INTERN_STRINGS
 	op->ob_sinterned = NULL;
-#endif
 	for (i = 0; i < size; i += a->ob_size)
 		memcpy(op->ob_sval+i, a->ob_sval, (int) a->ob_size);
 	op->ob_sval[size] = '\0';
@@ -945,15 +929,11 @@
 	register unsigned char *p;
 	register long x;
 
-#ifdef CACHE_HASH
 	if (a->ob_shash != -1)
 		return a->ob_shash;
-#ifdef INTERN_STRINGS
 	if (a->ob_sinterned != NULL)
 		return (a->ob_shash =
 			((PyStringObject *)(a->ob_sinterned))->ob_shash);
-#endif
-#endif
 	len = a->ob_size;
 	p = (unsigned char *) a->ob_sval;
 	x = *p << 7;
@@ -962,9 +942,7 @@
 	x ^= a->ob_size;
 	if (x == -1)
 		x = -2;
-#ifdef CACHE_HASH
 	a->ob_shash = x;
-#endif
 	return x;
 }
 
@@ -2730,14 +2708,10 @@
 	pnew = type->tp_alloc(type, n);
 	if (pnew != NULL) {
 		memcpy(PyString_AS_STRING(pnew), PyString_AS_STRING(tmp), n+1);
-#ifdef CACHE_HASH
 		((PyStringObject *)pnew)->ob_shash =
 			((PyStringObject *)tmp)->ob_shash;
-#endif
-#ifdef INTERN_STRINGS
 		((PyStringObject *)pnew)->ob_sinterned =
 			((PyStringObject *)tmp)->ob_sinterned;
-#endif
 	}
 	Py_DECREF(tmp);
 	return pnew;
@@ -3579,7 +3553,6 @@
 }
 
 
-#ifdef INTERN_STRINGS
 
 /* This dictionary will leak at PyString_Fini() time.  That's acceptable
  * because PyString_Fini() specifically frees interned strings that are
@@ -3656,8 +3629,6 @@
 	return s;
 }
 
-#endif
-
 void
 PyString_Fini(void)
 {
@@ -3670,7 +3641,6 @@
 	Py_XDECREF(nullstring);
 	nullstring = NULL;
 #endif
-#ifdef INTERN_STRINGS
 	if (interned) {
 		int pos, changed;
 		PyObject *key, *value;
@@ -3685,10 +3655,8 @@
 			}
 		} while (changed);
 	}
-#endif
 }
 
-#ifdef INTERN_STRINGS
 void _Py_ReleaseInternedStrings(void)
 {
 	if (interned) {
@@ -3698,4 +3666,3 @@
 		interned = NULL;
 	}
 }
-#endif /* INTERN_STRINGS */
diff --git a/Python/import.c b/Python/import.c
index e106aad..50bd729 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -978,7 +978,6 @@
 		if (strlen(buf) != len)
 			continue; /* v contains '\0' */
 #ifdef macintosh
-#ifdef INTERN_STRINGS
 		/*
 		** Speedup: each sys.path item is interned, and
 		** FindResourceModule remembers which items refer to
@@ -987,7 +986,6 @@
 		*/
 		PyString_InternInPlace(&PyList_GET_ITEM(path, i));
 		v = PyList_GET_ITEM(path, i);
-#endif
 		if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
 			static struct filedescr resfiledescr =
 				{"", "", PY_RESOURCE};