Skip to content

Commit 2e66a02

Browse files
committed
Add deref variant to php_array_api
1 parent 04fc88c commit 2e66a02

File tree

1 file changed

+82
-55
lines changed

1 file changed

+82
-55
lines changed

src/contrib/php_array_api.h

Lines changed: 82 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -187,17 +187,53 @@ zval *php_array_fetchz(zval *zarr, zval *key) {
187187
}
188188
}
189189

190+
static inline zval* zval_deref_safe(zval* z) {
191+
if (z) { ZVAL_DEREF(z); }
192+
return z;
193+
}
194+
195+
/* Fetch zval*, resolving references
196+
*
197+
* zval *php_array_fetch_deref(zval *zarr, const char *key)
198+
* zval *php_array_fetchl_deref(zval *zarr, const char *key, int key_len)
199+
* zval *php_array_fetchl_safe_deref(zval *zarr, const char *key, int key_len)
200+
* zval *php_array_fetchn_deref(zval *zarr, unsigned long idx)
201+
* zval *php_array_fetchc_deref(zval *zarr, const char *litstr)
202+
* zval *php_array_fetchz_deref(zval *zarr, zval *key)
203+
*/
204+
static inline
205+
zval *php_array_fetchl_deref(zval *zarr, const char *key, int key_len) {
206+
return zval_deref_safe(php_array_fetchl(zarr, key, key_len));
207+
}
208+
static inline
209+
zval *php_array_fetch_deref(zval *zarr, const char *key) {
210+
return zval_deref_safe(php_array_fetch(zarr, key));
211+
}
212+
#define php_array_fetchc_deref(zarr, litstr) zval_deref_safe(php_array_fetchl(zarr, litstr, sizeof(litstr)-1))
213+
static inline
214+
zval *php_array_fetchl_safe_deref(zval *zarr, const char *key, int key_len) {
215+
return zval_deref_safe(php_array_fetchl_safe(zarr, key, key_len));
216+
}
217+
static inline
218+
zval *php_array_fetchn_deref(zval *zarr, zend_ulong idx) {
219+
return zval_deref_safe(php_array_fetchn(zarr, idx));
220+
}
221+
static inline
222+
zval *php_array_fetchz_deref(zval *zarr, zval *key) {
223+
return zval_deref_safe(php_array_fetchz(zarr, key));
224+
}
225+
190226
#define PHP_ARRAY_FETCH_TYPE_MAP(ctype, ztype) \
191227
static inline ctype php_array_fetch_##ztype(zval *zarr, const char *key) \
192-
{ return php_array_zval_to_##ztype(php_array_fetch(zarr, key)); } \
228+
{ return php_array_zval_to_##ztype(php_array_fetch_deref(zarr, key)); } \
193229
static inline ctype php_array_fetchl_##ztype(zval *zarr, const char *key, int key_len) \
194-
{ return php_array_zval_to_##ztype(php_array_fetchl(zarr, key, key_len)); } \
230+
{ return php_array_zval_to_##ztype(php_array_fetchl_deref(zarr, key, key_len)); } \
195231
static inline ctype php_array_fetchl_safe_##ztype(zval *zarr, const char *key, int key_len) \
196-
{ return php_array_zval_to_##ztype(php_array_fetchl_safe(zarr, key, key_len)); } \
232+
{ return php_array_zval_to_##ztype(php_array_fetchl_safe_deref(zarr, key, key_len)); } \
197233
static inline ctype php_array_fetchn_##ztype(zval *zarr, zend_ulong idx) \
198-
{ return php_array_zval_to_##ztype(php_array_fetchn(zarr, idx)); } \
234+
{ return php_array_zval_to_##ztype(php_array_fetchn_deref(zarr, idx)); } \
199235
static inline ctype php_array_fetchz_##ztype(zval *zarr, zval *key) \
200-
{ return php_array_zval_to_##ztype(php_array_fetchz(zarr, key)); }
236+
{ return php_array_zval_to_##ztype(php_array_fetchz_deref(zarr, key)); }
201237

202238
/* Fetch zend_bool
203239
*
@@ -214,7 +250,7 @@ zend_bool php_array_zval_to_bool(zval *z) {
214250
}
215251
PHP_ARRAY_FETCH_TYPE_MAP(zend_bool, bool)
216252
#define php_array_fetchc_bool(zarr, litstr) \
217-
php_array_zval_to_bool(php_array_fetchc(zarr, litstr))
253+
php_array_zval_to_bool(php_array_fetchc_deref(zarr, litstr))
218254

219255
/* Fetch long
220256
*
@@ -227,16 +263,15 @@ PHP_ARRAY_FETCH_TYPE_MAP(zend_bool, bool)
227263
*/
228264
static inline
229265
zend_long php_array_zval_to_long(zval *z) {
230-
try_again:
231266
if (!z) { return 0; }
232267
switch(Z_TYPE_P(z)) {
233-
case IS_REFERENCE:
234-
ZVAL_DEREF(z);
235-
goto try_again;
236-
case IS_NULL: return 0;
237-
case IS_FALSE: return 0;
238-
case IS_TRUE: return 1;
239-
case IS_LONG: return Z_LVAL_P(z);
268+
case IS_NULL:
269+
case IS_FALSE:
270+
return 0;
271+
case IS_TRUE:
272+
return 1;
273+
case IS_LONG:
274+
return Z_LVAL_P(z);
240275
default:
241276
{
242277
zval c = *z;
@@ -248,7 +283,7 @@ zend_long php_array_zval_to_long(zval *z) {
248283
}
249284
PHP_ARRAY_FETCH_TYPE_MAP(zend_long, long)
250285
#define php_array_fetchc_long(zarr, litstr) \
251-
php_array_zval_to_long(php_array_fetchc(zarr, litstr))
286+
php_array_zval_to_long(php_array_fetchc_deref(zarr, litstr))
252287

253288
/* Fetch double
254289
*
@@ -261,17 +296,17 @@ PHP_ARRAY_FETCH_TYPE_MAP(zend_long, long)
261296
*/
262297
static inline
263298
double php_array_zval_to_double(zval *z) {
264-
try_again:
265299
if (!z) { return 0.0; }
266300
switch (Z_TYPE_P(z)) {
267-
case IS_REFERENCE:
268-
ZVAL_DEREF(z);
269-
goto try_again;
270-
case IS_NULL: return 0.0;
271-
case IS_FALSE: return 0.0;
272-
case IS_TRUE: return 1.0;
273-
case IS_LONG: return (double)Z_LVAL_P(z);
274-
case IS_DOUBLE: return Z_DVAL_P(z);
301+
case IS_NULL:
302+
case IS_FALSE:
303+
return 0.0;
304+
case IS_TRUE:
305+
return 1.0;
306+
case IS_LONG:
307+
return (double) Z_LVAL_P(z);
308+
case IS_DOUBLE:
309+
return Z_DVAL_P(z);
275310
default:
276311
{
277312
zval c = *z;
@@ -283,7 +318,7 @@ double php_array_zval_to_double(zval *z) {
283318
}
284319
PHP_ARRAY_FETCH_TYPE_MAP(double, double)
285320
#define php_array_fetchc_double(zarr, litstr) \
286-
php_array_zval_to_double(php_array_fetchc(zarr, litstr))
321+
php_array_zval_to_double(php_array_fetchc_deref(zarr, litstr))
287322

288323
/* Fetch string
289324
*
@@ -303,14 +338,10 @@ static inline
303338
char *php_array_zval_to_string(zval *z, int *plen, zend_bool *pfree) {
304339
*plen = 0;
305340
*pfree = 0;
306-
try_again:
307341
if (!z) { return NULL; }
308342
switch (Z_TYPE_P(z)) {
309343
case IS_NULL:
310-
return (char *)"";
311-
case IS_REFERENCE:
312-
ZVAL_DEREF(z);
313-
goto try_again;
344+
return (char *) "";
314345
case IS_STRING:
315346
*plen = Z_STRLEN_P(z);
316347
return Z_STRVAL_P(z);
@@ -326,17 +357,17 @@ char *php_array_zval_to_string(zval *z, int *plen, zend_bool *pfree) {
326357
}
327358
}
328359
#define php_array_fetch_string(zarr, key, plen, pfree) \
329-
php_array_zval_to_string(php_array_fetch(zarr, key), plen, pfree)
360+
php_array_zval_to_string(php_array_fetch_deref(zarr, key), plen, pfree)
330361
#define php_array_fetchl_string(zarr, key, key_len, plen, pfree) \
331-
php_array_zval_to_string(php_array_fetchl(zarr, key, key_len), plen, pfree)
362+
php_array_zval_to_string(php_array_fetchl_deref(zarr, key, key_len), plen, pfree)
332363
#define php_array_fetchl_safe_string(zarr, key, key_len, plen, pfree) \
333-
php_array_zval_to_string(php_array_fetchl_safe(zarr, key, key_len), plen, pfree)
364+
php_array_zval_to_string(php_array_fetchl_safe_deref(zarr, key, key_le), plen, pfree)
334365
#define php_array_fetchn_string(zarr, idx, plen, pfree) \
335-
php_array_zval_to_string(php_array_fetchn(zarr, idx), plen, pfree)
366+
php_array_zval_to_string(php_array_fetchn_deref(zarr, idx), plen, pfree)
336367
#define php_array_fetchc_string(zarr, litstr, plen, pfree) \
337-
php_array_zval_to_string(php_array_fetchc(zarr, litstr), plen, pfree)
368+
php_array_zval_to_string(php_array_fetchc_deref(zarr, litstr), plen, pfree)
338369
#define php_array_fetchz_string(zarr, key, plen, pfree) \
339-
php_array_zval_to_string(php_array_fetchz(zarr, key), plen, pfree)
370+
php_array_zval_to_string(php_array_fetchz_deref(zarr, key), plen, pfree)
340371

341372

342373
/* Fetch array
@@ -354,13 +385,11 @@ char *php_array_zval_to_string(zval *z, int *plen, zend_bool *pfree) {
354385
* zval *php_array_fetchz_array(zval *zarr, zval *key)
355386
*/
356387
static inline zval *php_array_zval_to_array(zval *zarr) {
357-
if (!zarr) { return NULL; }
358-
ZVAL_DEREF(zarr);
359-
return Z_TYPE_P(zarr) == IS_ARRAY ? zarr : NULL;
388+
return zarr && Z_TYPE_P(zarr) == IS_ARRAY ? zarr : NULL;
360389
}
361390
PHP_ARRAY_FETCH_TYPE_MAP(zval*, array)
362391
#define php_array_fetchc_array(zarr, litstr) \
363-
php_array_zval_to_array(php_array_fetchc(zarr, litstr))
392+
php_array_zval_to_array(php_array_fetchc_deref(zarr, litstr))
364393

365394
/* count($arr) - Count number of elements in the array
366395
*
@@ -391,17 +420,17 @@ void *php_array_zval_to_resource(zval *z, int le) {
391420
return zend_fetch_resource_ex(z, NULL, le);
392421
}
393422
#define php_array_fetch_resource(zarr, key, le) \
394-
php_array_zval_to_resource(php_array_fetch(zarr, key), le)
423+
php_array_zval_to_resource(php_array_fetch_deref(zarr, key), le)
395424
#define php_array_fetchl_resource(zarr, key, key_len, le) \
396-
php_array_zval_to_resource(php_array_fetchl(zarr, key, key_len), le)
425+
php_array_zval_to_resource(php_array_fetchl_deref(zarr, key, key_len), le)
397426
#define php_array_fetchl_safe_resource(zarr, key, key_len, le) \
398-
php_array_zval_to_resource(php_array_fetchl_safe(zarr, key, key_len), le)
427+
php_array_zval_to_resource(php_array_fetchl_safe_deref(zarr, key, key_len), le)
399428
#define php_array_fetchn_resource(zarr, idx, le) \
400-
php_array_zval_to_resource(php_array_fetchn(zarr, idx), le)
429+
php_array_zval_to_resource(php_array_fetchn_deref(zarr, idx), le)
401430
#define php_array_fetchc_resource(zarr, litstr, le) \
402-
php_array_zval_to_resource(php_array_fetchc(zarr, litstr), le)
431+
php_array_zval_to_resource(php_array_fetchc_deref(zarr, litstr), le)
403432
#define php_array_fetchz_resource(zarr, key, le) \
404-
php_array_zval_to_resource(php_array_fetchz(zarr, key), le)
433+
php_array_zval_to_resource(php_array_fetchz_deref(zarr, key), le)
405434

406435
/* Fetch Object
407436
*
@@ -418,23 +447,21 @@ void *php_array_zval_to_resource(zval *z, int le) {
418447
*/
419448
static inline
420449
zval *php_array_zval_to_object(zval *z, zend_class_entry *ce) {
421-
if (!z) { return NULL; }
422-
ZVAL_DEREF(z);
423-
if (Z_TYPE_P(z) != IS_OBJECT) { return NULL; }
450+
if (!z || Z_TYPE_P(z) != IS_OBJECT) { return NULL; }
424451
return (!ce) || instanceof_function(Z_OBJCE_P(z), ce) ? z : NULL;
425452
}
426453
#define php_array_fetch_object(zarr, key, ce) \
427-
php_array_zval_to_object(php_array_fetch(zarr, key), ce)
454+
php_array_zval_to_object(php_array_fetch_deref(zarr, key), ce)
428455
#define php_array_fetchl_object(zarr, key, len, ce) \
429-
php_array_zval_to_object(php_array_fetchl(zarr, key, len), ce)
456+
php_array_zval_to_object(php_array_fetchl_deref(zarr, key, len), ce)
430457
#define php_array_fetchl_safe_object(zarr, key, len, ce) \
431-
php_array_zval_to_object(php_array_fetchl_safe(zarr, key, len), ce)
458+
php_array_zval_to_object(php_array_fetchl_safe_deref(zarr, key, len), ce)
432459
#define php_array_fetchn_object(zarr, idx, ce) \
433-
php_array_zval_to_object(php_array_fetchn(zarr, idx), ce)
460+
php_array_zval_to_object(php_array_fetchn_deref(zarr, idx), ce)
434461
#define php_array_fetchc_object(zarr, litstr, ce) \
435-
php_array_zval_to_object(php_array_fetchc(zarr, litstr), ce)
462+
php_array_zval_to_object(php_array_fetchc_deref(zarr, litstr), ce)
436463
#define php_array_fetchz_object(zarr, key, ce) \
437-
php_array_zval_to_object(php_array_fetchz(zarr, key), ce)
464+
php_array_zval_to_object(php_array_fetchz_deref(zarr, key), ce)
438465

439466
/* unset($zarr[$key]) - Erase a key from an array
440467
*

0 commit comments

Comments
 (0)