Skip to content

Commit a447897

Browse files
committed
Use information about classes returned by internal functions
1 parent fd00c7c commit a447897

File tree

4 files changed

+21
-14
lines changed

4 files changed

+21
-14
lines changed

ext/opcache/Optimizer/zend_func_info.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -886,10 +886,14 @@ static const func_info_t func_infos[] = {
886886
static HashTable func_info;
887887
int zend_func_info_rid = -1;
888888

889-
uint32_t zend_get_func_info(const zend_call_info *call_info, const zend_ssa *ssa)
889+
uint32_t zend_get_func_info(
890+
const zend_call_info *call_info, const zend_ssa *ssa,
891+
zend_class_entry **ce, zend_bool *ce_is_instanceof)
890892
{
891893
uint32_t ret = 0;
892894
const zend_function *callee_func = call_info->callee_func;
895+
*ce = NULL;
896+
*ce_is_instanceof = 0;
893897

894898
if (callee_func->type == ZEND_INTERNAL_FUNCTION) {
895899
zval *zv;
@@ -909,8 +913,8 @@ uint32_t zend_get_func_info(const zend_call_info *call_info, const zend_ssa *ssa
909913
}
910914

911915
if (callee_func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
912-
zend_class_entry *ce; // TODO: Use the CE.
913-
ret = zend_fetch_arg_info_type(NULL, callee_func->common.arg_info - 1, &ce);
916+
ret = zend_fetch_arg_info_type(NULL, callee_func->common.arg_info - 1, ce);
917+
*ce_is_instanceof = 1;
914918
} else {
915919
#if 0
916920
fprintf(stderr, "Unknown internal function '%s'\n", func->common.function_name);
@@ -926,6 +930,8 @@ uint32_t zend_get_func_info(const zend_call_info *call_info, const zend_ssa *ssa
926930
zend_func_info *info = ZEND_FUNC_INFO((zend_op_array*)callee_func);
927931
if (info) {
928932
ret = info->return_info.type;
933+
*ce = info->return_info.ce;
934+
*ce_is_instanceof = info->return_info.is_instanceof;
929935
}
930936
if (!ret) {
931937
ret = MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF

ext/opcache/Optimizer/zend_func_info.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@ BEGIN_EXTERN_C()
4949

5050
extern int zend_func_info_rid;
5151

52-
uint32_t zend_get_func_info(const zend_call_info *call_info, const zend_ssa *ssa);
52+
uint32_t zend_get_func_info(
53+
const zend_call_info *call_info, const zend_ssa *ssa,
54+
zend_class_entry **ce, zend_bool *ce_is_instanceof);
5355

5456
int zend_func_info_startup(void);
5557
int zend_func_info_shutdown(void);

ext/opcache/Optimizer/zend_inference.c

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3436,16 +3436,13 @@ static zend_always_inline int _zend_update_type_info(
34363436
if (!call_info) {
34373437
goto unknown_opcode;
34383438
}
3439-
tmp = zend_get_func_info(call_info, ssa);
3439+
3440+
zend_class_entry *ce;
3441+
zend_bool ce_is_instanceof;
3442+
tmp = zend_get_func_info(call_info, ssa, &ce, &ce_is_instanceof);
34403443
UPDATE_SSA_TYPE(tmp, ssa_op->result_def);
3441-
if (call_info->callee_func->type == ZEND_USER_FUNCTION) {
3442-
func_info = ZEND_FUNC_INFO(&call_info->callee_func->op_array);
3443-
if (func_info) {
3444-
UPDATE_SSA_OBJ_TYPE(
3445-
func_info->return_info.ce,
3446-
func_info->return_info.is_instanceof,
3447-
ssa_op->result_def);
3448-
}
3444+
if (ce) {
3445+
UPDATE_SSA_OBJ_TYPE(ce, ce_is_instanceof, ssa_op->result_def);
34493446
}
34503447
}
34513448
break;

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8463,8 +8463,10 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend
84638463
|1:
84648464

84658465
if (!RETURN_VALUE_USED(opline)) {
8466+
zend_class_entry *ce;
8467+
zend_bool ce_is_instanceof;
84668468
uint32_t func_info = call_info ?
8467-
zend_get_func_info(call_info, ssa) :
8469+
zend_get_func_info(call_info, ssa, &ce, &ce_is_instanceof) :
84688470
(MAY_BE_ANY|MAY_BE_REF|MAY_BE_RC1|MAY_BE_RCN);
84698471

84708472
if (func_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)) {

0 commit comments

Comments
 (0)