@@ -255,27 +255,34 @@ inline static void msgpack_serialize_array(
255255
256256 if (object )
257257 {
258- if (MSGPACK_G ( php_only ) )
258+ if (n == 0 )
259259 {
260- if (Z_ISREF_P (val ))
260+ msgpack_pack_map (buf , n );
261+ }
262+ else
263+ {
264+ if (MSGPACK_G (php_only ))
261265 {
262- msgpack_pack_map (buf , n + 2 );
266+ if (Z_ISREF_P (val ))
267+ {
268+ msgpack_pack_map (buf , n + 2 );
269+ msgpack_pack_nil (buf );
270+ msgpack_pack_long (buf , MSGPACK_SERIALIZE_TYPE_REFERENCE );
271+ }
272+ else
273+ {
274+ msgpack_pack_map (buf , n + 1 );
275+ }
276+
263277 msgpack_pack_nil (buf );
264- msgpack_pack_long (buf , MSGPACK_SERIALIZE_TYPE_REFERENCE );
278+
279+ msgpack_serialize_string (buf , class_name , name_len );
265280 }
266281 else
267282 {
268- msgpack_pack_map (buf , n + 1 );
283+ msgpack_pack_array (buf , n );
284+ hash = 0 ;
269285 }
270-
271- msgpack_pack_nil (buf );
272-
273- msgpack_serialize_string (buf , class_name , name_len );
274- }
275- else
276- {
277- msgpack_pack_array (buf , n );
278- hash = 0 ;
279286 }
280287 }
281288 else if (n == 0 )
@@ -301,67 +308,100 @@ inline static void msgpack_serialize_array(
301308
302309 if (n > 0 )
303310 {
304- char * key ;
305- uint key_len ;
306- int key_type ;
307- ulong key_index ;
308- zval * * data ;
309- HashPosition pos ;
310-
311- zend_hash_internal_pointer_reset_ex (ht , & pos );
312- for (;; zend_hash_move_forward_ex (ht , & pos ))
311+ if (object || hash )
313312 {
314- key_type = zend_hash_get_current_key_ex (
315- ht , & key , & key_len , & key_index , 0 , & pos );
316-
317- if (key_type == HASH_KEY_NON_EXISTANT )
313+ char * key ;
314+ uint key_len ;
315+ int key_type ;
316+ ulong key_index ;
317+ zval * * data ;
318+ HashPosition pos ;
319+
320+ zend_hash_internal_pointer_reset_ex (ht , & pos );
321+ for (;; zend_hash_move_forward_ex (ht , & pos ))
318322 {
319- break ;
320- }
321- if (incomplete_class && strcmp (key , MAGIC_MEMBER ) == 0 )
322- {
323- continue ;
324- }
323+ key_type = zend_hash_get_current_key_ex (
324+ ht , & key , & key_len , & key_index , 0 , & pos );
325325
326- if (hash )
327- {
328- switch (key_type )
326+ if (key_type == HASH_KEY_NON_EXISTANT )
329327 {
330- case HASH_KEY_IS_LONG :
331- msgpack_pack_long (buf , key_index );
332- break ;
333- case HASH_KEY_IS_STRING :
334- msgpack_serialize_string (buf , key , key_len - 1 );
335- break ;
336- default :
337- msgpack_serialize_string (buf , "" , sizeof ("" ));
338- MSGPACK_WARNING (
339- "[msgpack] (%s) key is not string nor array" ,
340- __FUNCTION__ );
341- break ;
328+ break ;
329+ }
330+ if (incomplete_class && strcmp (key , MAGIC_MEMBER ) == 0 )
331+ {
332+ continue ;
342333 }
343- }
344334
345- if (zend_hash_get_current_data_ex (
346- ht , (void * )& data , & pos ) != SUCCESS ||
347- !data || data == & val ||
348- (Z_TYPE_PP (data ) == IS_ARRAY &&
349- Z_ARRVAL_PP (data )-> nApplyCount > 1 ))
350- {
351- msgpack_pack_nil (buf );
335+ if (hash )
336+ {
337+ switch (key_type )
338+ {
339+ case HASH_KEY_IS_LONG :
340+ msgpack_pack_long (buf , key_index );
341+ break ;
342+ case HASH_KEY_IS_STRING :
343+ msgpack_serialize_string (buf , key , key_len - 1 );
344+ break ;
345+ default :
346+ msgpack_serialize_string (buf , "" , sizeof ("" ));
347+ MSGPACK_WARNING (
348+ "[msgpack] (%s) key is not string nor array" ,
349+ __FUNCTION__ );
350+ break ;
351+ }
352+ }
353+
354+ if (zend_hash_get_current_data_ex (
355+ ht , (void * )& data , & pos ) != SUCCESS ||
356+ !data || data == & val ||
357+ (Z_TYPE_PP (data ) == IS_ARRAY &&
358+ Z_ARRVAL_PP (data )-> nApplyCount > 1 ))
359+ {
360+ msgpack_pack_nil (buf );
361+ }
362+ else
363+ {
364+ if (Z_TYPE_PP (data ) == IS_ARRAY )
365+ {
366+ Z_ARRVAL_PP (data )-> nApplyCount ++ ;
367+ }
368+
369+ msgpack_serialize_zval (buf , * data , var_hash TSRMLS_CC );
370+
371+ if (Z_TYPE_PP (data ) == IS_ARRAY )
372+ {
373+ Z_ARRVAL_PP (data )-> nApplyCount -- ;
374+ }
375+ }
352376 }
353- else
377+ }
378+ else
379+ {
380+ zval * * data ;
381+ uint i ;
382+
383+ for (i = 0 ; i < n ; i ++ )
354384 {
355- if (Z_TYPE_PP (data ) == IS_ARRAY )
385+ if (zend_hash_index_find (ht , i , (void * )& data ) != SUCCESS ||
386+ !data || data == & val ||
387+ (Z_TYPE_PP (data ) == IS_ARRAY &&
388+ Z_ARRVAL_PP (data )-> nApplyCount > 1 ))
356389 {
357- Z_ARRVAL_PP ( data ) -> nApplyCount ++ ;
390+ msgpack_pack_nil ( buf ) ;
358391 }
392+ else
393+ {
394+ if (Z_TYPE_PP (data ) == IS_ARRAY )
395+ {
396+ Z_ARRVAL_PP (data )-> nApplyCount ++ ;
397+ }
359398
360- msgpack_serialize_zval (buf , * data , var_hash TSRMLS_CC );
399+ msgpack_serialize_zval (buf , * data , var_hash TSRMLS_CC );
361400
362- if (Z_TYPE_PP (data ) == IS_ARRAY )
363- {
364- Z_ARRVAL_PP (data )-> nApplyCount -- ;
401+ if (Z_TYPE_PP (data ) == IS_ARRAY )
402+ {
403+ Z_ARRVAL_PP (data )-> nApplyCount -- ;
404+ }
365405 }
366406 }
367407 }
@@ -399,7 +439,7 @@ inline static void msgpack_serialize_object(
399439 msgpack_pack_nil (buf );
400440 msgpack_pack_long (buf , MSGPACK_SERIALIZE_TYPE_CUSTOM_OBJECT );
401441
402- msgpack_serialize_string (buf , ce -> name , ce -> name_length );
442+ msgpack_serialize_string (buf , ( char * ) ce -> name , ce -> name_length );
403443 msgpack_pack_raw (buf , serialized_length );
404444 msgpack_pack_raw_body (buf , serialized_data , serialized_length );
405445 }
0 commit comments