bytestring.c: Cache empty and singleton strings.
authorMark Wooding <mdw@distorted.org.uk>
Fri, 9 Nov 2018 12:27:42 +0000 (12:27 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Sat, 10 Nov 2018 01:30:58 +0000 (01:30 +0000)
bytestring.c

index 8557e3b..124ae9a 100644 (file)
@@ -32,6 +32,8 @@
 
 PyTypeObject *bytestring_pytype;
 
+static PyObject *empty, *bytev[256];
+
 static PyObject *allocate(PyTypeObject *ty, size_t n)
 {
   PyStringObject *x;
@@ -47,6 +49,18 @@ static PyObject *allocate(PyTypeObject *ty, size_t n)
 static PyObject *dowrap(PyTypeObject *ty, const void *p, size_t n)
 {
   PyObject *x;
+  int ch;
+
+  if (p && ty == bytestring_pytype) {
+    if (!n) {
+      if (!empty) empty = allocate(ty, 0);
+      Py_INCREF(empty); return (empty);
+    } else if (n == 1 && (ch = *(unsigned char *)p) < sizeof(bytev)) {
+      if (!bytev[ch])
+       { bytev[ch] = allocate(ty, 1); *PyString_AS_STRING(bytev[ch]) = ch; }
+      Py_INCREF(bytev[ch]); return (bytev[ch]);
+    }
+  }
 
   x = allocate(ty, n);
   if (p) memcpy(PyString_AS_STRING(x), p, n);