@@ -63,8 +63,7 @@ static inline void zend_weakref_unref_single(
63
63
wr -> referent = NULL ;
64
64
} else {
65
65
ZEND_ASSERT (tag == ZEND_WEAKREF_TAG_MAP );
66
- zend_weakmap * wm = ptr ;
67
- zend_hash_index_del (& wm -> ht , obj_addr );
66
+ zend_hash_index_del ((HashTable * ) ptr , obj_addr );
68
67
}
69
68
}
70
69
@@ -144,6 +143,22 @@ static void zend_weakref_unregister(zend_object *object, void *payload) {
144
143
ZEND_WEAKREF_GET_PTR (payload ), ZEND_WEAKREF_GET_TAG (payload ), obj_addr );
145
144
}
146
145
146
+ ZEND_API zval * zend_weakrefs_hash_add (HashTable * ht , zend_object * key , zval * pData ) {
147
+ zval * zv = zend_hash_index_add (ht , (zend_ulong ) key , pData );
148
+ if (zv ) {
149
+ zend_weakref_register (key , ZEND_WEAKREF_ENCODE (ht , ZEND_WEAKREF_TAG_MAP ));
150
+ }
151
+ return zv ;
152
+ }
153
+
154
+ ZEND_API zend_result zend_weakrefs_hash_del (HashTable * ht , zend_object * key ) {
155
+ zend_result result = zend_hash_index_del (ht , (zend_ulong ) key );
156
+ if (result == SUCCESS ) {
157
+ zend_weakref_unregister (key , ZEND_WEAKREF_ENCODE (ht , ZEND_WEAKREF_TAG_MAP ));
158
+ }
159
+ return result ;
160
+ }
161
+
147
162
void zend_weakrefs_init (void ) {
148
163
zend_hash_init (& EG (weakrefs ), 8 , NULL , NULL , 0 );
149
164
}
@@ -281,7 +296,7 @@ static void zend_weakmap_free_obj(zend_object *object)
281
296
zend_ulong obj_addr ;
282
297
ZEND_HASH_FOREACH_NUM_KEY (& wm -> ht , obj_addr ) {
283
298
zend_weakref_unregister (
284
- (zend_object * ) obj_addr , ZEND_WEAKREF_ENCODE (wm , ZEND_WEAKREF_TAG_MAP ));
299
+ (zend_object * ) obj_addr , ZEND_WEAKREF_ENCODE (& wm -> ht , ZEND_WEAKREF_TAG_MAP ));
285
300
} ZEND_HASH_FOREACH_END ();
286
301
zend_hash_destroy (& wm -> ht );
287
302
zend_object_std_dtor (& wm -> std );
@@ -340,7 +355,7 @@ static void zend_weakmap_write_dimension(zend_object *object, zval *offset, zval
340
355
return ;
341
356
}
342
357
343
- zend_weakref_register (obj_key , ZEND_WEAKREF_ENCODE (wm , ZEND_WEAKREF_TAG_MAP ));
358
+ zend_weakref_register (obj_key , ZEND_WEAKREF_ENCODE (& wm -> ht , ZEND_WEAKREF_TAG_MAP ));
344
359
zend_hash_index_add_new (& wm -> ht , (zend_ulong ) obj_key , value );
345
360
}
346
361
@@ -378,7 +393,7 @@ static void zend_weakmap_unset_dimension(zend_object *object, zval *offset)
378
393
return ;
379
394
}
380
395
381
- zend_weakref_unregister (obj_key , ZEND_WEAKREF_ENCODE (wm , ZEND_WEAKREF_TAG_MAP ));
396
+ zend_weakref_unregister (obj_key , ZEND_WEAKREF_ENCODE (& wm -> ht , ZEND_WEAKREF_TAG_MAP ));
382
397
}
383
398
384
399
static int zend_weakmap_count_elements (zend_object * object , zend_long * count )
0 commit comments