]> granicus.if.org Git - php/commitdiff
Add common code for magic method assignment
authorNikita Popov <nikita.ppv@gmail.com>
Mon, 20 Jul 2020 12:56:48 +0000 (14:56 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Mon, 20 Jul 2020 12:57:10 +0000 (14:57 +0200)
This was repeated three times.

Zend/zend_API.c
Zend/zend_API.h
Zend/zend_compile.c
Zend/zend_inheritance.c

index b1d3c26fd8e116f72a3dc1fbb607cd20f0bbb698..434a5befc14a21e8da743855f63b6a9e6c29a8f9 100644 (file)
@@ -2138,6 +2138,44 @@ ZEND_API void zend_check_magic_method_implementation(const zend_class_entry *ce,
 }
 /* }}} */
 
+ZEND_API void zend_add_magic_method(zend_class_entry *ce, zend_function *fptr, zend_string *lcname)
+{
+       if (ZSTR_VAL(lcname)[0] != '_' || ZSTR_VAL(lcname)[1] != '_') {
+               /* pass */
+       } else if (zend_string_equals_literal(lcname, ZEND_CLONE_FUNC_NAME)) {
+               ce->clone = fptr;
+       } else if (zend_string_equals_literal(lcname, ZEND_CONSTRUCTOR_FUNC_NAME)) {
+               ce->constructor = fptr;
+               ce->constructor->common.fn_flags |= ZEND_ACC_CTOR;
+       } else if (zend_string_equals_literal(lcname, ZEND_DESTRUCTOR_FUNC_NAME)) {
+               ce->destructor = fptr;
+       } else if (zend_string_equals_literal(lcname, ZEND_GET_FUNC_NAME)) {
+               ce->__get = fptr;
+               ce->ce_flags |= ZEND_ACC_USE_GUARDS;
+       } else if (zend_string_equals_literal(lcname, ZEND_SET_FUNC_NAME)) {
+               ce->__set = fptr;
+               ce->ce_flags |= ZEND_ACC_USE_GUARDS;
+       } else if (zend_string_equals_literal(lcname, ZEND_CALL_FUNC_NAME)) {
+               ce->__call = fptr;
+       } else if (zend_string_equals_literal(lcname, ZEND_UNSET_FUNC_NAME)) {
+               ce->__unset = fptr;
+               ce->ce_flags |= ZEND_ACC_USE_GUARDS;
+       } else if (zend_string_equals_literal(lcname, ZEND_ISSET_FUNC_NAME)) {
+               ce->__isset = fptr;
+               ce->ce_flags |= ZEND_ACC_USE_GUARDS;
+       } else if (zend_string_equals_literal(lcname, ZEND_CALLSTATIC_FUNC_NAME)) {
+               ce->__callstatic = fptr;
+       } else if (zend_string_equals_literal(lcname, ZEND_TOSTRING_FUNC_NAME)) {
+               ce->__tostring = fptr;
+       } else if (zend_string_equals_literal(lcname, ZEND_DEBUGINFO_FUNC_NAME)) {
+               ce->__debugInfo = fptr;
+       } else if (zend_string_equals_literal(lcname, "__serialize")) {
+               ce->__serialize = fptr;
+       } else if (zend_string_equals_literal(lcname, "__unserialize")) {
+               ce->__unserialize = fptr;
+       }
+}
+
 /* registers all functions in *library_functions in the function hash */
 ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_function_entry *functions, HashTable *function_table, int type) /* {{{ */
 {
@@ -2294,47 +2332,9 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_functio
                }
 
                if (scope) {
-                       /* Look for ctor, dtor, clone */
-                       if (ZSTR_VAL(lowercase_name)[0] != '_' || ZSTR_VAL(lowercase_name)[1] != '_') {
-                               reg_function = NULL;
-                       } else if (zend_string_equals_literal(lowercase_name, ZEND_CONSTRUCTOR_FUNC_NAME)) {
-                               scope->constructor = reg_function;
-                               scope->constructor->common.fn_flags |= ZEND_ACC_CTOR;
-                       } else if (zend_string_equals_literal(lowercase_name, ZEND_DESTRUCTOR_FUNC_NAME)) {
-                               scope->destructor = reg_function;
-                       } else if (zend_string_equals_literal(lowercase_name, ZEND_CLONE_FUNC_NAME)) {
-                               scope->clone = reg_function;
-                       } else if (zend_string_equals_literal(lowercase_name, ZEND_CALL_FUNC_NAME)) {
-                               scope->__call = reg_function;
-                       } else if (zend_string_equals_literal(lowercase_name, ZEND_CALLSTATIC_FUNC_NAME)) {
-                               scope->__callstatic = reg_function;
-                       } else if (zend_string_equals_literal(lowercase_name, ZEND_TOSTRING_FUNC_NAME)) {
-                               scope->__tostring = reg_function;
-                       } else if (zend_string_equals_literal(lowercase_name, ZEND_GET_FUNC_NAME)) {
-                               scope->__get = reg_function;
-                               scope->ce_flags |= ZEND_ACC_USE_GUARDS;
-                       } else if (zend_string_equals_literal(lowercase_name, ZEND_SET_FUNC_NAME)) {
-                               scope->__set = reg_function;
-                               scope->ce_flags |= ZEND_ACC_USE_GUARDS;
-                       } else if (zend_string_equals_literal(lowercase_name, ZEND_UNSET_FUNC_NAME)) {
-                               scope->__unset = reg_function;
-                               scope->ce_flags |= ZEND_ACC_USE_GUARDS;
-                       } else if (zend_string_equals_literal(lowercase_name, ZEND_ISSET_FUNC_NAME)) {
-                               scope->__isset = reg_function;
-                               scope->ce_flags |= ZEND_ACC_USE_GUARDS;
-                       } else if (zend_string_equals_literal(lowercase_name, ZEND_DEBUGINFO_FUNC_NAME)) {
-                               scope->__debugInfo = reg_function;
-                       } else if (zend_string_equals_literal(lowercase_name, "__serialize")) {
-                               scope->__serialize = reg_function;
-                       } else if (zend_string_equals_literal(lowercase_name, "__unserialize")) {
-                               scope->__unserialize = reg_function;
-                       } else {
-                               reg_function = NULL;
-                       }
-                       if (reg_function) {
-                               zend_check_magic_method_implementation(
-                                       scope, reg_function, lowercase_name, E_CORE_ERROR);
-                       }
+                       zend_check_magic_method_implementation(
+                               scope, reg_function, lowercase_name, E_CORE_ERROR);
+                       zend_add_magic_method(scope, reg_function, lowercase_name);
                }
                ptr++;
                count++;
