Skip to content

Commit b749d63

Browse files
committed
Add ZEND_API for weakmap functionality via zend_weakrefs_hash_add/del
1 parent df940a6 commit b749d63

File tree

2 files changed

+32
-5
lines changed

2 files changed

+32
-5
lines changed

Zend/zend_weakrefs.c

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,7 @@ static inline void zend_weakref_unref_single(
6363
wr->referent = NULL;
6464
} else {
6565
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);
6867
}
6968
}
7069

@@ -144,6 +143,22 @@ static void zend_weakref_unregister(zend_object *object, void *payload) {
144143
ZEND_WEAKREF_GET_PTR(payload), ZEND_WEAKREF_GET_TAG(payload), obj_addr);
145144
}
146145

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+
147162
void zend_weakrefs_init(void) {
148163
zend_hash_init(&EG(weakrefs), 8, NULL, NULL, 0);
149164
}
@@ -281,7 +296,7 @@ static void zend_weakmap_free_obj(zend_object *object)
281296
zend_ulong obj_addr;
282297
ZEND_HASH_FOREACH_NUM_KEY(&wm->ht, obj_addr) {
283298
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));
285300
} ZEND_HASH_FOREACH_END();
286301
zend_hash_destroy(&wm->ht);
287302
zend_object_std_dtor(&wm->std);
@@ -340,7 +355,7 @@ static void zend_weakmap_write_dimension(zend_object *object, zval *offset, zval
340355
return;
341356
}
342357

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));
344359
zend_hash_index_add_new(&wm->ht, (zend_ulong) obj_key, value);
345360
}
346361

@@ -378,7 +393,7 @@ static void zend_weakmap_unset_dimension(zend_object *object, zval *offset)
378393
return;
379394
}
380395

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));
382397
}
383398

384399
static int zend_weakmap_count_elements(zend_object *object, zend_long *count)

Zend/zend_weakrefs.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,18 @@ void zend_weakrefs_shutdown(void);
2828

2929
ZEND_API void zend_weakrefs_notify(zend_object *object);
3030

31+
ZEND_API zval *zend_weakrefs_hash_add(HashTable *ht, zend_object *key, zval *pData);
32+
ZEND_API zend_result zend_weakrefs_hash_del(HashTable *ht, zend_object *key);
33+
static zend_always_inline zval *zend_weakrefs_hash_add_ptr(HashTable *ht, zend_object *key, void *ptr) {
34+
zval tmp, *zv;
35+
ZVAL_PTR(&tmp, ptr);
36+
if ((zv = zend_weakrefs_hash_add(ht, key, &tmp))) {
37+
return Z_PTR_P(zv);
38+
} else {
39+
return NULL;
40+
}
41+
}
42+
3143
END_EXTERN_C()
3244

3345
#endif

0 commit comments

Comments
 (0)