Skip to content

Commit 6185f32

Browse files
committed
More fixes and cleanup
1 parent a3d92e1 commit 6185f32

File tree

8 files changed

+82
-63
lines changed

8 files changed

+82
-63
lines changed

Zend/tests/enum/unserialize.phpt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,17 @@ enum Foo {
88
case Quux;
99
}
1010

11-
var_dump(unserialize('E:7:"Foo:Bar";'));
12-
var_dump(unserialize('E:8:"Foo:Quux";'));
11+
$bar = unserialize('E:7:"Foo:Bar";');
12+
var_dump($bar);
13+
var_dump($bar === Foo::Bar);
14+
15+
$quux = unserialize('E:8:"Foo:Quux";');
16+
var_dump($quux);
17+
var_dump($quux === Foo::Quux);
1318

1419
?>
1520
--EXPECT--
1621
enum(Foo::Bar)
22+
bool(true)
1723
enum(Foo::Quux)
24+
bool(true)

ext/reflection/php_reflection.c

Lines changed: 34 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1258,7 +1258,7 @@ PHPAPI void zend_reflection_class_factory(zend_class_entry *ce, zval *object)
12581258
}
12591259
/* }}} */
12601260

1261-
PHPAPI void zend_reflection_enum_factory(zend_class_entry *ce, zval *object)
1261+
static void zend_reflection_enum_factory(zend_class_entry *ce, zval *object)
12621262
{
12631263
reflection_object *intern;
12641264

@@ -6549,15 +6549,16 @@ ZEND_METHOD(ReflectionAttribute, newInstance)
65496549
ZEND_METHOD(ReflectionEnum, __construct)
65506550
{
65516551
reflection_class_object_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
6552+
if (EG(exception)) {
6553+
RETURN_THROWS();
6554+
}
65526555

65536556
reflection_object *intern;
65546557
zend_class_entry *ce;
65556558
GET_REFLECTION_OBJECT_PTR(ce);
65566559

65576560
if (!(ce->ce_flags & ZEND_ACC_ENUM)) {
6558-
if (!EG(exception)) {
6559-
zend_throw_exception_ex(reflection_exception_ptr, -1, "Class \"%s\" is not an enum", ZSTR_VAL(ce->name));
6560-
}
6561+
zend_throw_exception_ex(reflection_exception_ptr, -1, "Class \"%s\" is not an enum", ZSTR_VAL(ce->name));
65616562
RETURN_THROWS();
65626563
}
65636564
}
@@ -6660,22 +6661,23 @@ ZEND_METHOD(ReflectionEnum, getBackingType)
66606661
ZEND_METHOD(ReflectionEnumUnitCase, __construct)
66616662
{
66626663
ZEND_MN(ReflectionClassConstant___construct)(INTERNAL_FUNCTION_PARAM_PASSTHRU);
6664+
if (EG(exception)) {
6665+
RETURN_THROWS();
6666+
}
66636667

66646668
reflection_object *intern;
66656669
zend_class_constant *ref;
66666670

66676671
GET_REFLECTION_OBJECT_PTR(ref);
66686672

66696673
if (!(Z_ACCESS_FLAGS(ref->value) & ZEND_CLASS_CONST_IS_CASE)) {
6670-
if (!EG(exception)) {
6671-
zval *case_name = reflection_prop_name(ZEND_THIS);
6672-
zend_throw_exception_ex(reflection_exception_ptr, 0, "Constant %s::%s is not a case", ZSTR_VAL(ref->ce->name), Z_STRVAL_P(case_name));
6673-
}
6674+
zval *case_name = reflection_prop_name(ZEND_THIS);
6675+
zend_throw_exception_ex(reflection_exception_ptr, 0, "Constant %s::%s is not a case", ZSTR_VAL(ref->ce->name), Z_STRVAL_P(case_name));
66746676
RETURN_THROWS();
66756677
}
66766678
}
66776679

6678-
ZEND_METHOD(ReflectionEnumBackedCase, getBackingValue)
6680+
ZEND_METHOD(ReflectionEnumUnitCase, getEnum)
66796681
{
66806682
reflection_object *intern;
66816683
zend_class_constant *ref;
@@ -6685,45 +6687,46 @@ ZEND_METHOD(ReflectionEnumBackedCase, getBackingValue)
66856687
}
66866688
GET_REFLECTION_OBJECT_PTR(ref);
66876689

6688-
if (Z_TYPE(ref->value) == IS_CONSTANT_AST) {
6689-
zval_update_constant_ex(&ref->value, ref->ce);
6690-
}
6691-
6692-
ZEND_ASSERT(intern->ce->enum_backing_type != IS_UNDEF);
6693-
zval *member_p = zend_enum_fetch_case_value(Z_OBJ(ref->value));
6694-
6695-
ZVAL_COPY_OR_DUP(return_value, member_p);
6690+
zend_reflection_enum_factory(ref->ce, return_value);
66966691
}
66976692

