]> granicus.if.org Git - php/commitdiff
Split error code into "cold" functions and cleanup.
authorDmitry Stogov <dmitry@zend.com>
Thu, 13 Sep 2018 07:31:49 +0000 (10:31 +0300)
committerDmitry Stogov <dmitry@zend.com>
Thu, 13 Sep 2018 07:31:49 +0000 (10:31 +0300)
Zend/zend_object_handlers.c

index 5f729115c86545d4d5284129f48a32796dc55038..b664762469c604f04762594da390ae25257a3d86 100644 (file)
@@ -361,6 +361,19 @@ static zend_never_inline zend_property_info *zend_get_parent_private_property(ze
        }
        return NULL;
 }
+/* }}} */
+
+static ZEND_COLD zend_never_inline void zend_bad_property_access(zend_property_info *property_info, zend_class_entry *ce, zend_string *member) /* {{{ */
+{
+       zend_throw_error(NULL, "Cannot access %s property %s::$%s", zend_visibility_string(property_info->flags), ZSTR_VAL(ce->name), ZSTR_VAL(member));
+}
+/* }}} */
+
+static ZEND_COLD zend_never_inline void zend_bad_property_name(void) /* {{{ */
+{
+       zend_throw_error(NULL, "Cannot access property started with '\\0'");
+}
+/* }}} */
 
 static zend_always_inline uintptr_t zend_get_property_offset(zend_class_entry *ce, zend_string *member, int silent, void **cache_slot) /* {{{ */
 {
@@ -375,9 +388,9 @@ static zend_always_inline uintptr_t zend_get_property_offset(zend_class_entry *c
 
        if (UNEXPECTED(zend_hash_num_elements(&ce->properties_info) == 0)
         || UNEXPECTED((zv = zend_hash_find(&ce->properties_info, member)) == NULL)) {
-               if (UNEXPECTED(ZSTR_VAL(member)[0] == '\0' && ZSTR_LEN(member) != 0)) {
+               if (UNEXPECTED(ZSTR_VAL(member)[0] == '\0') && ZSTR_LEN(member) != 0) {
                        if (!silent) {
-                               zend_throw_error(NULL, "Cannot access property started with '\\0'");
+                               zend_bad_property_name();
                        }
                        return ZEND_WRONG_PROPERTY_OFFSET;
                }
@@ -417,7 +430,7 @@ dynamic:
 wrong:
                                        /* Information was available, but we were denied access.  Error out. */
                                        if (!silent) {
-                                               zend_throw_error(NULL, "Cannot access %s property %s::$%s", zend_visibility_string(flags), ZSTR_VAL(ce->name), ZSTR_VAL(member));
+                                               zend_bad_property_access(property_info, ce, member);
                                        }
                                        return ZEND_WRONG_PROPERTY_OFFSET;
                                }
@@ -453,9 +466,9 @@ ZEND_API zend_property_info *zend_get_property_info(zend_class_entry *ce, zend_s
 
        if (UNEXPECTED(zend_hash_num_elements(&ce->properties_info) == 0)
         || EXPECTED((zv = zend_hash_find(&ce->properties_info, member)) == NULL)) {
-               if (UNEXPECTED(ZSTR_VAL(member)[0] == '\0' && ZSTR_LEN(member) != 0)) {
+               if (UNEXPECTED(ZSTR_VAL(member)[0] == '\0') && ZSTR_LEN(member) != 0) {
                        if (!silent) {
-                               zend_throw_error(NULL, "Cannot access property started with '\\0'");
+                               zend_bad_property_name();
                        }
                        return ZEND_WRONG_PROPERTY_INFO;
                }
@@ -491,7 +504,7 @@ dynamic:
 wrong:
                                        /* Information was available, but we were denied access.  Error out. */
                                        if (!silent) {
-                                               zend_throw_error(NULL, "Cannot access %s property %s::$%s", zend_visibility_string(flags), ZSTR_VAL(ce->name), ZSTR_VAL(member));
+                                               zend_bad_property_access(property_info, ce, member);
                                        }
                                        return ZEND_WRONG_PROPERTY_INFO;
                                }
@@ -728,8 +741,8 @@ call_getter:
                        }
                        OBJ_RELEASE(zobj);
                        goto exit;
-               } else if (ZSTR_VAL(name)[0] == '\0' && ZSTR_LEN(name) != 0) {
-                       zend_throw_error(NULL, "Cannot access property started with '\\0'");
+               } else if (UNEXPECTED(ZSTR_VAL(name)[0] == '\0') && ZSTR_LEN(name) != 0) {
+                       zend_bad_property_name();
                        retval = &EG(uninitialized_zval);
                        goto exit;
                }
@@ -795,8 +808,8 @@ found:
                } else if (EXPECTED(!IS_WRONG_PROPERTY_OFFSET(property_offset))) {
                        goto write_std_property;
                } else {
-                       if (ZSTR_VAL(name)[0] == '\0' && ZSTR_LEN(name) != 0) {
-                               zend_throw_error(NULL, "Cannot access property started with '\\0'");
+                       if (UNEXPECTED(ZSTR_VAL(name)[0] == '\0') && ZSTR_LEN(name) != 0) {
+                               zend_bad_property_name();
                                goto exit;
                        }
                }
@@ -828,6 +841,12 @@ exit:
 }
 /* }}} */
 
+static ZEND_COLD zend_never_inline void zend_bad_array_access(zend_class_entry *ce) /* {{{ */
+{
+       zend_throw_error(NULL, "Cannot use object of type %s as array", ZSTR_VAL(ce->name));
+}
+/* }}} */
+
 ZEND_API zval *zend_std_read_dimension(zval *object, zval *offset, int type, zval *rv) /* {{{ */
 {
        zend_class_entry *ce = Z_OBJCE_P(object);
@@ -871,7 +890,7 @@ ZEND_API zval *zend_std_read_dimension(zval *object, zval *offset, int type, zva
                }
                return rv;
        } else {
-               zend_throw_error(NULL, "Cannot use object of type %s as array", ZSTR_VAL(ce->name));
+           zend_bad_array_access(ce);
                return NULL;
        }
 }
@@ -893,7 +912,7 @@ ZEND_API void zend_std_write_dimension(zval *object, zval *offset, zval *value)
                zval_ptr_dtor(&tmp_object);
                zval_ptr_dtor(&tmp_offset);
        } else {
-               zend_throw_error(NULL, "Cannot use object of type %s as array", ZSTR_VAL(ce->name));
+           zend_bad_array_access(ce);
        }
 }
 /* }}} */
