Skip to content

Commit 79e8f20

Browse files
committed
Add type inference for various missing opcodes
Closes GH-13304
1 parent caaf9d0 commit 79e8f20

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed

Zend/Optimizer/zend_inference.c

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3960,7 +3960,68 @@ static zend_always_inline zend_result _zend_update_type_info(
39603960
/* Forbidden opcodes */
39613961
ZEND_UNREACHABLE();
39623962
break;
3963+
case ZEND_FETCH_CLASS_NAME:
3964+
UPDATE_SSA_TYPE(MAY_BE_STRING|MAY_BE_RCN, ssa_op->result_def);
3965+
break;
3966+
case ZEND_ISSET_ISEMPTY_THIS:
3967+
UPDATE_SSA_TYPE(MAY_BE_BOOL, ssa_op->result_def);
3968+
break;
3969+
case ZEND_DECLARE_LAMBDA_FUNCTION:
3970+
UPDATE_SSA_TYPE(MAY_BE_OBJECT|MAY_BE_RC1, ssa_op->result_def);
3971+
UPDATE_SSA_OBJ_TYPE(zend_ce_closure, /* is_instanceof */ false, ssa_op->result_def);
3972+
break;
3973+
case ZEND_PRE_DEC_STATIC_PROP:
3974+
case ZEND_PRE_INC_STATIC_PROP:
3975+
case ZEND_POST_DEC_STATIC_PROP:
3976+
case ZEND_POST_INC_STATIC_PROP: {
3977+
if (ssa_op->result_def >= 0) {
3978+
const zend_property_info *prop_info = zend_fetch_static_prop_info(script, op_array, ssa, opline);
3979+
zend_class_entry *prop_ce;
3980+
tmp = zend_fetch_prop_type(script, prop_info, &prop_ce);
3981+
/* Internal objects may result in essentially anything. */
3982+
if (tmp & MAY_BE_OBJECT) {
3983+
goto unknown_opcode;
3984+
}
3985+
tmp &= MAY_BE_LONG|MAY_BE_DOUBLE|MAY_BE_STRING|MAY_BE_BOOL|MAY_BE_NULL;
3986+
if (tmp & MAY_BE_STRING) {
3987+
tmp |= MAY_BE_RC1 | MAY_BE_RCN;
3988+
}
3989+
UPDATE_SSA_TYPE(tmp, ssa_op->result_def);
3990+
}
3991+
break;
3992+
}
3993+
case ZEND_SPACESHIP:
3994+
UPDATE_SSA_TYPE(MAY_BE_LONG, ssa_op->result_def);
3995+
break;
3996+
case ZEND_FETCH_GLOBALS:
3997+
UPDATE_SSA_TYPE(MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF|MAY_BE_RC1|MAY_BE_RCN, ssa_op->result_def);
3998+
break;
39633999
default:
4000+
#ifdef ZEND_DEBUG_TYPE_INFERENCE
4001+
if (ssa_op->result_def >= 0) {
4002+
switch (opline->opcode) {
4003+
case ZEND_FETCH_R:
4004+
case ZEND_FETCH_W:
4005+
case ZEND_FETCH_RW:
4006+
case ZEND_FETCH_IS:
4007+
case ZEND_FETCH_UNSET:
4008+
case ZEND_YIELD_FROM:
4009+
/* Currently unimplemented due to some assumptions in JIT. See:
4010+
* https://github.com/php/php-src/pull/13304#issuecomment-1926668141 */
4011+
case ZEND_SEPARATE:
4012+
break;
4013+
default:
4014+
fprintf(stderr, "Missing result type inference for opcode %s, line %d\n", zend_get_opcode_name(opline->opcode), opline->lineno);
4015+
break;
4016+
}
4017+
}
4018+
if (ssa_op->op1_def >= 0) {
4019+
fprintf(stderr, "Missing op1 type inference for opcode %s, line %d\n", zend_get_opcode_name(opline->opcode), opline->lineno);
4020+
}
4021+
if (ssa_op->op2_def >= 0) {
4022+
fprintf(stderr, "Missing op2 type inference for opcode %s, line %d\n", zend_get_opcode_name(opline->opcode), opline->lineno);
4023+
}
4024+
#endif
39644025
unknown_opcode:
39654026
if (ssa_op->op1_def >= 0) {
39664027
tmp = MAY_BE_ANY | MAY_BE_REF | MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF;

0 commit comments

Comments
 (0)