Micro-optimizations for WeakMap

Skip WeakMap lookup check used only for debug assertion in non-debug builds

Use the `zend_hash_lookup` helper to optimize adding a WeakMap entry
if the entry doesn't already exist.

Closes GH-7670
This commit is contained in:
Tyson Andre 2021-11-20 11:55:04 -05:00
parent 636e54a1cb
commit b6419f919a

View file

@ -87,9 +87,9 @@ static void zend_weakref_register(zend_object *object, void *payload) {
GC_ADD_FLAGS(object, IS_OBJ_WEAKLY_REFERENCED); GC_ADD_FLAGS(object, IS_OBJ_WEAKLY_REFERENCED);
zend_ulong obj_addr = (zend_ulong) object; zend_ulong obj_addr = (zend_ulong) object;
zval *zv = zend_hash_index_find(&EG(weakrefs), obj_addr); zval *zv = zend_hash_index_lookup(&EG(weakrefs), obj_addr);
if (!zv) { if (Z_TYPE_P(zv) == IS_NULL) {
zend_hash_index_add_new_ptr(&EG(weakrefs), obj_addr, payload); ZVAL_PTR(zv, payload);
return; return;
} }
@ -127,9 +127,11 @@ static void zend_weakref_unregister(zend_object *object, void *payload) {
} }
HashTable *ht = ptr; HashTable *ht = ptr;
tagged_ptr = zend_hash_index_find_ptr(ht, (zend_ulong) payload); #if ZEND_DEBUG
ZEND_ASSERT(tagged_ptr && "Weakref not registered?"); void *old_payload = zend_hash_index_find_ptr(ht, (zend_ulong) payload);
ZEND_ASSERT(tagged_ptr == payload); ZEND_ASSERT(old_payload && "Weakref not registered?");
ZEND_ASSERT(old_payload == payload);
#endif
zend_hash_index_del(ht, (zend_ulong) payload); zend_hash_index_del(ht, (zend_ulong) payload);
if (zend_hash_num_elements(ht) == 0) { if (zend_hash_num_elements(ht) == 0) {
GC_DEL_FLAGS(object, IS_OBJ_WEAKLY_REFERENCED); GC_DEL_FLAGS(object, IS_OBJ_WEAKLY_REFERENCED);