@@ -918,7 +937,7 @@ ZEND_API int zend_std_has_dimension(zval *object, zval *offset, int check_empty)
                zval_ptr_dtor(&tmp_object);
                zval_ptr_dtor(&tmp_offset);
        } else {
-               zend_throw_error(NULL, "Cannot use object of type %s as array", ZSTR_VAL(ce->name));
+           zend_bad_array_access(ce);
                return 0;
        }
        return result;
@@ -1035,8 +1054,8 @@ ZEND_API void zend_std_unset_property(zval *object, zval *member, void **cache_s
                        zend_std_call_unsetter(zobj, name);
                        (*guard) &= ~IN_UNSET;
                } else {
-                       if (ZSTR_VAL(name)[0] == '\0' && ZSTR_LEN(name) != 0) {
-                               zend_throw_error(NULL, "Cannot access property started with '\\0'");
+                       if (UNEXPECTED(ZSTR_VAL(name)[0] == '\0') && ZSTR_LEN(name) != 0) {
+                               zend_bad_property_name();
                                goto exit;
                        }
                }
@@ -1059,7 +1078,7 @@ ZEND_API void zend_std_unset_dimension(zval *object, zval *offset) /* {{{ */
                zval_ptr_dtor(&tmp_object);
                zval_ptr_dtor(&tmp_offset);
        } else {
-               zend_throw_error(NULL, "Cannot use object of type %s as array", ZSTR_VAL(ce->name));
+           zend_bad_array_access(ce);
        }
 }
 /* }}} */
