Skip to content

Commit 1071d85

Browse files
committed
Flesh out HashTable insertion APIs
Fills out the array/object-property insert helpers for zend_array, zend_object, and zend_reference. This adds the following matrix of 18 APIs add_next_index_T() add_index_T() add_assoc_T() add_assoc_T_ex() add_property_T() add_property_T_ex() Where T in array, object, reference Converted internal callsites currently doing an explicit object wrap.
1 parent 0811ccb commit 1071d85

File tree

6 files changed

+165
-37
lines changed

6 files changed

+165
-37
lines changed

NEWS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ PHP NEWS
44

55
- Core:
66
. Fixed inclusion order for phpize builds on Windows. (cmb)
7+
. Added missing hashtable insertion APIs for arr/obj/ref. (Sara)
78

89
- FTP:
910
. Convert resource<ftp> to object \FTPConnection. (Sara)

Zend/zend_API.c

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1531,6 +1531,33 @@ ZEND_API void add_assoc_stringl_ex(zval *arg, const char *key, size_t key_len, c
15311531
}
15321532
/* }}} */
15331533

1534+
ZEND_API void add_assoc_array_ex(zval *arg, const char *key, size_t key_len, zend_array *arr) /* {{{ */
1535+
{
1536+
zval tmp;
1537+
1538+
ZVAL_ARR(&tmp, arr);
1539+
zend_symtable_str_update(Z_ARRVAL_P(arg), key, key_len, &tmp);
1540+
}
1541+
/* }}} */
1542+
1543+
ZEND_API void add_assoc_object_ex(zval *arg, const char *key, size_t key_len, zend_object *obj) /* {{{ */
1544+
{
1545+
zval tmp;
1546+
1547+
ZVAL_OBJ(&tmp, obj);
1548+
zend_symtable_str_update(Z_ARRVAL_P(arg), key, key_len, &tmp);
1549+
}
1550+
/* }}} */
1551+
1552+
ZEND_API void add_assoc_reference_ex(zval *arg, const char *key, size_t key_len, zend_reference *ref) /* {{{ */
1553+
{
1554+
zval tmp;
1555+
1556+
ZVAL_REF(&tmp, ref);
1557+
zend_symtable_str_update(Z_ARRVAL_P(arg), key, key_len, &tmp);
1558+
}
1559+
/* }}} */
1560+
15341561
ZEND_API void add_assoc_zval_ex(zval *arg, const char *key, size_t key_len, zval *value) /* {{{ */
15351562
{
15361563
zend_symtable_str_update(Z_ARRVAL_P(arg), key, key_len, value);
@@ -1609,6 +1636,33 @@ ZEND_API void add_index_stringl(zval *arg, zend_ulong index, const char *str, si
16091636
}
16101637
/* }}} */
16111638

1639+
ZEND_API void add_index_array(zval *arg, zend_ulong index, zend_array *arr) /* {{{ */
1640+
{
1641+
zval tmp;
1642+
1643+
ZVAL_ARR(&tmp, arr);
1644+
zend_hash_index_update(Z_ARRVAL_P(arg), index, &tmp);
1645+
}
1646+
/* }}} */
1647+
1648+
ZEND_API void add_index_object(zval *arg, zend_ulong index, zend_object *obj) /* {{{ */
1649+
{
1650+
zval tmp;
1651+
1652+
ZVAL_OBJ(&tmp, obj);
1653+
zend_hash_index_update(Z_ARRVAL_P(arg), index, &tmp);
1654+
}
1655+
/* }}} */
1656+
1657+
ZEND_API void add_index_reference(zval *arg, zend_ulong index, zend_reference *ref) /* {{{ */
1658+
{
1659+
zval tmp;
1660+
1661+
ZVAL_REF(&tmp, ref);
1662+
zend_hash_index_update(Z_ARRVAL_P(arg), index, &tmp);
1663+
}
1664+
/* }}} */
1665+
16121666
ZEND_API zend_result add_next_index_long(zval *arg, zend_long n) /* {{{ */
16131667
{
16141668
zval tmp;
@@ -1681,6 +1735,33 @@ ZEND_API zend_result add_next_index_stringl(zval *arg, const char *str, size_t l
16811735
}
16821736
/* }}} */
16831737

1738+
ZEND_API zend_result add_next_index_array(zval *arg, zend_array *arr) /* {{{ */
1739+
{
1740+
zval tmp;
1741+
1742+
ZVAL_ARR(&tmp, arr);
1743+
return zend_hash_next_index_insert(Z_ARRVAL_P(arg), &tmp) ? SUCCESS : FAILURE;
1744+
}
1745+
/* }}} */
1746+
1747+
ZEND_API zend_result add_next_index_object(zval *arg, zend_object *obj) /* {{{ */
1748+
{
1749+
zval tmp;
1750+
1751+
ZVAL_OBJ(&tmp, obj);
1752+
return zend_hash_next_index_insert(Z_ARRVAL_P(arg), &tmp) ? SUCCESS : FAILURE;
1753+
}
1754+
/* }}} */
1755+
1756+
ZEND_API zend_result add_next_index_reference(zval *arg, zend_reference *ref) /* {{{ */
1757+
{
1758+
zval tmp;
1759+
1760+
ZVAL_REF(&tmp, ref);
1761+
return zend_hash_next_index_insert(Z_ARRVAL_P(arg), &tmp) ? SUCCESS : FAILURE;
1762+
}
1763+
/* }}} */
1764+
16841765
ZEND_API zend_result array_set_zval_key(HashTable *ht, zval *key, zval *value) /* {{{ */
16851766
{
16861767
zval *result;
@@ -1798,6 +1879,36 @@ ZEND_API void add_property_stringl_ex(zval *arg, const char *key, size_t key_len
17981879
}
17991880
/* }}} */
18001881

1882+
ZEND_API void add_property_array_ex(zval *arg, const char *key, size_t key_len, zend_array *arr) /* {{{ */
1883+
{
1884+
zval tmp;
1885+
1886+
ZVAL_ARR(&tmp, arr);
1887+
add_property_zval_ex(arg, key, key_len, &tmp);
1888+
zval_ptr_dtor(&tmp); /* write_property will add 1 to refcount */
1889+
}
1890+
/* }}} */
1891+
1892+
ZEND_API void add_property_object_ex(zval *arg, const char *key, size_t key_len, zend_object *obj) /* {{{ */
1893+
{
1894+
zval tmp;
1895+
1896+
ZVAL_OBJ(&tmp, obj);
1897+
add_property_zval_ex(arg, key, key_len, &tmp);
1898+
zval_ptr_dtor(&tmp); /* write_property will add 1 to refcount */
1899+
}
1900+
/* }}} */
1901+
1902+
ZEND_API void add_property_reference_ex(zval *arg, const char *key, size_t key_len, zend_reference *ref) /* {{{ */
1903+
{
1904+
zval tmp;
1905+
1906+
ZVAL_REF(&tmp, ref);
1907+
add_property_zval_ex(arg, key, key_len, &tmp);
1908+
zval_ptr_dtor(&tmp); /* write_property will add 1 to refcount */
1909+
}
1910+
/* }}} */
1911+
18011912
ZEND_API void add_property_zval_ex(zval *arg, const char *key, size_t key_len, zval *value) /* {{{ */
18021913
{
18031914
zend_string *str;

Zend/zend_API.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,9 @@ ZEND_API void add_assoc_double_ex(zval *arg, const char *key, size_t key_len, do
445445
ZEND_API void add_assoc_str_ex(zval *arg, const char *key, size_t key_len, zend_string *str);
446446
ZEND_API void add_assoc_string_ex(zval *arg, const char *key, size_t key_len, const char *str);
447447
ZEND_API void add_assoc_stringl_ex(zval *arg, const char *key, size_t key_len, const char *str, size_t length);
448+
ZEND_API void add_assoc_array_ex(zval *arg, const char *key, size_t key_len, zend_array *arr);
449+
ZEND_API void add_assoc_object_ex(zval *arg, const char *key, size_t key_len, zend_object *obj);
450+
ZEND_API void add_assoc_reference_ex(zval *arg, const char *key, size_t key_len, zend_reference *ref);
448451
ZEND_API void add_assoc_zval_ex(zval *arg, const char *key, size_t key_len, zval *value);
449452

450453
#define add_assoc_long(__arg, __key, __n) add_assoc_long_ex(__arg, __key, strlen(__key), __n)
@@ -455,6 +458,9 @@ ZEND_API void add_assoc_zval_ex(zval *arg, const char *key, size_t key_len, zval
455458
#define add_assoc_str(__arg, __key, __str) add_assoc_str_ex(__arg, __key, strlen(__key), __str)
456459
#define add_assoc_string(__arg, __key, __str) add_assoc_string_ex(__arg, __key, strlen(__key), __str)
457460
#define add_assoc_stringl(__arg, __key, __str, __length) add_assoc_stringl_ex(__arg, __key, strlen(__key), __str, __length)
461+
#define add_assoc_array(__arg, __key, __arr) add_assoc_array_ex(__arg, __key, strlen(__key), __arr)
462+
#define add_assoc_object(__arg, __key, __obj) add_assoc_object_ex(__arg, __key, strlen(__key), __obj)
463+
#define add_assoc_reference(__arg, __key, __ref) add_assoc_object_ex(__arg, __key, strlen(__key), __ref)
458464
#define add_assoc_zval(__arg, __key, __value) add_assoc_zval_ex(__arg, __key, strlen(__key), __value)
459465

460466
ZEND_API void add_index_long(zval *arg, zend_ulong index, zend_long n);
@@ -465,6 +471,9 @@ ZEND_API void add_index_double(zval *arg, zend_ulong index, double d);
465471
ZEND_API void add_index_str(zval *arg, zend_ulong index, zend_string *str);
466472
ZEND_API void add_index_string(zval *arg, zend_ulong index, const char *str);
467473
ZEND_API void add_index_stringl(zval *arg, zend_ulong index, const char *str, size_t length);
474+
ZEND_API void add_index_array(zval *arg, zend_ulong index, zend_array *arr);
475+
ZEND_API void add_index_object(zval *arg, zend_ulong index, zend_object *obj);
476+
ZEND_API void add_index_reference(zval *arg, zend_ulong index, zend_reference *ref);
468477

469478
static zend_always_inline zend_result add_index_zval(zval *arg, zend_ulong index, zval *value)
470479
{
@@ -479,6 +488,9 @@ ZEND_API zend_result add_next_index_double(zval *arg, double d);
479488
ZEND_API zend_result add_next_index_str(zval *arg, zend_string *str);
480489
ZEND_API zend_result add_next_index_string(zval *arg, const char *str);
481490
ZEND_API zend_result add_next_index_stringl(zval *arg, const char *str, size_t length);
491+
ZEND_API zend_result add_next_index_array(zval *arg, zend_array *arr);
492+
ZEND_API zend_result add_next_index_object(zval *arg, zend_object *obj);
493+
ZEND_API zend_result add_next_index_reference(zval *arg, zend_reference *ref);
482494

483495
static zend_always_inline zend_result add_next_index_zval(zval *arg, zval *value)
484496
{
@@ -495,6 +507,9 @@ ZEND_API void add_property_double_ex(zval *arg, const char *key, size_t key_len,
495507
ZEND_API void add_property_str_ex(zval *arg, const char *key, size_t key_len, zend_string *str);
496508
ZEND_API void add_property_string_ex(zval *arg, const char *key, size_t key_len, const char *str);
497509
ZEND_API void add_property_stringl_ex(zval *arg, const char *key, size_t key_len, const char *str, size_t length);
510+
ZEND_API void add_property_array_ex(zval *arg, const char *key, size_t key_len, zend_array *arr);
511+
ZEND_API void add_property_object_ex(zval *arg, const char *key, size_t key_len, zend_object *obj);
512+
ZEND_API void add_property_reference_ex(zval *arg, const char *key, size_t key_len, zend_reference *ref);
498513
ZEND_API void add_property_zval_ex(zval *arg, const char *key, size_t key_len, zval *value);
499514

500515
#define add_property_long(__arg, __key, __n) add_property_long_ex(__arg, __key, strlen(__key), __n)
@@ -505,6 +520,9 @@ ZEND_API void add_property_zval_ex(zval *arg, const char *key, size_t key_len, z
505520
#define add_property_str(__arg, __key, __str) add_property_str_ex(__arg, __key, strlen(__key), __str)
506521
#define add_property_string(__arg, __key, __str) add_property_string_ex(__arg, __key, strlen(__key), __str)
507522
#define add_property_stringl(__arg, __key, __str, __length) add_property_stringl_ex(__arg, __key, strlen(__key), __str, __length)
523+
#define add_property_array(__arg, __key, __arr) add_property_array_ex(__arg, __key, strlen(__key), __arr)
524+
#define add_property_object(__arg, __key, __obj) add_property_object_ex(__arg, __key, strlen(__key), __obj)
525+
#define add_property_reference(__arg, __key, __ref) add_property_reference_ex(__arg, __key, strlen(__key), __ref)
508526
#define add_property_zval(__arg, __key, __value) add_property_zval_ex(__arg, __key, strlen(__key), __value)
509527

510528

Zend/zend_weakrefs.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -402,12 +402,12 @@ static HashTable *zend_weakmap_get_properties_for(zend_object *object, zend_prop
402402
zend_ulong obj_addr;
403403
zval *val;
404404
ZEND_HASH_FOREACH_NUM_KEY_VAL(&wm->ht, obj_addr, val) {
405+
zend_object *obj = (zend_object*)obj_addr;
405406
zval pair;
406-
zval obj_zv;
407407
array_init(&pair);
408408

409-
ZVAL_OBJ_COPY(&obj_zv, (zend_object *) obj_addr);
410-
add_assoc_zval(&pair, "key", &obj_zv);
409+
GC_ADDREF(obj);
410+
add_assoc_object(&pair, "key", obj);
411411
Z_TRY_ADDREF_P(val);
412412
add_assoc_zval(&pair, "value", val);
413413

0 commit comments

Comments
 (0)