static HashTable func_info;
int zend_func_info_rid = -1;
-uint32_t zend_get_func_info(const zend_call_info *call_info, const zend_ssa *ssa)
+uint32_t zend_get_func_info(
+ const zend_call_info *call_info, const zend_ssa *ssa,
+ zend_class_entry **ce, zend_bool *ce_is_instanceof)
{
uint32_t ret = 0;
const zend_function *callee_func = call_info->callee_func;
+ *ce = NULL;
+ *ce_is_instanceof = 0;
if (callee_func->type == ZEND_INTERNAL_FUNCTION) {
zval *zv;
}
if (callee_func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
- zend_class_entry *ce; // TODO: Use the CE.
- ret = zend_fetch_arg_info_type(NULL, callee_func->common.arg_info - 1, &ce);
+ ret = zend_fetch_arg_info_type(NULL, callee_func->common.arg_info - 1, ce);
+ *ce_is_instanceof = 1;
} else {
#if 0
fprintf(stderr, "Unknown internal function '%s'\n", func->common.function_name);
zend_func_info *info = ZEND_FUNC_INFO((zend_op_array*)callee_func);
if (info) {
ret = info->return_info.type;
+ *ce = info->return_info.ce;
+ *ce_is_instanceof = info->return_info.is_instanceof;
}
if (!ret) {
ret = MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF
extern int zend_func_info_rid;
-uint32_t zend_get_func_info(const zend_call_info *call_info, const zend_ssa *ssa);
+uint32_t zend_get_func_info(
+ const zend_call_info *call_info, const zend_ssa *ssa,
+ zend_class_entry **ce, zend_bool *ce_is_instanceof);
int zend_func_info_startup(void);
int zend_func_info_shutdown(void);
if (!call_info) {
goto unknown_opcode;
}
- tmp = zend_get_func_info(call_info, ssa);
+
+ zend_class_entry *ce;
+ zend_bool ce_is_instanceof;
+ tmp = zend_get_func_info(call_info, ssa, &ce, &ce_is_instanceof);
UPDATE_SSA_TYPE(tmp, ssa_op->result_def);
- if (call_info->callee_func->type == ZEND_USER_FUNCTION) {
- func_info = ZEND_FUNC_INFO(&call_info->callee_func->op_array);
- if (func_info) {
- UPDATE_SSA_OBJ_TYPE(
- func_info->return_info.ce,
- func_info->return_info.is_instanceof,
- ssa_op->result_def);
- }
+ if (ce) {
+ UPDATE_SSA_OBJ_TYPE(ce, ce_is_instanceof, ssa_op->result_def);
}
}
break;
|1:
if (!RETURN_VALUE_USED(opline)) {
+ zend_class_entry *ce;
+ zend_bool ce_is_instanceof;
uint32_t func_info = call_info ?
- zend_get_func_info(call_info, ssa) :
+ zend_get_func_info(call_info, ssa, &ce, &ce_is_instanceof) :
(MAY_BE_ANY|MAY_BE_REF|MAY_BE_RC1|MAY_BE_RCN);
if (func_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)) {