Skip to content

Commit b6419f9

Browse files
committed
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
1 parent 636e54a commit b6419f9

File tree

1 file changed

+8
-6
lines changed

1 file changed

+8
-6
lines changed

Zend/zend_weakrefs.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,9 @@ static void zend_weakref_register(zend_object *object, void *payload) {
8787
GC_ADD_FLAGS(object, IS_OBJ_WEAKLY_REFERENCED);
8888

8989
zend_ulong obj_addr = (zend_ulong) object;
90-
zval *zv = zend_hash_index_find(&EG(weakrefs), obj_addr);
91-
if (!zv) {
92-
zend_hash_index_add_new_ptr(&EG(weakrefs), obj_addr, payload);
90+
zval *zv = zend_hash_index_lookup(&EG(weakrefs), obj_addr);
91+
if (Z_TYPE_P(zv) == IS_NULL) {
92+
ZVAL_PTR(zv, payload);
9393
return;
9494
}
9595

@@ -127,9 +127,11 @@ static void zend_weakref_unregister(zend_object *object, void *payload) {
127127
}
128128

129129
HashTable *ht = ptr;
130-
tagged_ptr = zend_hash_index_find_ptr(ht, (zend_ulong) payload);
131-
ZEND_ASSERT(tagged_ptr && "Weakref not registered?");
132-
ZEND_ASSERT(tagged_ptr == payload);
130+
#if ZEND_DEBUG
131+
void *old_payload = zend_hash_index_find_ptr(ht, (zend_ulong) payload);
132+
ZEND_ASSERT(old_payload && "Weakref not registered?");
133+
ZEND_ASSERT(old_payload == payload);
134+
#endif
133135
zend_hash_index_del(ht, (zend_ulong) payload);
134136
if (zend_hash_num_elements(ht) == 0) {
135137
GC_DEL_FLAGS(object, IS_OBJ_WEAKLY_REFERENCED);

0 commit comments

Comments
 (0)