diff options
Diffstat (limited to 'Zend/zend_objects_API.c')
-rw-r--r-- | Zend/zend_objects_API.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index b3e4356a2c..afa9359289 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -123,6 +123,18 @@ ZEND_API void ZEND_FASTCALL zend_objects_store_free_object_storage(zend_objects_ /* Store objects API */ +static ZEND_COLD zend_never_inline void ZEND_FASTCALL zend_objects_store_put_cold(zend_object *object) +{ + int handle; + uint32_t new_size = 2 * EG(objects_store).size; + + EG(objects_store).object_buckets = (zend_object **) erealloc(EG(objects_store).object_buckets, new_size * sizeof(zend_object*)); + /* Assign size after realloc, in case it fails */ + EG(objects_store).size = new_size; + handle = EG(objects_store).top++; + object->handle = handle; + EG(objects_store).object_buckets[handle] = object; +} ZEND_API void ZEND_FASTCALL zend_objects_store_put(zend_object *object) { @@ -134,13 +146,10 @@ ZEND_API void ZEND_FASTCALL zend_objects_store_put(zend_object *object) if (EG(objects_store).free_list_head != -1 && EXPECTED(!(EG(flags) & EG_FLAGS_IN_SHUTDOWN))) { handle = EG(objects_store).free_list_head; EG(objects_store).free_list_head = GET_OBJ_BUCKET_NUMBER(EG(objects_store).object_buckets[handle]); + } else if (UNEXPECTED(EG(objects_store).top == EG(objects_store).size)) { + zend_objects_store_put_cold(object); + return; } else { - if (UNEXPECTED(EG(objects_store).top == EG(objects_store).size)) { - uint32_t new_size = 2 * EG(objects_store).size; - EG(objects_store).object_buckets = (zend_object **) erealloc(EG(objects_store).object_buckets, new_size * sizeof(zend_object*)); - /* Assign size after realloc, in case it fails */ - EG(objects_store).size = new_size; - } handle = EG(objects_store).top++; } object->handle = handle; |