Don't return embedded HT from WeakMap get_gc() handler

This HT is embedded in the WeakMap and as such musn't be freed by
GC (or otherwise participate in GC). Instead add the values
contained in it to the GC buffer.
This commit is contained in:
Nikita Popov 2021-07-12 12:24:59 +02:00
parent 5bde82a442
commit e081db0410

View file

@ -420,9 +420,13 @@ static HashTable *zend_weakmap_get_properties_for(zend_object *object, zend_prop
static HashTable *zend_weakmap_get_gc(zend_object *object, zval **table, int *n) static HashTable *zend_weakmap_get_gc(zend_object *object, zval **table, int *n)
{ {
zend_weakmap *wm = zend_weakmap_from(object); zend_weakmap *wm = zend_weakmap_from(object);
*table = NULL; zend_get_gc_buffer *gc_buffer = zend_get_gc_buffer_create();
*n = 0; zval *val;
return &wm->ht; ZEND_HASH_FOREACH_VAL(&wm->ht, val) {
zend_get_gc_buffer_add_zval(gc_buffer, val);
} ZEND_HASH_FOREACH_END();
zend_get_gc_buffer_use(gc_buffer, table, n);
return NULL;
} }
static zend_object *zend_weakmap_clone_obj(zend_object *old_object) static zend_object *zend_weakmap_clone_obj(zend_object *old_object)