index 67a3fa9d1637e959aed81f78a786271ff5501589..0eb4bffa39a132c9ce6579d9c689473c06915691 100644 (file)
@@ -320,6 +320,7 @@ ZEND_API void zend_collect_module_handlers(void);
 ZEND_API void zend_destroy_modules(void);
 ZEND_API void zend_check_magic_method_implementation(
                const zend_class_entry *ce, const zend_function *fptr, zend_string *lcname, int error_type);
+ZEND_API void zend_add_magic_method(zend_class_entry *ce, zend_function *fptr, zend_string *lcname);
 
 ZEND_API zend_class_entry *zend_register_internal_class(zend_class_entry *class_entry);
 ZEND_API zend_class_entry *zend_register_internal_class_ex(zend_class_entry *class_entry, zend_class_entry *parent_ce);
index cabc1087a7fcc5db4f34f034167eb0e5e1ffdd70..aafe582f9f551ca9f393ce160943977d1ba64004 100644 (file)
@@ -6509,40 +6509,9 @@ zend_string *zend_begin_method_decl(zend_op_array *op_array, zend_string *name,
                        ZSTR_VAL(ce->name), ZSTR_VAL(name));
        }
 
-       if (ZSTR_VAL(lcname)[0] != '_' || ZSTR_VAL(lcname)[1] != '_') {
-               /* pass */
-       } else if (zend_string_equals_literal(lcname, ZEND_CONSTRUCTOR_FUNC_NAME)) {
-               ce->constructor = (zend_function *) op_array;
-               ce->constructor->common.fn_flags |= ZEND_ACC_CTOR;
-       } else if (zend_string_equals_literal(lcname, ZEND_DESTRUCTOR_FUNC_NAME)) {
-               ce->destructor = (zend_function *) op_array;
-       } else if (zend_string_equals_literal(lcname, ZEND_CLONE_FUNC_NAME)) {
-               ce->clone = (zend_function *) op_array;
-       } else if (zend_string_equals_literal(lcname, ZEND_CALL_FUNC_NAME)) {
-               ce->__call = (zend_function *) op_array;
-       } else if (zend_string_equals_literal(lcname, ZEND_CALLSTATIC_FUNC_NAME)) {
-               ce->__callstatic = (zend_function *) op_array;
-       } else if (zend_string_equals_literal(lcname, ZEND_GET_FUNC_NAME)) {
-               ce->__get = (zend_function *) op_array;
-               ce->ce_flags |= ZEND_ACC_USE_GUARDS;
-       } else if (zend_string_equals_literal(lcname, ZEND_SET_FUNC_NAME)) {
-               ce->__set = (zend_function *) op_array;
-               ce->ce_flags |= ZEND_ACC_USE_GUARDS;
-       } else if (zend_string_equals_literal(lcname, ZEND_UNSET_FUNC_NAME)) {
-               ce->__unset = (zend_function *) op_array;
-               ce->ce_flags |= ZEND_ACC_USE_GUARDS;
-       } else if (zend_string_equals_literal(lcname, ZEND_ISSET_FUNC_NAME)) {
-               ce->__isset = (zend_function *) op_array;
-               ce->ce_flags |= ZEND_ACC_USE_GUARDS;
-       } else if (zend_string_equals_literal(lcname, ZEND_TOSTRING_FUNC_NAME)) {
-               ce->__tostring = (zend_function *) op_array;
+       zend_add_magic_method(ce, (zend_function *) op_array, lcname);
+       if (zend_string_equals_literal(lcname, ZEND_TOSTRING_FUNC_NAME)) {
                add_stringable_interface(ce);
-       } else if (zend_string_equals_literal(lcname, ZEND_DEBUGINFO_FUNC_NAME)) {
-               ce->__debugInfo = (zend_function *) op_array;
-       } else if (zend_string_equals_literal(lcname, "__serialize")) {
-               ce->__serialize = (zend_function *) op_array;
-       } else if (zend_string_equals_literal(lcname, "__unserialize")) {
-               ce->__unserialize = (zend_function *) op_array;
        }
 
        return lcname;
index b70ce01b971abb603e73b8dbf6dbeb5fb093f293..158b67ce38007afbe1e7a3805a0361789141fabd 100644 (file)
@@ -1559,44 +1559,6 @@ static void zend_do_implement_interfaces(zend_class_entry *ce, zend_class_entry
 }
 /* }}} */
 
-static void zend_add_magic_methods(zend_class_entry* ce, zend_string* mname, zend_function* fe) /* {{{ */
-{
-       if (ZSTR_VAL(mname)[0] != '_' || ZSTR_VAL(mname)[1] != '_') {
-               /* pass */
-       } else if (zend_string_equals_literal(mname, ZEND_CLONE_FUNC_NAME)) {
-               ce->clone = fe;
-       } else if (zend_string_equals_literal(mname, ZEND_CONSTRUCTOR_FUNC_NAME)) {
-               ce->constructor = fe;
-       } else if (zend_string_equals_literal(mname, ZEND_DESTRUCTOR_FUNC_NAME)) {
-               ce->destructor = fe;
-       } else if (zend_string_equals_literal(mname, ZEND_GET_FUNC_NAME)) {
-               ce->__get = fe;
-               ce->ce_flags |= ZEND_ACC_USE_GUARDS;
-       } else if (zend_string_equals_literal(mname, ZEND_SET_FUNC_NAME)) {
-               ce->__set = fe;
-               ce->ce_flags |= ZEND_ACC_USE_GUARDS;
-       } else if (zend_string_equals_literal(mname, ZEND_CALL_FUNC_NAME)) {
-               ce->__call = fe;
-       } else if (zend_string_equals_literal(mname, ZEND_UNSET_FUNC_NAME)) {
-               ce->__unset = fe;
-               ce->ce_flags |= ZEND_ACC_USE_GUARDS;
-       } else if (zend_string_equals_literal(mname, ZEND_ISSET_FUNC_NAME)) {
-               ce->__isset = fe;
-               ce->ce_flags |= ZEND_ACC_USE_GUARDS;
-       } else if (zend_string_equals_literal(mname, ZEND_CALLSTATIC_FUNC_NAME)) {
-               ce->__callstatic = fe;
-       } else if (zend_string_equals_literal(mname, ZEND_TOSTRING_FUNC_NAME)) {
-               ce->__tostring = fe;
-       } else if (zend_string_equals_literal(mname, ZEND_DEBUGINFO_FUNC_NAME)) {
-               ce->__debugInfo = fe;
-       } else if (zend_string_equals_literal(mname, "__serialize")) {
-               ce->__serialize = fe;
-       } else if (zend_string_equals_literal(mname, "__unserialize")) {
-               ce->__unserialize = fe;
-       }
-}
-/* }}} */
-
 static void zend_add_trait_method(zend_class_entry *ce, zend_string *name, zend_string *key, zend_function *fn) /* {{{ */
 {
        zend_function *existing_fn = NULL;
@@ -1659,7 +1621,7 @@ static void zend_add_trait_method(zend_class_entry *ce, zend_string *name, zend_
        new_fn->common.function_name = name;
        function_add_ref(new_fn);
        fn = zend_hash_update_ptr(&ce->function_table, key, new_fn);
-       zend_add_magic_methods(ce, key, fn);
+       zend_add_magic_method(ce, fn, key);
 }
 /* }}} */