diff -NraupbwB Python-2.5.1/Include/stringobject.h Python-2.5.1-patched/Include/stringobject.h --- Python-2.5.1/Include/stringobject.h 2006-02-15 18:27:45.000000000 +0100 +++ Python-2.5.1-patched/Include/stringobject.h 2007-09-07 21:59:11.000000000 +0200 @@ -36,7 +36,11 @@ typedef struct { PyObject_VAR_HEAD long ob_shash; int ob_sstate; + #ifndef PREMAJEK + char *ob_sval; + #else char ob_sval[1]; + #endif /* Invariants: * ob_sval contains space for 'ob_size+1' elements. diff -NraupbwB Python-2.5.1/Objects/stringobject.c Python-2.5.1-patched/Objects/stringobject.c --- Python-2.5.1/Objects/stringobject.c 2007-02-26 14:51:34.000000000 +0100 +++ Python-2.5.1-patched/Objects/stringobject.c 2007-09-07 22:26:07.000000000 +0200 @@ -10,6 +10,16 @@ int null_strings, one_strings; #endif +#ifndef PREMAJEK +#include +char *string_ro_buffer; +int string_ro_buffer_bytesleft; +int string_ro_buffer_enabled; + +static PyObject *string_setmajekhack(PyStringObject *a); + +#endif + static PyStringObject *characters[UCHAR_MAX + 1]; static PyStringObject *nullstring; @@ -72,12 +82,28 @@ PyString_FromStringAndSize(const char *s } /* Inline PyObject_NewVar */ + #ifndef PREMAJEK + if(string_ro_buffer_enabled && string_ro_buffer_bytesleft > size+1){ + op = (PyStringObject *)PyObject_MALLOC(sizeof(PyStringObject)); + }else + op = (PyStringObject *)PyObject_MALLOC(sizeof(PyStringObject) + size + 1); + #else op = (PyStringObject *)PyObject_MALLOC(sizeof(PyStringObject) + size); + #endif + if (op == NULL) return PyErr_NoMemory(); PyObject_INIT_VAR(op, &PyString_Type, size); op->ob_shash = -1; op->ob_sstate = SSTATE_NOT_INTERNED; + #ifndef PREMAJEK + if(string_ro_buffer_enabled && string_ro_buffer_bytesleft > size+1){ + op->ob_sval = string_ro_buffer; + string_ro_buffer += size + 1; + string_ro_buffer_bytesleft -= size + 1; + }else + op->ob_sval = (char*)(&op->ob_sval + 1); + #endif if (str != NULL) Py_MEMCPY(op->ob_sval, str, size); op->ob_sval[size] = '\0'; @@ -127,12 +154,27 @@ PyString_FromString(const char *str) } /* Inline PyObject_NewVar */ + #ifndef PREMAJEK + if(string_ro_buffer_enabled && string_ro_buffer_bytesleft > size+1){ + op = (PyStringObject *)PyObject_MALLOC(sizeof(PyStringObject)); + }else + op = (PyStringObject *)PyObject_MALLOC(sizeof(PyStringObject) + size + 1); + #else op = (PyStringObject *)PyObject_MALLOC(sizeof(PyStringObject) + size); + #endif if (op == NULL) return PyErr_NoMemory(); PyObject_INIT_VAR(op, &PyString_Type, size); op->ob_shash = -1; op->ob_sstate = SSTATE_NOT_INTERNED; + #ifndef PREMAJEK + if(string_ro_buffer_enabled && string_ro_buffer_bytesleft > size+1){ + op->ob_sval = string_ro_buffer; + string_ro_buffer += size + 1; + string_ro_buffer_bytesleft -= size + 1; + }else + op->ob_sval = (char*)(&op->ob_sval + 1); + #endif Py_MEMCPY(op->ob_sval, str, size+1); /* share short strings */ if (size == 0) { @@ -533,6 +576,16 @@ string_dealloc(PyObject *op) default: Py_FatalError("Inconsistent interned string state."); } + + #if 0 + #ifndef PREMAJEK + PyStringObject *sv = (PyStringObject *) op; + if(sv->ob_sval != (char*)(&sv->ob_sval + 1)){ /* in ro memory */ + sv->ob_sval = NULL; + } + #endif + #endif + op->ob_type->tp_free(op); } @@ -938,6 +991,36 @@ string_length(PyStringObject *a) return a->ob_size; } + + +#ifndef PREMAJEK +PyDoc_STRVAR(setmajekhack__doc__, +"S.setmajekhack() -> integer\n\ +\n\ +Return number of alloceated bytes."); + +static PyObject * +string_setmajekhack(PyStringObject *a) +{ + int size = 64*1024*1024; + int r = string_ro_buffer_bytesleft; + if(string_ro_buffer_enabled == 0){ + string_ro_buffer = (char*) mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_NORESERVE|MAP_ANONYMOUS, 0, 0); + printf("MAJEKHACK enabled %p\n", string_ro_buffer); + string_ro_buffer_bytesleft = size; + string_ro_buffer_enabled = 1; + r = string_ro_buffer_bytesleft; + }else if(string_ro_buffer_enabled != 0){ + printf("MAJEKHACK disabled, allocated %i bytes\n", size-string_ro_buffer_bytesleft); + string_ro_buffer_enabled = 0; + string_ro_buffer_bytesleft = 0; + } + + return PyInt_FromSsize_t(r); +} +#endif + + static PyObject * string_concat(register PyStringObject *a, register PyObject *bb) { @@ -972,12 +1055,27 @@ string_concat(register PyStringObject *a } /* Inline PyObject_NewVar */ + #ifndef PREMAJEK + if(string_ro_buffer_enabled && string_ro_buffer_bytesleft > size+1){ + op = (PyStringObject *)PyObject_MALLOC(sizeof(PyStringObject)); + }else + op = (PyStringObject *)PyObject_MALLOC(sizeof(PyStringObject) + size + 1); + #else op = (PyStringObject *)PyObject_MALLOC(sizeof(PyStringObject) + size); + #endif if (op == NULL) return PyErr_NoMemory(); PyObject_INIT_VAR(op, &PyString_Type, size); op->ob_shash = -1; op->ob_sstate = SSTATE_NOT_INTERNED; + #ifndef PREMAJEK + if(string_ro_buffer_enabled && string_ro_buffer_bytesleft > size+1){ + op->ob_sval = string_ro_buffer; + string_ro_buffer += size + 1; + string_ro_buffer_bytesleft -= size + 1; + }else + op->ob_sval = (char*)(&op->ob_sval + 1); + #endif Py_MEMCPY(op->ob_sval, a->ob_sval, a->ob_size); Py_MEMCPY(op->ob_sval + a->ob_size, b->ob_sval, b->ob_size); op->ob_sval[size] = '\0'; @@ -1014,13 +1112,31 @@ string_repeat(register PyStringObject *a "repeated string is too long"); return NULL; } + #ifndef PREMAJEK + if(string_ro_buffer_enabled && string_ro_buffer_bytesleft > nbytes+1){ + op = (PyStringObject *) + PyObject_MALLOC(sizeof(PyStringObject)); + }else + op = (PyStringObject *) + PyObject_MALLOC(sizeof(PyStringObject) + nbytes + 1); + #else op = (PyStringObject *) PyObject_MALLOC(sizeof(PyStringObject) + nbytes); + #endif + if (op == NULL) return PyErr_NoMemory(); PyObject_INIT_VAR(op, &PyString_Type, size); op->ob_shash = -1; op->ob_sstate = SSTATE_NOT_INTERNED; + #ifndef PREMAJEK + if(string_ro_buffer_enabled && string_ro_buffer_bytesleft > nbytes+1){ + op->ob_sval = string_ro_buffer; + string_ro_buffer += nbytes + 1; + string_ro_buffer_bytesleft -= nbytes + 1; + }else + op->ob_sval = (char*)(&op->ob_sval + 1); + #endif op->ob_sval[size] = '\0'; if (a->ob_size == 1 && n > 0) { memset(op->ob_sval, a->ob_sval[0] , n); @@ -3871,6 +3987,9 @@ string_methods[] = { {"splitlines", (PyCFunction)string_splitlines, METH_VARARGS, splitlines__doc__}, {"__getnewargs__", (PyCFunction)string_getnewargs, METH_NOARGS}, +#ifndef PREMAJEK + {"setmajekhack", (PyCFunction)string_setmajekhack, METH_NOARGS, setmajekhack__doc__}, +#endif {NULL, NULL} /* sentinel */ }; @@ -4092,8 +4211,24 @@ _PyString_Resize(PyObject **pv, Py_ssize /* XXX UNREF/NEWREF interface should be more symmetrical */ _Py_DEC_REFTOTAL; _Py_ForgetReference(v); + #ifndef PREMAJEK + register PyStringObject *sv2; + sv2 = (PyStringObject *) *pv; + if(sv2->ob_sval != (char*)(&sv2->ob_sval + 1)){ /* in ro memory */ + *pv = (PyObject *) + PyObject_REALLOC((char *)v, sizeof(PyStringObject) + newsize + 1); + sv = (PyStringObject *) *pv; + int m = (newsize > sv->ob_size) ? sv->ob_size : newsize; + memcpy( (&sv->ob_sval + 1), sv->ob_sval, m + 1); + // sv->ob_sval = (char*)(&sv->ob_sval + 1); + } + else + *pv = (PyObject *) + PyObject_REALLOC((char *)v, sizeof(PyStringObject) + newsize + 1); + #else *pv = (PyObject *) PyObject_REALLOC((char *)v, sizeof(PyStringObject) + newsize); + #endif if (*pv == NULL) { PyObject_Del(v); PyErr_NoMemory(); @@ -4102,6 +4237,10 @@ _PyString_Resize(PyObject **pv, Py_ssize _Py_NewReference(*pv); sv = (PyStringObject *) *pv; sv->ob_size = newsize; + #ifndef PREMAJEK + sv->ob_sval = (char*)(&sv->ob_sval + 1); + #endif + sv->ob_sval[newsize] = '\0'; sv->ob_shash = -1; /* invalidate cached hash value */ return 0;