From 7a1785846a679e7ed4ae85e8e8286cc1a4378d3d Mon Sep 17 00:00:00 2001 From: Tyson Andre Date: Sat, 20 Nov 2021 11:55:04 -0500 Subject: [PATCH] Micro-optimizations for WeakMap Skip WeakMap lookup check for assertion in non-debug builds The expected performance impact is negligible, the memory will be loaded from main memory into cache anyway for the call to zend_hash_index_del. Use the `zend_hash_lookup` helper to optimize adding a WeakMap entry if the entry doesn't already exist. --- Zend/zend_weakrefs.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Zend/zend_weakrefs.c b/Zend/zend_weakrefs.c index 80f0290c230e2..2191303ed447c 100644 --- a/Zend/zend_weakrefs.c +++ b/Zend/zend_weakrefs.c @@ -87,9 +87,9 @@ static void zend_weakref_register(zend_object *object, void *payload) { GC_ADD_FLAGS(object, IS_OBJ_WEAKLY_REFERENCED); zend_ulong obj_addr = (zend_ulong) object; - zval *zv = zend_hash_index_find(&EG(weakrefs), obj_addr); - if (!zv) { - zend_hash_index_add_new_ptr(&EG(weakrefs), obj_addr, payload); + zval *zv = zend_hash_index_lookup(&EG(weakrefs), obj_addr); + if (Z_TYPE_P(zv) == IS_NULL) { + ZVAL_PTR(zv, payload); return; } @@ -127,9 +127,11 @@ static void zend_weakref_unregister(zend_object *object, void *payload) { } HashTable *ht = ptr; - tagged_ptr = zend_hash_index_find_ptr(ht, (zend_ulong) payload); - ZEND_ASSERT(tagged_ptr && "Weakref not registered?"); - ZEND_ASSERT(tagged_ptr == payload); +#if ZEND_DEBUG + void *old_payload = zend_hash_index_find_ptr(ht, (zend_ulong) payload); + ZEND_ASSERT(old_payload && "Weakref not registered?"); + ZEND_ASSERT(old_payload == payload); +#endif zend_hash_index_del(ht, (zend_ulong) payload); if (zend_hash_num_elements(ht) == 0) { GC_DEL_FLAGS(object, IS_OBJ_WEAKLY_REFERENCED);