Skip to content

Commit 035d703

Browse files
committed
Add type inference for various missing opcodes
1 parent 77bc863 commit 035d703

File tree

1 file changed

+60
-0
lines changed

1 file changed

+60
-0
lines changed

Zend/Optimizer/zend_inference.c

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3960,7 +3960,67 @@ 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+
const zend_property_info *prop_info = zend_fetch_static_prop_info(script, op_array, ssa, opline);
3978+
zend_class_entry *prop_ce;
3979+
tmp = zend_fetch_prop_type(script, prop_info, &prop_ce);
3980+
/* Internal objects may result in essentially anything. */
3981+
if (tmp & MAY_BE_OBJECT) {
3982+
goto unknown_opcode;
3983+
}
3984+
tmp &= MAY_BE_LONG|MAY_BE_DOUBLE|MAY_BE_STRING|MAY_BE_BOOL|MAY_BE_NULL;
3985+
if (tmp & MAY_BE_STRING) {
3986+
tmp |= MAY_BE_RC1 | MAY_BE_RCN;
3987+
}
3988+
UPDATE_SSA_TYPE(tmp, ssa_op->result_def);
3989+
break;
3990+
}
3991+
case ZEND_SPACESHIP:
3992+
UPDATE_SSA_TYPE(MAY_BE_LONG, ssa_op->result_def);
3993+
break;
3994+
case ZEND_SEPARATE:
3995+
UPDATE_SSA_TYPE(t1, ssa_op->result_def);
3996+
COPY_SSA_OBJ_TYPE(ssa_op->op1_use, ssa_op->result_def);
3997+
break;
3998+
case ZEND_FETCH_GLOBALS:
3999+
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);
4000+
break;
39634001
default:
4002+
#ifdef ZEND_DEBUG_TYPE_INFERENCE
4003+
if (ssa_op->result_def >= 0) {
4004+
switch (opline->opcode) {
4005+
case ZEND_FETCH_R:
4006+
case ZEND_FETCH_W:
4007+
case ZEND_FETCH_RW:
4008+
case ZEND_FETCH_IS:
4009+
case ZEND_FETCH_UNSET:
4010+
case ZEND_YIELD_FROM:
4011+
break;
4012+
default:
4013+
fprintf(stderr, "Missing result type inference for opcode %s, line %d\n", zend_get_opcode_name(opline->opcode), opline->lineno);
4014+
break;
4015+
}
4016+
}
4017+
if (ssa_op->op1_def >= 0) {
4018+
fprintf(stderr, "Missing op1 type inference for opcode %s, line %d\n", zend_get_opcode_name(opline->opcode), opline->lineno);
4019+
}
4020+
if (ssa_op->op2_def >= 0) {
4021+
fprintf(stderr, "Missing op2 type inference for opcode %s, line %d\n", zend_get_opcode_name(opline->opcode), opline->lineno);
4022+
}
4023+
#endif
39644024
unknown_opcode:
39654025
if (ssa_op->op1_def >= 0) {
39664026
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)