Skip to content

Commit 2903737

Browse files
committed
Remove leftover ZEND_CAST code for (unset) cast.
Followup for d74d392 Attempting to require a file with (unset) casts results in an E_COMPILE_ERROR that can't be caught or handled by set_exception_handler/set_error_handler. Also remove the (bool) cast, because the ZEND_BOOL opcode handles that. Remove inference that array -> object cast can throw. It was added in 2a286ad - I don't know how creating an stdClass would throw. (numeric keys, references, etc. don't cause it to throw)
1 parent 37a7046 commit 2903737

File tree

3 files changed

+25
-71
lines changed

3 files changed

+25
-71
lines changed

Zend/zend_vm_def.h

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5730,12 +5730,6 @@ ZEND_VM_COLD_CONST_HANDLER(51, ZEND_CAST, CONST|TMP|VAR|CV, ANY, TYPE)
57305730
expr = GET_OP1_ZVAL_PTR(BP_VAR_R);
57315731

57325732
switch (opline->extended_value) {
5733-
case IS_NULL:
5734-
ZVAL_NULL(result);
5735-
break;
5736-
case _IS_BOOL:
5737-
ZVAL_BOOL(result, zend_is_true(expr));
5738-
break;
57395733
case IS_LONG:
57405734
ZVAL_LONG(result, zval_get_long(expr));
57415735
break;
@@ -5746,6 +5740,7 @@ ZEND_VM_COLD_CONST_HANDLER(51, ZEND_CAST, CONST|TMP|VAR|CV, ANY, TYPE)
57465740
ZVAL_STR(result, zval_get_string(expr));
57475741
break;
57485742
default:
5743+
ZEND_ASSERT(opline->extended_value != _IS_BOOL && "Must use ZEND_BOOL instead");
57495744
if (OP1_TYPE & (IS_VAR|IS_CV)) {
57505745
ZVAL_DEREF(expr);
57515746
}
@@ -5789,6 +5784,7 @@ ZEND_VM_COLD_CONST_HANDLER(51, ZEND_CAST, CONST|TMP|VAR|CV, ANY, TYPE)
57895784
}
57905785
}
57915786
} else {
5787+
ZEND_ASSERT(opline->extended_value == IS_OBJECT);
57925788
ZVAL_OBJ(result, zend_objects_new(zend_standard_class_def));
57935789
if (Z_TYPE_P(expr) == IS_ARRAY) {
57945790
ht = zend_symtable_to_proptable(Z_ARR_P(expr));

Zend/zend_vm_execute.h

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3882,12 +3882,6 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CONST_H
38823882
expr = RT_CONSTANT(opline, opline->op1);
38833883

38843884
switch (opline->extended_value) {
3885-
case IS_NULL:
3886-
ZVAL_NULL(result);
3887-
break;
3888-
case _IS_BOOL:
3889-
ZVAL_BOOL(result, zend_is_true(expr));
3890-
break;
38913885
case IS_LONG:
38923886
ZVAL_LONG(result, zval_get_long(expr));
38933887
break;
@@ -3898,6 +3892,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CONST_H
38983892
ZVAL_STR(result, zval_get_string(expr));
38993893
break;
39003894
default:
3895+
ZEND_ASSERT(opline->extended_value != _IS_BOOL && "Must use ZEND_BOOL instead");
39013896
if (IS_CONST & (IS_VAR|IS_CV)) {
39023897
ZVAL_DEREF(expr);
39033898
}
@@ -3940,6 +3935,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CONST_H
39403935
}
39413936
}
39423937
} else {
3938+
ZEND_ASSERT(opline->extended_value == IS_OBJECT);
39433939
ZVAL_OBJ(result, zend_objects_new(zend_standard_class_def));
39443940
if (Z_TYPE_P(expr) == IS_ARRAY) {
39453941
ht = zend_symtable_to_proptable(Z_ARR_P(expr));
@@ -17489,12 +17485,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_TMP_HANDLER(ZEND_OPC
1748917485
expr = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
1749017486

1749117487
switch (opline->extended_value) {
17492-
case IS_NULL:
17493-
ZVAL_NULL(result);
17494-
break;
17495-
case _IS_BOOL:
17496-
ZVAL_BOOL(result, zend_is_true(expr));
17497-
break;
1749817488
case IS_LONG:
1749917489
ZVAL_LONG(result, zval_get_long(expr));
1750017490
break;
@@ -17505,6 +17495,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_TMP_HANDLER(ZEND_OPC
1750517495
ZVAL_STR(result, zval_get_string(expr));
1750617496
break;
1750717497
default:
17498+
ZEND_ASSERT(opline->extended_value != _IS_BOOL && "Must use ZEND_BOOL instead");
1750817499
if (IS_TMP_VAR & (IS_VAR|IS_CV)) {
1750917500
ZVAL_DEREF(expr);
1751017501
}
@@ -17547,6 +17538,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_TMP_HANDLER(ZEND_OPC
1754717538
}
1754817539
}
1754917540
} else {
17541+
ZEND_ASSERT(opline->extended_value == IS_OBJECT);
1755017542
ZVAL_OBJ(result, zend_objects_new(zend_standard_class_def));
1755117543
if (Z_TYPE_P(expr) == IS_ARRAY) {
1755217544
ht = zend_symtable_to_proptable(Z_ARR_P(expr));
@@ -20150,12 +20142,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPC
2015020142
expr = _get_zval_ptr_var(opline->op1.var EXECUTE_DATA_CC);
2015120143

2015220144
switch (opline->extended_value) {
20153-
case IS_NULL:
20154-
ZVAL_NULL(result);
20155-
break;
20156-
case _IS_BOOL:
20157-
ZVAL_BOOL(result, zend_is_true(expr));
20158-
break;
2015920145
case IS_LONG:
2016020146
ZVAL_LONG(result, zval_get_long(expr));
2016120147
break;
@@ -20166,6 +20152,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPC
2016620152
ZVAL_STR(result, zval_get_string(expr));
2016720153
break;
2016820154
default:
20155+
ZEND_ASSERT(opline->extended_value != _IS_BOOL && "Must use ZEND_BOOL instead");
2016920156
if (IS_VAR & (IS_VAR|IS_CV)) {
2017020157
ZVAL_DEREF(expr);
2017120158
}
@@ -20209,6 +20196,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPC
2020920196
}
2021020197
}
2021120198
} else {
20199+
ZEND_ASSERT(opline->extended_value == IS_OBJECT);
2021220200
ZVAL_OBJ(result, zend_objects_new(zend_standard_class_def));
2021320201
if (Z_TYPE_P(expr) == IS_ARRAY) {
2021420202
ht = zend_symtable_to_proptable(Z_ARR_P(expr));
@@ -36083,12 +36071,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CV_HANDLER(ZEND_OPCO
3608336071
expr = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
3608436072

3608536073
switch (opline->extended_value) {
36086-
case IS_NULL:
36087-
ZVAL_NULL(result);
36088-
break;
36089-
case _IS_BOOL:
36090-
ZVAL_BOOL(result, zend_is_true(expr));
36091-
break;
3609236074
case IS_LONG:
3609336075
ZVAL_LONG(result, zval_get_long(expr));
3609436076
break;
@@ -36099,6 +36081,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CV_HANDLER(ZEND_OPCO
3609936081
ZVAL_STR(result, zval_get_string(expr));
3610036082
break;
3610136083
default:
36084+
ZEND_ASSERT(opline->extended_value != _IS_BOOL && "Must use ZEND_BOOL instead");
3610236085
if (IS_CV & (IS_VAR|IS_CV)) {
3610336086
ZVAL_DEREF(expr);
3610436087
}
@@ -36141,6 +36124,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CV_HANDLER(ZEND_OPCO
3614136124
}
3614236125
}
3614336126
} else {
36127+
ZEND_ASSERT(opline->extended_value == IS_OBJECT);
3614436128
ZVAL_OBJ(result, zend_objects_new(zend_standard_class_def));
3614536129
if (Z_TYPE_P(expr) == IS_ARRAY) {
3614636130
ht = zend_symtable_to_proptable(Z_ARR_P(expr));

ext/opcache/Optimizer/zend_inference.c

Lines changed: 15 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1030,23 +1030,7 @@ int zend_inference_calc_range(const zend_op_array *op_array, zend_ssa *ssa, int
10301030
}
10311031
}
10321032
} else if (ssa->ops[line].result_def == var) {
1033-
if (opline->extended_value == IS_NULL) {
1034-
tmp->min = 0;
1035-
tmp->max = 0;
1036-
return 1;
1037-
} else if (opline->extended_value == _IS_BOOL) {
1038-
if (OP1_HAS_RANGE()) {
1039-
op1_min = OP1_MIN_RANGE();
1040-
op1_max = OP1_MAX_RANGE();
1041-
tmp->min = (op1_min > 0 || op1_max < 0);
1042-
tmp->max = (op1_min != 0 || op1_max != 0);
1043-
return 1;
1044-
} else {
1045-
tmp->min = 0;
1046-
tmp->max = 1;
1047-
return 1;
1048-
}
1049-
} else if (opline->extended_value == IS_LONG) {
1033+
if (opline->extended_value == IS_LONG) {
10501034
if (OP1_HAS_RANGE()) {
10511035
tmp->min = OP1_MIN_RANGE();
10521036
tmp->max = OP1_MAX_RANGE();
@@ -2499,24 +2483,19 @@ static int zend_update_type_info(const zend_op_array *op_array,
24992483
UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def);
25002484
COPY_SSA_OBJ_TYPE(ssa_ops[i].op1_use, ssa_ops[i].op1_def);
25012485
}
2502-
tmp = 0;
2503-
if (opline->extended_value == _IS_BOOL) {
2504-
tmp |= MAY_BE_TRUE|MAY_BE_FALSE;
2505-
} else {
2506-
tmp |= 1 << opline->extended_value;
2507-
if (tmp & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) {
2508-
if ((tmp & MAY_BE_ANY) == (t1 & MAY_BE_ANY)) {
2509-
tmp |= (t1 & MAY_BE_RC1) | MAY_BE_RCN;
2510-
} else if ((opline->extended_value == IS_ARRAY ||
2511-
opline->extended_value == IS_OBJECT) &&
2512-
(t1 & (MAY_BE_ARRAY|MAY_BE_OBJECT))) {
2513-
tmp |= MAY_BE_RC1 | MAY_BE_RCN;
2514-
} else if (opline->extended_value == IS_STRING &&
2515-
(t1 & (MAY_BE_STRING|MAY_BE_OBJECT))) {
2486+
tmp = 1 << opline->extended_value;
2487+
if (tmp & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) {
2488+
if ((tmp & MAY_BE_ANY) == (t1 & MAY_BE_ANY)) {
2489+
tmp |= (t1 & MAY_BE_RC1) | MAY_BE_RCN;
2490+
} else if ((opline->extended_value == IS_ARRAY ||
2491+
opline->extended_value == IS_OBJECT) &&
2492+
(t1 & (MAY_BE_ARRAY|MAY_BE_OBJECT))) {
25162493
tmp |= MAY_BE_RC1 | MAY_BE_RCN;
2517-
} else {
2518-
tmp |= MAY_BE_RC1;
2519-
}
2494+
} else if (opline->extended_value == IS_STRING &&
2495+
(t1 & (MAY_BE_STRING|MAY_BE_OBJECT))) {
2496+
tmp |= MAY_BE_RC1 | MAY_BE_RCN;
2497+
} else {
2498+
tmp |= MAY_BE_RC1;
25202499
}
25212500
}
25222501
if (opline->extended_value == IS_ARRAY) {
@@ -4618,10 +4597,6 @@ int zend_may_throw(const zend_op *opline, const zend_op_array *op_array, zend_ss
46184597
return (t1 & MAY_BE_OBJECT) || (t2 & (MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE));
46194598
case ZEND_CAST:
46204599
switch (opline->extended_value) {
4621-
case IS_NULL:
4622-
return 0;
4623-
case _IS_BOOL:
4624-
return (t1 & MAY_BE_OBJECT);
46254600
case IS_LONG:
46264601
case IS_DOUBLE:
46274602
return (t1 & MAY_BE_OBJECT);
@@ -4630,9 +4605,8 @@ int zend_may_throw(const zend_op *opline, const zend_op_array *op_array, zend_ss
46304605
case IS_ARRAY:
46314606
return (t1 & MAY_BE_OBJECT);
46324607
case IS_OBJECT:
4633-
return (t1 & MAY_BE_ARRAY);
4634-
default:
4635-
return 1;
4608+
return 0;
4609+
EMPTY_SWITCH_DEFAULT_CASE()
46364610
}
46374611
case ZEND_ARRAY_KEY_EXISTS:
46384612
if ((t2 & MAY_BE_ANY) != MAY_BE_ARRAY) {

0 commit comments

Comments
 (0)