@@ -197,6 +197,15 @@ static inline void msgpack_serialize_class(smart_str *buf, zval *val, zval *retv
197197}
198198/* }}} */
199199
200+ #if PHP_VERSION_ID < 70300
201+ # define Z_IS_RECURSIVE_P (zv ) ZEND_HASH_GET_APPLY_COUNT(Z_ARRVAL_P(zv))
202+ # define Z_PROTECT_RECURSION_P (zv ) ZEND_HASH_INC_APPLY_COUNT(Z_ARRVAL_P(zv))
203+ # define Z_UNPROTECT_RECURSION_P (zv ) ZEND_HASH_DEC_APPLY_COUNT(Z_ARRVAL_P(zv))
204+ # define Z_CAN_PROTECT_RECURSION_P (zv ) ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(zv))
205+ #else
206+ # define Z_CAN_PROTECT_RECURSION_P (zv ) Z_REFCOUNTED_P(zv)
207+ #endif
208+
200209static inline void msgpack_serialize_array (smart_str * buf , zval * val , HashTable * var_hash , zend_bool object , char * class_name , uint32_t name_len , zend_bool incomplete_class ) /* {{{ */ {
201210 uint32_t n ;
202211 HashTable * ht ;
@@ -290,41 +299,21 @@ static inline void msgpack_serialize_array(smart_str *buf, zval *val, HashTable
290299 value_noref = value ;
291300 }
292301
293- if (Z_TYPE_P (value_noref ) == IS_ARRAY &&
294- #if PHP_VERSION_ID < 70300
295- ZEND_HASH_GET_APPLY_COUNT ( Z_ARRVAL_P ( value_noref ))
296- #else
297- Z_IS_RECURSIVE_P ( value_noref )
298- #endif
299- ) {
300- msgpack_pack_nil ( buf );
302+ if (Z_TYPE_P (value_noref ) == IS_ARRAY && Z_IS_RECURSIVE_P ( value_noref )) {
303+ if ( MSGPACK_G ( php_only )) {
304+ /* pack ref */
305+ msgpack_serialize_zval ( buf , value , var_hash );
306+ } else {
307+ /* you lose */
308+ msgpack_pack_nil ( buf );
309+ }
301310 } else {
302- if (Z_TYPE_P (value_noref ) == IS_ARRAY &&
303- #if PHP_VERSION_ID < 70300
304- ZEND_HASH_APPLY_PROTECTION (Z_ARRVAL_P (value_noref ))
305- #else
306- Z_REFCOUNTED_P (value_noref )
307- #endif
308- ) {
309- #if PHP_VERSION_ID < 70300
310- ZEND_HASH_INC_APPLY_COUNT (Z_ARRVAL_P (value_noref ));
311- #else
311+ if (Z_TYPE_P (value_noref ) == IS_ARRAY && Z_CAN_PROTECT_RECURSION_P (value_noref )) {
312312 Z_PROTECT_RECURSION_P (value_noref );
313- #endif
314313 }
315314 msgpack_serialize_zval (buf , value , var_hash );
316- if (Z_TYPE_P (value_noref ) == IS_ARRAY &&
317- #if PHP_VERSION_ID < 70300
318- ZEND_HASH_APPLY_PROTECTION (Z_ARRVAL_P (value_noref ))
319- #else
320- Z_REFCOUNTED_P (value_noref )
321- #endif
322- ) {
323- #if PHP_VERSION_ID < 70300
324- ZEND_HASH_DEC_APPLY_COUNT (Z_ARRVAL_P (value_noref ));
325- #else
315+ if (Z_TYPE_P (value_noref ) == IS_ARRAY && Z_CAN_PROTECT_RECURSION_P (value_noref )) {
326316 Z_UNPROTECT_RECURSION_P (value_noref );
327- #endif
328317 }
329318 }
330319 } ZEND_HASH_FOREACH_END ();
@@ -333,21 +322,9 @@ static inline void msgpack_serialize_array(smart_str *buf, zval *val, HashTable
333322 zval * data , * data_noref ;
334323
335324 for (i = 0 ; i < n ; i ++ ) {
336- if ((data = zend_hash_index_find (ht , i )) == NULL || & data == & val || (Z_TYPE_P (data ) == IS_ARRAY &&
337- #if PHP_VERSION_ID < 70300
338- ZEND_HASH_GET_APPLY_COUNT (Z_ARRVAL_P (data ))
339- #else
340- Z_IS_RECURSIVE_P (data )
341- #endif
342- )) {
325+ if ((data = zend_hash_index_find (ht , i )) == NULL || & data == & val || (Z_TYPE_P (data ) == IS_ARRAY && Z_IS_RECURSIVE_P (data ))) {
343326 msgpack_pack_nil (buf );
344- } else if (Z_TYPE_P (data ) == IS_REFERENCE && Z_TYPE_P (Z_REFVAL_P (data )) == IS_ARRAY &&
345- #if PHP_VERSION_ID < 70300
346- ZEND_HASH_GET_APPLY_COUNT (Z_ARRVAL_P (Z_REFVAL_P (data )))
347- #else
348- Z_IS_RECURSIVE_P (Z_REFVAL_P (data ))
349- #endif
350- ) {
327+ } else if (Z_TYPE_P (data ) == IS_REFERENCE && Z_TYPE_P (Z_REFVAL_P (data )) == IS_ARRAY && Z_IS_RECURSIVE_P (Z_REFVAL_P (data ))) {
351328 msgpack_pack_nil (buf );
352329 } else {
353330 if (Z_TYPE_P (data ) == IS_REFERENCE ) {
@@ -356,34 +333,14 @@ static inline void msgpack_serialize_array(smart_str *buf, zval *val, HashTable
356333 data_noref = data ;
357334 }
358335
359- if (Z_TYPE_P (data_noref ) == IS_ARRAY &&
360- #if PHP_VERSION_ID < 70300
361- ZEND_HASH_APPLY_PROTECTION (Z_ARRVAL_P (data_noref ))
362- #else
363- Z_REFCOUNTED_P (data_noref )
364- #endif
365- ) {
366- #if PHP_VERSION_ID < 70300
367- ZEND_HASH_INC_APPLY_COUNT (Z_ARRVAL_P (data_noref ));
368- #else
336+ if (Z_TYPE_P (data_noref ) == IS_ARRAY && Z_CAN_PROTECT_RECURSION_P (data_noref )) {
369337 Z_PROTECT_RECURSION_P (data_noref );
370- #endif
371338 }
372339
373340 msgpack_serialize_zval (buf , data , var_hash );
374341
375- if (Z_TYPE_P (data_noref ) == IS_ARRAY &&
376- #if PHP_VERSION_ID < 70300
377- ZEND_HASH_APPLY_PROTECTION (Z_ARRVAL_P (data_noref ))
378- #else
379- Z_REFCOUNTED_P (data_noref )
380- #endif
381- ) {
382- #if PHP_VERSION_ID < 70300
383- ZEND_HASH_DEC_APPLY_COUNT (Z_ARRVAL_P (data_noref ));
384- #else
342+ if (Z_TYPE_P (data_noref ) == IS_ARRAY && Z_CAN_PROTECT_RECURSION_P (data_noref )) {
385343 Z_UNPROTECT_RECURSION_P (data_noref );
386- #endif
387344 }
388345 }
389346 }
0 commit comments