@@ -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 ) \
191227static 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)); } \
193229static 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)); } \
195231static 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)); } \
197233static 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)); } \
199235static 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}
215251PHP_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 */
228264static inline
229265zend_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}
249284PHP_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 */
262297static inline
263298double 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}
284319PHP_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
303338char * 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 */
356387static 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}
361390PHP_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 */
419448static inline
420449zval * 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