|
2 | 2 | #include "php_ini.h" |
3 | 3 | #include "ext/standard/php_incomplete_class.h" |
4 | 4 |
|
| 5 | +#if PHP_VERSION_ID >= 80100 |
| 6 | +#include "Zend/zend_enum.h" |
| 7 | +#endif |
| 8 | + |
5 | 9 | #include "php_msgpack.h" |
6 | 10 | #include "msgpack_pack.h" |
7 | 11 | #include "msgpack_unpack.h" |
@@ -617,6 +621,7 @@ int msgpack_unserialize_map_item(msgpack_unpack_data *unpack, zval **container, |
617 | 621 | case MSGPACK_SERIALIZE_TYPE_CUSTOM_OBJECT: |
618 | 622 | case MSGPACK_SERIALIZE_TYPE_OBJECT_REFERENCE: |
619 | 623 | case MSGPACK_SERIALIZE_TYPE_OBJECT: |
| 624 | + case MSGPACK_SERIALIZE_TYPE_ENUM: |
620 | 625 | unpack->type = Z_LVAL_P(val); |
621 | 626 | break; |
622 | 627 | default: |
@@ -674,6 +679,26 @@ int msgpack_unserialize_map_item(msgpack_unpack_data *unpack, zval **container, |
674 | 679 | return 0; |
675 | 680 | } |
676 | 681 |
|
| 682 | + case MSGPACK_SERIALIZE_TYPE_ENUM: |
| 683 | + { |
| 684 | + if (Z_TYPE_P(key) != IS_STRING) { |
| 685 | + MSGPACK_UNSERIALIZE_FINISH_MAP_ITEM(unpack, key, val); |
| 686 | + return MSGPACK_UNPACK_PARSE_ERROR; |
| 687 | + } |
| 688 | + |
| 689 | +#if PHP_VERSION_ID < 80100 |
| 690 | + MSGPACK_WARNING( |
| 691 | + "[msgpack] (%s) Class %s is an Enum and not supported below PHP 8.1", |
| 692 | + __FUNCTION__, Z_STRVAL_P(key)); |
| 693 | +#else |
| 694 | + ce = msgpack_unserialize_class(container, Z_STR_P(key), 0); |
| 695 | + zend_object *enum_instance = zend_enum_get_case(ce, Z_STR_P(val)); |
| 696 | + ZVAL_OBJ(*container, enum_instance); |
| 697 | +#endif |
| 698 | + MSGPACK_UNSERIALIZE_FINISH_MAP_ITEM(unpack, key, val); |
| 699 | + return 0; |
| 700 | + } |
| 701 | + |
677 | 702 | case MSGPACK_SERIALIZE_TYPE_RECURSIVE: |
678 | 703 | case MSGPACK_SERIALIZE_TYPE_OBJECT: |
679 | 704 | case MSGPACK_SERIALIZE_TYPE_OBJECT_REFERENCE: |
|
0 commit comments