@@ -615,25 +615,30 @@ int msgpack_unserialize_map_item(msgpack_unserialize_data *unpack, zval **contai
615615 ZVAL_MAKE_REF (* container );
616616 break ;
617617 case MSGPACK_SERIALIZE_TYPE_RECURSIVE :
618- unpack -> type = MSGPACK_SERIALIZE_TYPE_RECURSIVE ;
619- break ;
620618 case MSGPACK_SERIALIZE_TYPE_CUSTOM_OBJECT :
621- unpack -> type = MSGPACK_SERIALIZE_TYPE_CUSTOM_OBJECT ;
622- break ;
623619 case MSGPACK_SERIALIZE_TYPE_OBJECT_REFERENCE :
624- unpack -> type = MSGPACK_SERIALIZE_TYPE_OBJECT_REFERENCE ;
625- break ;
626620 case MSGPACK_SERIALIZE_TYPE_OBJECT :
627- unpack -> type = MSGPACK_SERIALIZE_TYPE_OBJECT ;
621+ unpack -> type = Z_LVAL_P ( val ) ;
628622 break ;
629623 default :
630624 break ;
631625 }
632626 } else if (Z_TYPE_P (val ) == IS_STRING ) {
633- ce = msgpack_unserialize_class (container , Z_STR_P (val ), 1 );
634- if (ce == NULL ) {
635- MSGPACK_UNSERIALIZE_FINISH_MAP_ITEM (unpack , key , val );
636- return 0 ;
627+ msgpack_unserialize_class (container , Z_STR_P (val ), 1 );
628+ #if PHP_VERSION_ID >= 70400
629+ } else if (Z_TYPE_P (val ) == IS_ARRAY ) {
630+ if (Z_TYPE_P (* container ) == IS_OBJECT && (ce = Z_OBJCE_P (* container )) && ce -> __unserialize ) {
631+ zval param ;
632+ ZVAL_COPY (& param , val );
633+ zend_object * prev_exc = EG (exception );
634+
635+ zend_call_known_instance_method_with_1_params (
636+ ce -> __unserialize , Z_OBJ_P (* container ), NULL , & param );
637+ if (EG (exception ) != prev_exc ) {
638+ GC_ADD_FLAGS (Z_OBJ_P (* container ), IS_OBJ_DESTRUCTOR_CALLED );
639+ }
640+ zval_ptr_dtor (& param );
641+ #endif
637642 }
638643 }
639644 MSGPACK_UNSERIALIZE_FINISH_MAP_ITEM (unpack , key , val );
@@ -662,8 +667,8 @@ int msgpack_unserialize_map_item(msgpack_unserialize_data *unpack, zval **contai
662667 ce -> unserialize (* container , ce , (const unsigned char * )Z_STRVAL_P (val ), Z_STRLEN_P (val ) + 1 , NULL );
663668
664669 MSGPACK_UNSERIALIZE_FINISH_MAP_ITEM (unpack , key , val );
665-
666670 return 0 ;
671+
667672 case MSGPACK_SERIALIZE_TYPE_RECURSIVE :
668673 case MSGPACK_SERIALIZE_TYPE_OBJECT :
669674 case MSGPACK_SERIALIZE_TYPE_OBJECT_REFERENCE :
@@ -672,7 +677,7 @@ int msgpack_unserialize_map_item(msgpack_unserialize_data *unpack, zval **contai
672677 int type = unpack -> type ;
673678
674679 unpack -> type = MSGPACK_SERIALIZE_TYPE_NONE ;
675- if ((rval = msgpack_var_access (& unpack -> var_hash , Z_LVAL_P (val ) - 1 )) == NULL ) {
680+ if (! (rval = msgpack_var_access (& unpack -> var_hash , Z_LVAL_P (val ) - 1 ))) {
676681 if (UNEXPECTED (Z_LVAL_P (val ) == 1 /* access the retval */ )) {
677682 rval = unpack -> retval ;
678683 } else {
@@ -688,13 +693,11 @@ int msgpack_unserialize_map_item(msgpack_unserialize_data *unpack, zval **contai
688693 zval_ptr_dtor (* container );
689694 }
690695
691- ZVAL_COPY_VALUE (* container , rval );
696+ ZVAL_COPY (* container , rval );
692697 if (type == MSGPACK_SERIALIZE_TYPE_OBJECT_REFERENCE ) {
693698 ZVAL_MAKE_REF (* container );
694699 }
695700
696- Z_TRY_ADDREF_P (* container );
697-
698701 MSGPACK_UNSERIALIZE_FINISH_MAP_ITEM (unpack , key , val );
699702 return 0 ;
700703 }
0 commit comments