tstate->datastack_chunk = NULL;
tstate->datastack_top = NULL;
tstate->datastack_limit = NULL;
+ tstate->datastack_cached_chunk = NULL;
tstate->what_event = -1;
tstate->current_executor = NULL;
tstate->jit_exit = NULL;
_PyObject_VirtualFree(chunk, chunk->size);
chunk = prev;
}
+ if (tstate->datastack_cached_chunk != NULL) {
+ _PyObject_VirtualFree(tstate->datastack_cached_chunk,
+ tstate->datastack_cached_chunk->size);
+ tstate->datastack_cached_chunk = NULL;
+ }
}
void
while (allocate_size < (int)sizeof(PyObject*)*(size + MINIMUM_OVERHEAD)) {
allocate_size *= 2;
}
- _PyStackChunk *new = allocate_chunk(allocate_size, tstate->datastack_chunk);
- if (new == NULL) {
- return NULL;
+ _PyStackChunk *new;
+ if (tstate->datastack_cached_chunk != NULL
+ && (size_t)allocate_size <= tstate->datastack_cached_chunk->size)
+ {
+ new = tstate->datastack_cached_chunk;
+ tstate->datastack_cached_chunk = NULL;
+ new->previous = tstate->datastack_chunk;
+ new->top = 0;
+ }
+ else {
+ new = allocate_chunk(allocate_size, tstate->datastack_chunk);
+ if (new == NULL) {
+ return NULL;
+ }
}
if (tstate->datastack_chunk) {
tstate->datastack_chunk->top = tstate->datastack_top -
if (base == &tstate->datastack_chunk->data[0]) {
_PyStackChunk *chunk = tstate->datastack_chunk;
_PyStackChunk *previous = chunk->previous;
+ _PyStackChunk *cached = tstate->datastack_cached_chunk;
// push_chunk ensures that the root chunk is never popped:
assert(previous);
tstate->datastack_top = &previous->data[previous->top];
tstate->datastack_chunk = previous;
- _PyObject_VirtualFree(chunk, chunk->size);
tstate->datastack_limit = (PyObject **)(((char *)previous) + previous->size);
+ chunk->previous = NULL;
+ if (cached != NULL) {
+ _PyObject_VirtualFree(cached, cached->size);
+ }
+ tstate->datastack_cached_chunk = chunk;
}
else {
assert(tstate->datastack_top);