@@ -1191,6 +1210,12 @@ static zend_always_inline zend_function *zend_get_user_call_function(zend_class_
 }
 /* }}} */
 
+static ZEND_COLD zend_never_inline void zend_bad_method_call(zend_function *fbc, zend_string *method_name, zend_class_entry *scope) /* {{{ */
+{
+       zend_throw_error(NULL, "Call to %s method %s::%s() from context '%s'", zend_visibility_string(fbc->common.fn_flags), ZEND_FN_SCOPE_NAME(fbc), ZSTR_VAL(method_name), scope ? ZSTR_VAL(scope->name) : "");
+}
+/* }}} */
+
 ZEND_API zend_function *zend_std_get_method(zend_object **obj_ptr, zend_string *method_name, const zval *key) /* {{{ */
 {
        zend_object *zobj = *obj_ptr;
@@ -1243,7 +1268,7 @@ ZEND_API zend_function *zend_std_get_method(zend_object **obj_ptr, zend_string *
                                if (zobj->ce->__call) {
                                        fbc = zend_get_user_call_function(zobj->ce, method_name);
                                } else {
-                                       zend_throw_error(NULL, "Call to %s method %s::%s() from context '%s'", zend_visibility_string(fbc->common.fn_flags), ZEND_FN_SCOPE_NAME(fbc), ZSTR_VAL(method_name), scope ? ZSTR_VAL(scope->name) : "");
+                                       zend_bad_method_call(fbc, method_name, scope);
                                        fbc = NULL;
                                }
                        }
@@ -1329,7 +1354,7 @@ ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_st
                                if (ce->__callstatic) {
                                        fbc = zend_get_user_callstatic_function(ce, function_name);
                                } else {
-                                       zend_throw_error(NULL, "Call to %s method %s::%s() from context '%s'", zend_visibility_string(fbc->common.fn_flags), ZEND_FN_SCOPE_NAME(fbc), ZSTR_VAL(function_name), scope ? ZSTR_VAL(scope->name) : "");
+                                       zend_bad_method_call(fbc, function_name, scope);
                                        fbc = NULL;
                                }
                        }
@@ -1392,7 +1417,7 @@ ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *p
                        if (UNEXPECTED(property_info->flags & ZEND_ACC_PRIVATE)
                         || UNEXPECTED(!is_protected_compatible_scope(property_info->ce, scope))) {
                                if (!silent) {
-                                       zend_throw_error(NULL, "Cannot access %s property %s::$%s", zend_visibility_string(property_info->flags), ZSTR_VAL(ce->name), ZSTR_VAL(property_name));
+                                       zend_bad_property_access(property_info, ce, property_name);
                                }
                                return NULL;
                        }
@@ -1435,7 +1460,7 @@ ZEND_API ZEND_COLD zend_bool zend_std_unset_static_property(zend_class_entry *ce
 }
 /* }}} */
 
-static ZEND_COLD zend_never_inline void zend_incompatible_constructor(zend_function *constructor, zend_class_entry *scope) /* {{{ */
+static ZEND_COLD zend_never_inline void zend_bad_constructor_call(zend_function *constructor, zend_class_entry *scope) /* {{{ */
 {
        if (scope) {
                zend_throw_error(NULL, "Call to %s %s::%s() from context '%s'", zend_visibility_string(constructor->common.fn_flags), ZSTR_VAL(constructor->common.scope->name), ZSTR_VAL(constructor->common.function_name), ZSTR_VAL(scope->name));
@@ -1460,7 +1485,7 @@ ZEND_API zend_function *zend_std_get_constructor(zend_object *zobj) /* {{{ */
                        if (UNEXPECTED(constructor->common.scope != scope)) {
                                if (UNEXPECTED(constructor->op_array.fn_flags & ZEND_ACC_PRIVATE)
                                 || UNEXPECTED(!zend_check_protected(zend_get_function_root_class(constructor), scope))) {
-                                       zend_incompatible_constructor(constructor, scope);
+                                       zend_bad_constructor_call(constructor, scope);
                                        constructor = NULL;
                                }
                        }