@@ -722,6 +722,40 @@ int msgpack_unserialize_map_item(msgpack_unpack_data *unpack, zval **container,
722722 return 0 ;
723723 }
724724
725+ /* found Enum does not contain specified case */
726+ zend_class_constant * constant_ptr = zend_hash_find_ptr (
727+ & ce -> constants_table ,
728+ Z_STR_P (val ));
729+ if (constant_ptr == NULL ) {
730+ MSGPACK_WARNING (
731+ "[msgpack] (%s) Enum case %s does not exist in Enum %s" ,
732+ __FUNCTION__ , Z_STRVAL_P (val ), ZSTR_VAL (ce -> name ));
733+
734+ MSGPACK_UNSERIALIZE_FINISH_MAP_ITEM (unpack , key , val );
735+ return 0 ;
736+ }
737+
738+ /* found Enum property is not a case but a constant */
739+ zval * constant = & constant_ptr -> value ;
740+ if (Z_TYPE_P (constant ) == IS_OBJECT ) {
741+ zend_object * obj = Z_OBJ_P (constant );
742+ if (!instanceof_function (obj -> ce , ce )) {
743+ MSGPACK_WARNING (
744+ "[msgpack] (%s) %s::%s is not an Enum case but a constant" ,
745+ __FUNCTION__ , ZSTR_VAL (ce -> name ), Z_STRVAL_P (val ));
746+
747+ MSGPACK_UNSERIALIZE_FINISH_MAP_ITEM (unpack , key , val );
748+ return 0 ;
749+ }
750+ } else {
751+ MSGPACK_WARNING (
752+ "[msgpack] (%s) %s::%s is not an Enum case but a constant" ,
753+ __FUNCTION__ , ZSTR_VAL (ce -> name ), Z_STRVAL_P (val ));
754+
755+ MSGPACK_UNSERIALIZE_FINISH_MAP_ITEM (unpack , key , val );
756+ return 0 ;
757+ }
758+
725759 zend_object * enum_instance = zend_enum_get_case (ce , Z_STR_P (val ));
726760 ZVAL_OBJ_COPY (* container , enum_instance );
727761#endif
0 commit comments