mirror of
https://github.com/php/php-src.git
synced 2026-04-04 22:52:40 +02:00
Check EG(exception) only if it's really necessary
This commit is contained in:
@@ -692,7 +692,7 @@ static zend_bool zend_verify_scalar_type_hint(zend_uchar type_hint, zval *arg, z
|
||||
return zend_verify_weak_scalar_type_hint(type_hint, arg);
|
||||
}
|
||||
|
||||
static void zend_verify_internal_arg_type(zend_function *zf, uint32_t arg_num, zval *arg)
|
||||
static int zend_verify_internal_arg_type(zend_function *zf, uint32_t arg_num, zval *arg)
|
||||
{
|
||||
zend_internal_arg_info *cur_arg_info;
|
||||
char *need_msg, *class_name;
|
||||
@@ -703,7 +703,7 @@ static void zend_verify_internal_arg_type(zend_function *zf, uint32_t arg_num, z
|
||||
} else if (zf->internal_function.fn_flags & ZEND_ACC_VARIADIC) {
|
||||
cur_arg_info = &zf->internal_function.arg_info[zf->internal_function.num_args];
|
||||
} else {
|
||||
return;
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (cur_arg_info->type_hint) {
|
||||
@@ -713,24 +713,29 @@ static void zend_verify_internal_arg_type(zend_function *zf, uint32_t arg_num, z
|
||||
need_msg = zend_verify_internal_arg_class_kind((zend_internal_arg_info*)cur_arg_info, &class_name, &ce);
|
||||
if (!ce || !instanceof_function(Z_OBJCE_P(arg), ce)) {
|
||||
zend_verify_arg_error(zf, arg_num, need_msg, class_name, "instance of ", ZSTR_VAL(Z_OBJCE_P(arg)->name), arg);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
} else if (Z_TYPE_P(arg) != IS_NULL || !cur_arg_info->allow_null) {
|
||||
if (cur_arg_info->class_name) {
|
||||
need_msg = zend_verify_internal_arg_class_kind((zend_internal_arg_info*)cur_arg_info, &class_name, &ce);
|
||||
zend_verify_arg_error(zf, arg_num, need_msg, class_name, zend_zval_type_name(arg), "", arg);
|
||||
return 0;
|
||||
} else if (cur_arg_info->type_hint == IS_CALLABLE) {
|
||||
if (!zend_is_callable(arg, IS_CALLABLE_CHECK_SILENT, NULL)) {
|
||||
zend_verify_arg_error(zf, arg_num, "be callable", "", zend_zval_type_name(arg), "", arg);
|
||||
return 0;
|
||||
}
|
||||
} else if (cur_arg_info->type_hint == _IS_BOOL &&
|
||||
EXPECTED(Z_TYPE_P(arg) == IS_FALSE || Z_TYPE_P(arg) == IS_TRUE)) {
|
||||
/* pass */
|
||||
} else if (UNEXPECTED(!zend_verify_scalar_type_hint(cur_arg_info->type_hint, arg, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))))) {
|
||||
zend_verify_arg_error(zf, arg_num, "be of the type ", zend_get_type_by_const(cur_arg_info->type_hint), zend_zval_type_name(arg), "", arg);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static zend_always_inline int zend_verify_arg_type(zend_function *zf, uint32_t arg_num, zval *arg, zval *default_value, void **cache_slot)
|
||||
|
||||
@@ -2843,9 +2843,9 @@ ZEND_VM_C_LABEL(try_class_name):
|
||||
} else {
|
||||
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(class_name) == IS_UNDEF)) {
|
||||
GET_OP2_UNDEF_CV(class_name, BP_VAR_R);
|
||||
}
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
HANDLE_EXCEPTION();
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
}
|
||||
zend_throw_error(NULL, "Class name must be a valid object or a string");
|
||||
}
|
||||
@@ -2879,12 +2879,11 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|CV, CONST|TMPVAR
|
||||
if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
|
||||
} else if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
|
||||
GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
|
||||
}
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
HANDLE_EXCEPTION();
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
}
|
||||
zend_throw_error(NULL, "Method name must be a string");
|
||||
FREE_OP2();
|
||||
@@ -2912,9 +2911,10 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|CV, CONST|TMPVAR
|
||||
}
|
||||
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
|
||||
GET_OP1_UNDEF_CV(object, BP_VAR_R);
|
||||
}
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
HANDLE_EXCEPTION();
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
FREE_OP2();
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
}
|
||||
zend_throw_error(NULL, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
|
||||
FREE_OP2();
|
||||
@@ -2992,10 +2992,10 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMPVAR|UNUSE
|
||||
ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
|
||||
if (UNEXPECTED(ce == NULL)) {
|
||||
ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
if (UNEXPECTED(ce == NULL)) {
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
@@ -3021,9 +3021,9 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMPVAR|UNUSE
|
||||
if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
|
||||
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
|
||||
GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
|
||||
}
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
HANDLE_EXCEPTION();
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
}
|
||||
zend_throw_error(NULL, "Function name must be a string");
|
||||
FREE_OP2();
|
||||
@@ -3334,9 +3334,9 @@ ZEND_VM_C_LABEL(try_function_name):
|
||||
} else {
|
||||
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
|
||||
GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
|
||||
}
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
HANDLE_EXCEPTION();
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
}
|
||||
zend_throw_error(NULL, "Function name must be a string");
|
||||
FREE_OP2();
|
||||
@@ -3602,16 +3602,15 @@ ZEND_VM_HANDLER(131, ZEND_DO_FCALL_BY_NAME, ANY, ANY)
|
||||
zval *p = ZEND_CALL_ARG(call, 1);
|
||||
|
||||
for (i = 0; i < num_args; ++i) {
|
||||
zend_verify_internal_arg_type(fbc, i + 1, p);
|
||||
if (UNEXPECTED(!zend_verify_internal_arg_type(fbc, i + 1, p))) {
|
||||
EG(current_execute_data) = call->prev_execute_data;
|
||||
zend_vm_stack_free_args(call);
|
||||
zend_vm_stack_free_call_frame(call);
|
||||
zend_throw_exception_internal(NULL);
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
p++;
|
||||
}
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
EG(current_execute_data) = call->prev_execute_data;
|
||||
zend_vm_stack_free_args(call);
|
||||
zend_vm_stack_free_call_frame(call);
|
||||
zend_throw_exception_internal(NULL);
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
}
|
||||
|
||||
ret = EX_VAR(opline->result.var);
|
||||
@@ -3724,8 +3723,7 @@ ZEND_VM_HANDLER(60, ZEND_DO_FCALL, ANY, ANY)
|
||||
zval *p = ZEND_CALL_ARG(call, 1);
|
||||
|
||||
for (i = 0; i < num_args; ++i) {
|
||||
zend_verify_internal_arg_type(fbc, i + 1, p);
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
if (UNEXPECTED(!zend_verify_internal_arg_type(fbc, i + 1, p))) {
|
||||
EG(current_execute_data) = call->prev_execute_data;
|
||||
zend_vm_stack_free_args(call);
|
||||
if (RETURN_VALUE_USED(opline)) {
|
||||
@@ -4076,9 +4074,9 @@ ZEND_VM_HANDLER(108, ZEND_THROW, CONST|TMP|VAR|CV, ANY)
|
||||
}
|
||||
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
|
||||
GET_OP1_UNDEF_CV(value, BP_VAR_R);
|
||||
}
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
HANDLE_EXCEPTION();
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
}
|
||||
zend_throw_error(NULL, "Can only throw objects");
|
||||
FREE_OP1();
|
||||
@@ -4942,9 +4940,9 @@ ZEND_VM_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|CV, ANY)
|
||||
}
|
||||
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
|
||||
GET_OP1_UNDEF_CV(obj, BP_VAR_R);
|
||||
}
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
HANDLE_EXCEPTION();
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
}
|
||||
zend_throw_error(NULL, "__clone method called on non-object");
|
||||
FREE_OP1();
|
||||
@@ -5053,11 +5051,10 @@ ZEND_VM_HANDLER(99, ZEND_FETCH_CONSTANT, VAR|CONST|UNUSED, CONST)
|
||||
ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
|
||||
} else {
|
||||
ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
if (UNEXPECTED(ce == NULL)) {
|
||||
zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
|
||||
if (EXPECTED(!EG(exception))) {
|
||||
zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
|
||||
}
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
|
||||
@@ -5511,20 +5508,16 @@ ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMPVAR|CV, UNUSED|CONST|VAR)
|
||||
ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
|
||||
if (UNEXPECTED(ce == NULL)) {
|
||||
ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
if (UNEXPECTED(ce == NULL)) {
|
||||
if (EXPECTED(!EG(exception))) {
|
||||
zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
|
||||
}
|
||||
if (OP1_TYPE != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
|
||||
zend_string_release(Z_STR(tmp));
|
||||
}
|
||||
FREE_OP1();
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
if (UNEXPECTED(ce == NULL)) {
|
||||
zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
|
||||
if (OP1_TYPE != IS_CONST) {
|
||||
zend_string_release(Z_STR(tmp));
|
||||
}
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
|
||||
}
|
||||
} else {
|
||||
@@ -7873,8 +7866,7 @@ ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY)
|
||||
EG(current_execute_data) = call;
|
||||
|
||||
for (i = 0; i < num_args; ++i) {
|
||||
zend_verify_internal_arg_type(fbc, i + 1, p);
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
if (UNEXPECTED(!zend_verify_internal_arg_type(fbc, i + 1, p))) {
|
||||
EG(current_execute_data) = call->prev_execute_data;
|
||||
zend_vm_stack_free_args(call);
|
||||
zend_vm_stack_free_call_frame(call);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user