Skip to content

Commit 514743d

Browse files
committed
Add type inference for various missing opcodes
1 parent 77bc863 commit 514743d

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed

Zend/Optimizer/zend_inference.c

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3960,7 +3960,69 @@ 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_SEPARATE:
3997+
UPDATE_SSA_TYPE(t1, ssa_op->result_def);
3998+
COPY_SSA_OBJ_TYPE(ssa_op->op1_use, ssa_op->result_def);
3999+
break;
4000+
case ZEND_FETCH_GLOBALS:
4001+
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);
4002+
break;
39634003
default:
4004+
#ifdef ZEND_DEBUG_TYPE_INFERENCE
4005+
if (ssa_op->result_def >= 0) {
4006+
switch (opline->opcode) {
4007+
case ZEND_FETCH_R:
4008+
case ZEND_FETCH_W:
4009+
case ZEND_FETCH_RW:
4010+
case ZEND_FETCH_IS:
4011+
case ZEND_FETCH_UNSET:
4012+
case ZEND_YIELD_FROM:
4013+
break;
4014+
default:
4015+
fprintf(stderr, "Missing result type inference for opcode %s, line %d\n", zend_get_opcode_name(opline->opcode), opline->lineno);
4016+
break;
4017+
}
4018+
}
4019+
if (ssa_op->op1_def >= 0) {
4020+
fprintf(stderr, "Missing op1 type inference for opcode %s, line %d\n", zend_get_opcode_name(opline->opcode), opline->lineno);
4021+
}
4022+
if (ssa_op->op2_def >= 0) {
4023+
fprintf(stderr, "Missing op2 type inference for opcode %s, line %d\n", zend_get_opcode_name(opline->opcode), opline->lineno);
4024+
}
4025+
#endif
39644026
unknown_opcode:
39654027
if (ssa_op->op1_def >= 0) {
39664028
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)