Skip to content

Commit 3c72105

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) Closes GH-5042
1 parent d1764ca commit 3c72105

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
@@ -5739,12 +5739,6 @@ ZEND_VM_COLD_CONST_HANDLER(51, ZEND_CAST, CONST|TMP|VAR|CV, ANY, TYPE)
57395739
expr = GET_OP1_ZVAL_PTR(BP_VAR_R);
57405740

57415741
switch (opline->extended_value) {
5742-
case IS_NULL:
5743-
ZVAL_NULL(result);
5744-
break;
5745-
case _IS_BOOL:
5746-
ZVAL_BOOL(result, zend_is_true(expr));
5747-
break;
57485742
case IS_LONG:
57495743
ZVAL_LONG(result, zval_get_long(expr));
57505744
break;
@@ -5755,6 +5749,7 @@ ZEND_VM_COLD_CONST_HANDLER(51, ZEND_CAST, CONST|TMP|VAR|CV, ANY, TYPE)
57555749
ZVAL_STR(result, zval_get_string(expr));
57565750
break;
57575751
default:
5752+
ZEND_ASSERT(opline->extended_value != _IS_BOOL && "Must use ZEND_BOOL instead");
57585753
if (OP1_TYPE & (IS_VAR|IS_CV)) {
57595754
ZVAL_DEREF(expr);
57605755
}
@@ -5798,6 +5793,7 @@ ZEND_VM_COLD_CONST_HANDLER(51, ZEND_CAST, CONST|TMP|VAR|CV, ANY, TYPE)
57985793
}
57995794
}
58005795
} else {
5796+
ZEND_ASSERT(opline->extended_value == IS_OBJECT);
58015797
ZVAL_OBJ(result, zend_objects_new(zend_standard_class_def));
58025798
if (Z_TYPE_P(expr) == IS_ARRAY) {
58035799
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
@@ -3892,12 +3892,6 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CONST_H
38923892
expr = RT_CONSTANT(opline, opline->op1);
38933893

38943894
switch (opline->extended_value) {
3895-
case IS_NULL:
3896-
ZVAL_NULL(result);
3897-
break;
3898-
case _IS_BOOL:
3899-
ZVAL_BOOL(result, zend_is_true(expr));
3900-
break;
39013895
case IS_LONG:
39023896
ZVAL_LONG(result, zval_get_long(expr));
39033897
break;
@@ -3908,6 +3902,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CONST_H
39083902
ZVAL_STR(result, zval_get_string(expr));
39093903
break;
39103904
default:
3905+
ZEND_ASSERT(opline->extended_value != _IS_BOOL && "Must use ZEND_BOOL instead");
39113906
if (IS_CONST & (IS_VAR|IS_CV)) {
39123907
ZVAL_DEREF(expr);
39133908
}
@@ -3950,6 +3945,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CONST_H
39503945
}
39513946
}
39523947
} else {
3948+
ZEND_ASSERT(opline->extended_value == IS_OBJECT);
39533949
ZVAL_OBJ(result, zend_objects_new(zend_standard_class_def));
39543950
if (Z_TYPE_P(expr) == IS_ARRAY) {
39553951
ht = zend_symtable_to_proptable(Z_ARR_P(expr));
@@ -17494,12 +17490,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_TMP_HANDLER(ZEND_OPC
1749417490
expr = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
1749517491

1749617492
switch (opline->extended_value) {
17497-
case IS_NULL:
17498-
ZVAL_NULL(result);
17499-
break;
17500-
case _IS_BOOL:
17501-
ZVAL_BOOL(result, zend_is_true(expr));
17502-
break;
1750317493
case IS_LONG:
1750417494
ZVAL_LONG(result, zval_get_long(expr));
1750517495
break;
@@ -17510,6 +17500,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_TMP_HANDLER(ZEND_OPC
1751017500
ZVAL_STR(result, zval_get_string(expr));
1751117501
break;
1751217502
default:
17503+
ZEND_ASSERT(opline->extended_value != _IS_BOOL && "Must use ZEND_BOOL instead");
1751317504
if (IS_TMP_VAR & (IS_VAR|IS_CV)) {
1751417505
ZVAL_DEREF(expr);
1751517506
}
@@ -17552,6 +17543,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_TMP_HANDLER(ZEND_OPC
1755217543
}
1755317544
}
1755417545
} else {
17546+
ZEND_ASSERT(opline->extended_value == IS_OBJECT);
1755517547
ZVAL_OBJ(result, zend_objects_new(zend_standard_class_def));
1755617548
if (Z_TYPE_P(expr) == IS_ARRAY) {
1755717549
ht = zend_symtable_to_proptable(Z_ARR_P(expr));
@@ -20155,12 +20147,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPC
2015520147
expr = _get_zval_ptr_var(opline->op1.var EXECUTE_DATA_CC);
2015620148

2015720149
switch (opline->extended_value) {
20158-
case IS_NULL:
20159-
ZVAL_NULL(result);
20160-
break;
20161-
case _IS_BOOL:
20162-
ZVAL_BOOL(result, zend_is_true(expr));
20163-
break;
2016420150
case IS_LONG:
2016520151
ZVAL_LONG(result, zval_get_long(expr));
2016620152
break;
@@ -20171,6 +20157,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPC
2017120157
ZVAL_STR(result, zval_get_string(expr));
2017220158
break;
2017320159
default:
20160+
ZEND_ASSERT(opline->extended_value != _IS_BOOL && "Must use ZEND_BOOL instead");
2017420161
if (IS_VAR & (IS_VAR|IS_CV)) {
2017520162
ZVAL_DEREF(expr);
2017620163
}
@@ -20214,6 +20201,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPC
2021420201
}
2021520202
}
2021620203
} else {
20204+
ZEND_ASSERT(opline->extended_value == IS_OBJECT);
2021720205
ZVAL_OBJ(result, zend_objects_new(zend_standard_class_def));
2021820206
if (Z_TYPE_P(expr) == IS_ARRAY) {
2021920207
ht = zend_symtable_to_proptable(Z_ARR_P(expr));
@@ -36070,12 +36058,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CV_HANDLER(ZEND_OPCO
3607036058
expr = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
3607136059

3607236060
switch (opline->extended_value) {
36073-
case IS_NULL:
36074-
ZVAL_NULL(result);
36075-
break;
36076-
case _IS_BOOL:
36077-
ZVAL_BOOL(result, zend_is_true(expr));
36078-
break;
3607936061
case IS_LONG:
3608036062
ZVAL_LONG(result, zval_get_long(expr));
3608136063
break;
@@ -36086,6 +36068,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CV_HANDLER(ZEND_OPCO
3608636068
ZVAL_STR(result, zval_get_string(expr));
3608736069
break;
3608836070
default:
36071+
ZEND_ASSERT(opline->extended_value != _IS_BOOL && "Must use ZEND_BOOL instead");
3608936072
if (IS_CV & (IS_VAR|IS_CV)) {
3609036073
ZVAL_DEREF(expr);
3609136074
}
@@ -36128,6 +36111,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CV_HANDLER(ZEND_OPCO
3612836111
}
3612936112
}
3613036113
} else {
36114+
ZEND_ASSERT(opline->extended_value == IS_OBJECT);
3613136115
ZVAL_OBJ(result, zend_objects_new(zend_standard_class_def));
3613236116
if (Z_TYPE_P(expr) == IS_ARRAY) {
3613336117
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)