@@ -187,17 +187,53 @@ zval *php_array_fetchz(zval *zarr, zval *key) {
187
187
}
188
188
}
189
189
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
+
190
226
#define PHP_ARRAY_FETCH_TYPE_MAP (ctype , ztype ) \
191
227
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)); } \
193
229
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)); } \
195
231
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)); } \
197
233
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)); } \
199
235
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)); }
201
237
202
238
/* Fetch zend_bool
203
239
*
@@ -214,7 +250,7 @@ zend_bool php_array_zval_to_bool(zval *z) {
214
250
}
215
251
PHP_ARRAY_FETCH_TYPE_MAP (zend_bool , bool )
216
252
#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))
218
254
219
255
/* Fetch long
220
256
*
@@ -227,16 +263,15 @@ PHP_ARRAY_FETCH_TYPE_MAP(zend_bool, bool)
227
263
*/
228
264
static inline
229
265
zend_long php_array_zval_to_long (zval * z ) {
230
- try_again:
231
266
if (!z ) { return 0 ; }
232
267
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 );
240
275
default :
241
276
{
242
277
zval c = * z ;
@@ -248,7 +283,7 @@ zend_long php_array_zval_to_long(zval *z) {
248
283
}
249
284
PHP_ARRAY_FETCH_TYPE_MAP (zend_long , long )
250
285
#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))
252
287
253
288
/* Fetch double
254
289
*
@@ -261,17 +296,17 @@ PHP_ARRAY_FETCH_TYPE_MAP(zend_long, long)
261
296
*/
262
297
static inline
263
298
double php_array_zval_to_double (zval * z ) {
264
- try_again:
265
299
if (!z ) { return 0.0 ; }
266
300
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 );
275
310
default :
276
311
{
277
312
zval c = * z ;
@@ -283,7 +318,7 @@ double php_array_zval_to_double(zval *z) {
283
318
}
284
319
PHP_ARRAY_FETCH_TYPE_MAP (double , double )
285
320
#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))
287
322
288
323
/* Fetch string
289
324
*
@@ -303,14 +338,10 @@ static inline
303
338
char * php_array_zval_to_string (zval * z , int * plen , zend_bool * pfree ) {
304
339
* plen = 0 ;
305
340
* pfree = 0 ;
306
- try_again:
307
341
if (!z ) { return NULL ; }
308
342
switch (Z_TYPE_P (z )) {
309
343
case IS_NULL :
310
- return (char *)" " ;
311
- case IS_REFERENCE:
312
- ZVAL_DEREF (z);
313
- goto try_again;
344
+ return (char * ) "" ;
314
345
case IS_STRING :
315
346
* plen = Z_STRLEN_P (z );
316
347
return Z_STRVAL_P (z );
@@ -326,17 +357,17 @@ char *php_array_zval_to_string(zval *z, int *plen, zend_bool *pfree) {
326
357
}
327
358
}
328
359
#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)
330
361
#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)
332
363
#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)
334
365
#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)
336
367
#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)
338
369
#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)
340
371
341
372
342
373
/* Fetch array
@@ -354,13 +385,11 @@ char *php_array_zval_to_string(zval *z, int *plen, zend_bool *pfree) {
354
385
* zval *php_array_fetchz_array(zval *zarr, zval *key)
355
386
*/
356
387
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 ;
360
389
}
361
390
PHP_ARRAY_FETCH_TYPE_MAP (zval * , array )
362
391
#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))
364
393
365
394
/* count($arr) - Count number of elements in the array
366
395
*
@@ -391,17 +420,17 @@ void *php_array_zval_to_resource(zval *z, int le) {
391
420
return zend_fetch_resource_ex (z , NULL , le );
392
421
}
393
422
#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)
395
424
#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)
397
426
#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)
399
428
#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)
401
430
#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)
403
432
#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)
405
434
406
435
/* Fetch Object
407
436
*
@@ -418,23 +447,21 @@ void *php_array_zval_to_resource(zval *z, int le) {
418
447
*/
419
448
static inline
420
449
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 ; }
424
451
return (!ce ) || instanceof_function (Z_OBJCE_P (z ), ce ) ? z : NULL ;
425
452
}
426
453
#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)
428
455
#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)
430
457
#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)
432
459
#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)
434
461
#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)
436
463
#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)
438
465
439
466
/* unset($zarr[$key]) - Erase a key from an array
440
467
*
0 commit comments