6698-
ZEND_METHOD(ReflectionEnumUnitCase, getEnum)
6693+
ZEND_METHOD(ReflectionEnumBackedCase, __construct)
66996694
{
6695+
ZEND_MN(ReflectionEnumUnitCase___construct)(INTERNAL_FUNCTION_PARAM_PASSTHRU);
6696+
if (EG(exception)) {
6697+
RETURN_THROWS();
6698+
}
6699+
67006700
reflection_object *intern;
67016701
zend_class_constant *ref;
67026702

6703-
if (zend_parse_parameters_none() == FAILURE) {
6704-
RETURN_THROWS();
6705-
}
67066703
GET_REFLECTION_OBJECT_PTR(ref);
67076704

6708-
zend_reflection_enum_factory(ref->ce, return_value);
6705+
if (ref->ce->enum_backing_type == IS_UNDEF) {
6706+
zval *case_name = reflection_prop_name(ZEND_THIS);
6707+
zend_throw_exception_ex(reflection_exception_ptr, 0, "Enum case %s::%s is not a backed case", ZSTR_VAL(ref->ce->name), Z_STRVAL_P(case_name));
6708+
RETURN_THROWS();
6709+
}
67096710
}
67106711

6711-
ZEND_METHOD(ReflectionEnumBackedCase, __construct)
6712+
ZEND_METHOD(ReflectionEnumBackedCase, getBackingValue)
67126713
{
6713-
ZEND_MN(ReflectionEnumUnitCase___construct)(INTERNAL_FUNCTION_PARAM_PASSTHRU);
6714-
67156714
reflection_object *intern;
67166715
zend_class_constant *ref;
67176716

6717+
if (zend_parse_parameters_none() == FAILURE) {
6718+
RETURN_THROWS();
6719+
}
67186720
GET_REFLECTION_OBJECT_PTR(ref);
67196721

6720-
if (ref->ce->enum_backing_type == IS_UNDEF) {
6721-
if (!EG(exception)) {
6722-
zval *case_name = reflection_prop_name(ZEND_THIS);
6723-
zend_throw_exception_ex(reflection_exception_ptr, 0, "Enum case %s::%s is not a backed case", ZSTR_VAL(ref->ce->name), Z_STRVAL_P(case_name));
6724-
}
6725-
RETURN_THROWS();
6722+
if (Z_TYPE(ref->value) == IS_CONSTANT_AST) {
6723+
zval_update_constant_ex(&ref->value, ref->ce);
67266724
}
6725+
6726+
ZEND_ASSERT(intern->ce->enum_backing_type != IS_UNDEF);
6727+
zval *member_p = zend_enum_fetch_case_value(Z_OBJ(ref->value));
6728+
6729+
ZVAL_COPY_OR_DUP(return_value, member_p);
67276730
}
67286731

67296732
/* {{{ _reflection_write_property */

ext/reflection/php_reflection.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ extern PHPAPI zend_class_entry *reflection_zend_extension_ptr;
4444
extern PHPAPI zend_class_entry *reflection_reference_ptr;
4545
extern PHPAPI zend_class_entry *reflection_attribute_ptr;
4646
extern PHPAPI zend_class_entry *reflection_enum_ptr;
47-
extern PHPAPI zend_class_entry *reflection_enum_case_ptr;
47+
extern PHPAPI zend_class_entry *reflection_enum_unit_case_ptr;
48+
extern PHPAPI zend_class_entry *reflection_enum_backed_case_ptr;
4849

4950
PHPAPI void zend_reflection_class_factory(zend_class_entry *ce, zval *object);
5051

ext/reflection/tests/ReflectionEnumBackedCase_getBackingValue.phpt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,23 @@ enum StringEnum: string {
1616
}
1717

1818
try {
19-
var_dump((new ReflectionEnumBackedCase(Enum_::class, 'Foo'))->getBackingValue());
19+
var_dump(new ReflectionEnumBackedCase(Enum_::class, 'Foo'));
2020
} catch (ReflectionException $e) {
2121
echo $e->getMessage() . "\n";
2222
}
2323

24+
try {
25+
var_dump(new ReflectionEnumBackedCase([], 'Foo'));
26+
} catch (Error $e) {
27+
echo $e->getMessage() . "\n";
28+
}
29+
2430
var_dump((new ReflectionEnumBackedCase(IntEnum::class, 'Foo'))->getBackingValue());
2531
var_dump((new ReflectionEnumBackedCase(StringEnum::class, 'Foo'))->getBackingValue());
2632

2733
?>
2834
--EXPECT--
2935
Enum case Enum_::Foo is not a backed case
36+
ReflectionEnumBackedCase::__construct(): Argument #1 ($class) must be of type object|string, array given
3037
int(0)
3138
string(3) "Foo"

ext/reflection/tests/ReflectionEnumUnitCase_construct.phpt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,15 @@ try {
2222
echo $e->getMessage() . "\n";
2323
}
2424

25+
try {
26+
new ReflectionEnumUnitCase([], 'Foo');
27+
} catch (Error $e) {
28+
echo $e->getMessage() . "\n";
29+
}
30+
2531
?>
2632
--EXPECT--
2733
Bar
2834
Constant Foo::Baz is not a case
2935
Constant Foo::Qux does not exist
36+
ReflectionEnumUnitCase::__construct(): Argument #1 ($class) must be of type object|string, array given

ext/reflection/tests/ReflectionEnum_construct.phpt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,20 @@ try {
1515
}
1616

1717
try {
18-
new ReflectionEnum('Baz');
18+
new ReflectionEnum('Baz');
1919
} catch (\Exception $e) {
20-
echo $e->getMessage() . "\n";
20+
echo $e->getMessage() . "\n";
2121
}
2222

23+
try {
24+
new ReflectionEnum([]);
25+
} catch (Error $e) {
26+
echo $e->getMessage() . "\n";
27+
}
2328

2429
?>
2530
--EXPECT--
2631
Foo
2732
Class "Bar" is not an enum
2833
Class "Baz" does not exist
34+
ReflectionEnum::__construct(): Argument #1 ($objectOrClass) must be of type object|string, array given

ext/standard/var.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,13 +145,11 @@ PHPAPI void php_var_dump(zval *struc, int level) /* {{{ */
145145
}
146146
PUTS("}\n");
147147
break;
148-
case IS_OBJECT:
149-
class_name = Z_OBJ_HANDLER_P(struc, get_class_name)(Z_OBJ_P(struc));
150-
148+
case IS_OBJECT: {
151149
zend_class_entry *ce = Z_OBJCE_P(struc);
152150
if (ce->ce_flags & ZEND_ACC_ENUM) {
153151
zval *case_name_zval = zend_enum_fetch_case_name(Z_OBJ_P(struc));
154-
php_printf("%senum(%s::%s)\n", COMMON, ZSTR_VAL(class_name), Z_STRVAL_P(case_name_zval));
152+
php_printf("%senum(%s::%s)\n", COMMON, ZSTR_VAL(ce->name), Z_STRVAL_P(case_name_zval));
155153
return;
156154
}
157155

@@ -162,6 +160,7 @@ PHPAPI void php_var_dump(zval *struc, int level) /* {{{ */
162160
Z_PROTECT_RECURSION_P(struc);
163161

164162
myht = zend_get_properties_for(struc, ZEND_PROP_PURPOSE_DEBUG);
163+
class_name = Z_OBJ_HANDLER_P(struc, get_class_name)(Z_OBJ_P(struc));
165164
php_printf("%sobject(%s)#%d (%d) {\n", COMMON, ZSTR_VAL(class_name), Z_OBJ_HANDLE_P(struc), myht ? zend_array_count(myht) : 0);
166165
zend_string_release_ex(class_name, 0);
167166

@@ -192,6 +191,7 @@ PHPAPI void php_var_dump(zval *struc, int level) /* {{{ */
192191
PUTS("}\n");
193192
Z_UNPROTECT_RECURSION_P(struc);
194193
break;
194+
}
195195
case IS_RESOURCE: {
196196
const char *type_name = zend_rsrc_list_get_rsrc_type(Z_RES_P(struc));
197197
php_printf("%sresource(%d) of type (%s)\n", COMMON, Z_RES_P(struc)->handle, type_name ? type_name : "Unknown");

ext/standard/var_unserializer.re

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1309,23 +1309,17 @@ object ":" uiv ":" ["] {
13091309
return object_common(UNSERIALIZE_PASSTHRU, elements, has_unserialize);
13101310
}
13111311

1312-
"E:" uiv ":" ["] {
1313-
size_t len, maxlen;
1314-
char *str;
1315-
zend_string *enum_name, *case_name;
1316-
zend_class_entry *ce;
1317-
1312+
"E:" uiv ":" ["] {
13181313
if (!var_hash) return 0;
13191314
1320-
len = parse_uiv(start + 2);
1321-
maxlen = max - YYCURSOR;
1315+
size_t len = parse_uiv(start + 2);
1316+
size_t maxlen = max - YYCURSOR;
13221317
if (maxlen < len || len == 0) {
13231318
*p = start + 2;
13241319
return 0;
13251320
}
13261321
1327-
str = (char*)YYCURSOR;
1328-
1322+
char *str = (char *) YYCURSOR;
13291323
YYCURSOR += len;
13301324
13311325
if (*(YYCURSOR) != '"') {
@@ -1344,14 +1338,14 @@ object ":" uiv ":" ["] {
13441338
}
13451339
size_t colon_pos = colon_ptr - str;
13461340
1347-
enum_name = zend_string_init(str, colon_pos, 0);
1348-
case_name = zend_string_init(&str[colon_pos + 1], len - colon_pos - 1, 0);
1341+
zend_string *enum_name = zend_string_init(str, colon_pos, 0);
1342+
zend_string *case_name = zend_string_init(&str[colon_pos + 1], len - colon_pos - 1, 0);
13491343
13501344
if (!zend_is_valid_class_name(enum_name)) {
13511345
goto fail;
13521346
}
13531347
1354-
ce = zend_lookup_class(enum_name);
1348+
zend_class_entry *ce = zend_lookup_class(enum_name);
13551349
if (!ce) {
13561350
php_error_docref(NULL, E_WARNING, "Class '%s' not found", ZSTR_VAL(enum_name));
13571351
goto fail;
@@ -1361,20 +1355,15 @@ object ":" uiv ":" ["] {
13611355
goto fail;
13621356
}
13631357
1364-
if (EG(exception)) {
1365-
goto fail;
1366-
}
1367-
13681358
YYCURSOR += 2;
13691359
*p = YYCURSOR;
13701360
1371-
zval *zv = zend_hash_find(CE_CONSTANTS_TABLE(ce), case_name);
1372-
if (!zv) {
1361+
zend_class_constant *c = zend_hash_find_ptr(CE_CONSTANTS_TABLE(ce), case_name);
1362+
if (!c) {
13731363
php_error_docref(NULL, E_WARNING, "Undefined constant %s::%s", ZSTR_VAL(enum_name), ZSTR_VAL(case_name));
13741364
goto fail;
13751365
}
13761366
1377-
zend_class_constant *c = Z_PTR_P(zv);
13781367
if (!(Z_ACCESS_FLAGS(c->value) & ZEND_CLASS_CONST_IS_CASE)) {
13791368
php_error_docref(NULL, E_WARNING, "%s::%s is not an enum case", ZSTR_VAL(enum_name), ZSTR_VAL(case_name));
13801369
goto fail;
@@ -1385,8 +1374,7 @@ object ":" uiv ":" ["] {
13851374
13861375
zval *value = &c->value;
13871376
if (Z_TYPE_P(value) == IS_CONSTANT_AST) {
1388-
zval_update_constant_ex(value, c->ce);
1389-
if (UNEXPECTED(EG(exception) != NULL)) {
1377+
if (zval_update_constant_ex(value, c->ce) == FAILURE) {
13901378
return 0;
13911379
}
13921380
}

0 commit comments

Comments
 (0)