Skip to content

Commit d43ae9a

Browse files
committed
try to fix JIT
1 parent 7d9650e commit d43ae9a

File tree

5 files changed

+37
-3
lines changed

5 files changed

+37
-3
lines changed

Zend/Optimizer/dce.c

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@ static inline bool may_have_side_effects(
9595
case ZEND_DIV:
9696
case ZEND_MOD:
9797
case ZEND_BOOL_XOR:
98-
case ZEND_BOOL:
9998
case ZEND_BOOL_NOT:
10099
case ZEND_BW_NOT:
101100
case ZEND_SL:
@@ -106,7 +105,6 @@ static inline bool may_have_side_effects(
106105
case ZEND_IS_SMALLER_OR_EQUAL:
107106
case ZEND_CASE:
108107
case ZEND_CASE_STRICT:
109-
case ZEND_CAST:
110108
case ZEND_ROPE_INIT:
111109
case ZEND_ROPE_ADD:
112110
case ZEND_INIT_ARRAY:
@@ -126,6 +124,26 @@ static inline bool may_have_side_effects(
126124
case ZEND_ARRAY_KEY_EXISTS:
127125
/* No side effects */
128126
return 0;
127+
case ZEND_CAST: {
128+
uint32_t t1 = OP1_INFO();
129+
/* Cast from NAN emits warning */
130+
if (t1 & MAY_BE_DOUBLE) {
131+
return true;
132+
}
133+
if (t1 & MAY_BE_ARRAY) {
134+
/* Array cast to string emits warning */
135+
return opline->extended_value == IS_STRING;
136+
}
137+
return false;
138+
}
139+
case ZEND_BOOL: {
140+
uint32_t t1 = OP1_INFO();
141+
/* Cast from NAN emits warning */
142+
if (t1 & MAY_BE_DOUBLE) {
143+
return true;
144+
}
145+
return false;
146+
}
129147
case ZEND_FREE:
130148
return opline->extended_value == ZEND_FREE_VOID_CAST;
131149
case ZEND_ADD_ARRAY_ELEMENT:

Zend/Optimizer/sccp.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,10 @@ static inline zend_result ct_eval_bool_cast(zval *result, zval *op) {
335335
ZVAL_TRUE(result);
336336
return SUCCESS;
337337
}
338+
/* NAN warns when casting */
339+
if (Z_TYPE_P(op) == IS_DOUBLE && zend_isnan(Z_DVAL_P(op))) {
340+
return FAILURE;
341+
}
338342

339343
ZVAL_BOOL(result, zend_is_true(op));
340344
return SUCCESS;

Zend/Optimizer/zend_inference.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5110,9 +5110,11 @@ ZEND_API bool zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op
51105110
case ZEND_JMPNZ:
51115111
case ZEND_JMPZ_EX:
51125112
case ZEND_JMPNZ_EX:
5113-
case ZEND_BOOL:
51145113
case ZEND_JMP_SET:
51155114
return (t1 & MAY_BE_OBJECT);
5115+
case ZEND_BOOL:
5116+
/* NAN Cast to bool will warn */
5117+
return (t1 & MAY_BE_OBJECT) || (t1 & MAY_BE_DOUBLE);
51165118
case ZEND_BOOL_XOR:
51175119
return (t1 & MAY_BE_OBJECT) || (t2 & MAY_BE_OBJECT);
51185120
case ZEND_IS_EQUAL:

Zend/zend_compile.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12010,6 +12010,10 @@ static zend_op *zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t
1201012010

1201112011
bool zend_try_ct_eval_cast(zval *result, uint32_t type, zval *op1)
1201212012
{
12013+
/* NAN warns when casting */
12014+
if (UNEXPECTED(Z_TYPE_P(op1) == IS_DOUBLE && zend_isnan(Z_DVAL_P(op1)))) {
12015+
return false;
12016+
}
1201312017
switch (type) {
1201412018
case _IS_BOOL:
1201512019
ZVAL_BOOL(result, zval_is_true(op1));

Zend/zend_execute.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,9 @@ static zend_always_inline void zend_cast_zval_to_object(zval *result, zval *expr
233233
}
234234
Z_OBJ_P(result)->properties = ht;
235235
} else if (Z_TYPE_P(expr) != IS_NULL) {
236+
if (UNEXPECTED(Z_TYPE_P(expr) == IS_DOUBLE && zend_isnan(Z_DVAL_P(expr)))) {
237+
zend_nan_coerced_to_type_warning(IS_OBJECT);
238+
}
236239
Z_OBJ_P(result)->properties = ht = zend_new_array(1);
237240
expr = zend_hash_add_new(ht, ZSTR_KNOWN(ZEND_STR_SCALAR), expr);
238241
if (op1_type == IS_CONST) {
@@ -247,6 +250,9 @@ static zend_always_inline void zend_cast_zval_to_array(zval *result, zval *expr,
247250
extern zend_class_entry *zend_ce_closure;
248251
if (op1_type == IS_CONST || Z_TYPE_P(expr) != IS_OBJECT || Z_OBJCE_P(expr) == zend_ce_closure) {
249252
if (Z_TYPE_P(expr) != IS_NULL) {
253+
if (UNEXPECTED(Z_TYPE_P(expr) == IS_DOUBLE && zend_isnan(Z_DVAL_P(expr)))) {
254+
zend_nan_coerced_to_type_warning(IS_ARRAY);
255+
}
250256
ZVAL_ARR(result, zend_new_array(1));
251257
expr = zend_hash_index_add_new(Z_ARRVAL_P(result), 0, expr);
252258
if (op1_type == IS_CONST) {

0 commit comments

Comments
 (0)