Index: unicodeobject.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Objects/unicodeobject.c,v retrieving revision 2.86 diff -u -r2.86 unicodeobject.c --- unicodeobject.c 2001/04/21 02:46:11 2.86 +++ unicodeobject.c 2001/04/21 12:11:15 @@ -90,6 +90,8 @@ static PyUnicodeObject *unicode_freelist; static int unicode_freelist_size; +static PyUnicodeObject *unicode_ascii[128]; + /* Default encoding to use and assume when NULL is passed as encoding parameter; it is initialized by _PyUnicode_Init(). @@ -1652,6 +1654,19 @@ { PyUnicodeObject *v; Py_UNICODE *p; + + if (size == 1 && *(unsigned char*)s < 128) { + v = unicode_ascii[(int)*s]; + if (!v) { + v = _PyUnicode_New(1); + if (!v) + return NULL; + v->str[0] = *s; + unicode_ascii[(int)*s] = v; + } + Py_INCREF(v); + return (PyObject*)v; + } /* ASCII is equivalent to the first 128 ordinals in Unicode. */ v = _PyUnicode_New(size); @@ -5184,6 +5199,8 @@ void _PyUnicode_Init(void) { + int i; + /* Doublecheck the configuration... */ if (sizeof(Py_UNICODE) != 2) Py_FatalError("Unicode configuration error: " @@ -5194,6 +5211,9 @@ unicode_freelist_size = 0; unicode_empty = _PyUnicode_New(0); strcpy(unicode_default_encoding, "ascii"); + + for (i = 0; i < 128; i++) + unicode_ascii[i] = NULL; } /* Finalize the Unicode implementation */ @@ -5202,9 +5222,17 @@ _PyUnicode_Fini(void) { PyUnicodeObject *u; + int i; Py_XDECREF(unicode_empty); unicode_empty = NULL; + + for (i = 0; i < 128; i++) { + if (unicode_ascii[i]) { + Py_DECREF(unicode_ascii[i]); + unicode_ascii[i] = NULL; + } + } for (u = unicode_freelist; u != NULL;) { PyUnicodeObject *v = u;