Skip to content

Commit 7fd4212

Browse files
committed
Add common code for magic method assignment
This was repeated three times.
1 parent 05e9197 commit 7fd4212

File tree

4 files changed

+45
-113
lines changed

4 files changed

+45
-113
lines changed

Zend/zend_API.c

Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -2138,6 +2138,44 @@ ZEND_API void zend_check_magic_method_implementation(const zend_class_entry *ce,
21382138
}
21392139
/* }}} */
21402140

2141+
ZEND_API void zend_add_magic_method(zend_class_entry *ce, zend_function *fptr, zend_string *lcname)
2142+
{
2143+
if (ZSTR_VAL(lcname)[0] != '_' || ZSTR_VAL(lcname)[1] != '_') {
2144+
/* pass */
2145+
} else if (zend_string_equals_literal(lcname, ZEND_CLONE_FUNC_NAME)) {
2146+
ce->clone = fptr;
2147+
} else if (zend_string_equals_literal(lcname, ZEND_CONSTRUCTOR_FUNC_NAME)) {
2148+
ce->constructor = fptr;
2149+
ce->constructor->common.fn_flags |= ZEND_ACC_CTOR;
2150+
} else if (zend_string_equals_literal(lcname, ZEND_DESTRUCTOR_FUNC_NAME)) {
2151+
ce->destructor = fptr;
2152+
} else if (zend_string_equals_literal(lcname, ZEND_GET_FUNC_NAME)) {
2153+
ce->__get = fptr;
2154+
ce->ce_flags |= ZEND_ACC_USE_GUARDS;
2155+
} else if (zend_string_equals_literal(lcname, ZEND_SET_FUNC_NAME)) {
2156+
ce->__set = fptr;
2157+
ce->ce_flags |= ZEND_ACC_USE_GUARDS;
2158+
} else if (zend_string_equals_literal(lcname, ZEND_CALL_FUNC_NAME)) {
2159+
ce->__call = fptr;
2160+
} else if (zend_string_equals_literal(lcname, ZEND_UNSET_FUNC_NAME)) {
2161+
ce->__unset = fptr;
2162+
ce->ce_flags |= ZEND_ACC_USE_GUARDS;
2163+
} else if (zend_string_equals_literal(lcname, ZEND_ISSET_FUNC_NAME)) {
2164+
ce->__isset = fptr;
2165+
ce->ce_flags |= ZEND_ACC_USE_GUARDS;
2166+
} else if (zend_string_equals_literal(lcname, ZEND_CALLSTATIC_FUNC_NAME)) {
2167+
ce->__callstatic = fptr;
2168+
} else if (zend_string_equals_literal(lcname, ZEND_TOSTRING_FUNC_NAME)) {
2169+
ce->__tostring = fptr;
2170+
} else if (zend_string_equals_literal(lcname, ZEND_DEBUGINFO_FUNC_NAME)) {
2171+
ce->__debugInfo = fptr;
2172+
} else if (zend_string_equals_literal(lcname, "__serialize")) {
2173+
ce->__serialize = fptr;
2174+
} else if (zend_string_equals_literal(lcname, "__unserialize")) {
2175+
ce->__unserialize = fptr;
2176+
}
2177+
}
2178+
21412179
/* registers all functions in *library_functions in the function hash */
21422180
ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_function_entry *functions, HashTable *function_table, int type) /* {{{ */
21432181
{
@@ -2294,47 +2332,9 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_functio
22942332
}
22952333

22962334
if (scope) {
2297-
/* Look for ctor, dtor, clone */
2298-
if (ZSTR_VAL(lowercase_name)[0] != '_' || ZSTR_VAL(lowercase_name)[1] != '_') {
2299-
reg_function = NULL;
2300-
} else if (zend_string_equals_literal(lowercase_name, ZEND_CONSTRUCTOR_FUNC_NAME)) {
2301-
scope->constructor = reg_function;
2302-
scope->constructor->common.fn_flags |= ZEND_ACC_CTOR;
2303-
} else if (zend_string_equals_literal(lowercase_name, ZEND_DESTRUCTOR_FUNC_NAME)) {
2304-
scope->destructor = reg_function;
2305-
} else if (zend_string_equals_literal(lowercase_name, ZEND_CLONE_FUNC_NAME)) {
2306-
scope->clone = reg_function;
2307-
} else if (zend_string_equals_literal(lowercase_name, ZEND_CALL_FUNC_NAME)) {
2308-
scope->__call = reg_function;
2309-
} else if (zend_string_equals_literal(lowercase_name, ZEND_CALLSTATIC_FUNC_NAME)) {
2310-
scope->__callstatic = reg_function;
2311-
} else if (zend_string_equals_literal(lowercase_name, ZEND_TOSTRING_FUNC_NAME)) {
2312-
scope->__tostring = reg_function;
2313-
} else if (zend_string_equals_literal(lowercase_name, ZEND_GET_FUNC_NAME)) {
2314-
scope->__get = reg_function;
2315-
scope->ce_flags |= ZEND_ACC_USE_GUARDS;
2316-
} else if (zend_string_equals_literal(lowercase_name, ZEND_SET_FUNC_NAME)) {
2317-
scope->__set = reg_function;
2318-
scope->ce_flags |= ZEND_ACC_USE_GUARDS;
2319-
} else if (zend_string_equals_literal(lowercase_name, ZEND_UNSET_FUNC_NAME)) {
2320-
scope->__unset = reg_function;
2321-
scope->ce_flags |= ZEND_ACC_USE_GUARDS;
2322-
} else if (zend_string_equals_literal(lowercase_name, ZEND_ISSET_FUNC_NAME)) {
2323-
scope->__isset = reg_function;
2324-
scope->ce_flags |= ZEND_ACC_USE_GUARDS;
2325-
} else if (zend_string_equals_literal(lowercase_name, ZEND_DEBUGINFO_FUNC_NAME)) {
2326-
scope->__debugInfo = reg_function;
2327-
} else if (zend_string_equals_literal(lowercase_name, "__serialize")) {
2328-
scope->__serialize = reg_function;
2329-
} else if (zend_string_equals_literal(lowercase_name, "__unserialize")) {
2330-
scope->__unserialize = reg_function;
2331-
} else {
2332-
reg_function = NULL;
2333-
}
2334-
if (reg_function) {
2335-
zend_check_magic_method_implementation(
2336-
scope, reg_function, lowercase_name, E_CORE_ERROR);
2337-
}
2335+
zend_check_magic_method_implementation(
2336+
scope, reg_function, lowercase_name, E_CORE_ERROR);
2337+
zend_add_magic_method(scope, reg_function, lowercase_name);
23382338
}
23392339
ptr++;
23402340
count++;

Zend/zend_API.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,7 @@ ZEND_API void zend_collect_module_handlers(void);
320320
ZEND_API void zend_destroy_modules(void);
321321
ZEND_API void zend_check_magic_method_implementation(
322322
const zend_class_entry *ce, const zend_function *fptr, zend_string *lcname, int error_type);
323+
ZEND_API void zend_add_magic_method(zend_class_entry *ce, zend_function *fptr, zend_string *lcname);
323324

324325
ZEND_API zend_class_entry *zend_register_internal_class(zend_class_entry *class_entry);
325326
ZEND_API zend_class_entry *zend_register_internal_class_ex(zend_class_entry *class_entry, zend_class_entry *parent_ce);

Zend/zend_compile.c

Lines changed: 2 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -6509,40 +6509,9 @@ zend_string *zend_begin_method_decl(zend_op_array *op_array, zend_string *name,
65096509
ZSTR_VAL(ce->name), ZSTR_VAL(name));
65106510
}
65116511

6512-
if (ZSTR_VAL(lcname)[0] != '_' || ZSTR_VAL(lcname)[1] != '_') {
6513-
/* pass */
6514-
} else if (zend_string_equals_literal(lcname, ZEND_CONSTRUCTOR_FUNC_NAME)) {
6515-
ce->constructor = (zend_function *) op_array;
6516-
ce->constructor->common.fn_flags |= ZEND_ACC_CTOR;
6517-
} else if (zend_string_equals_literal(lcname, ZEND_DESTRUCTOR_FUNC_NAME)) {
6518-
ce->destructor = (zend_function *) op_array;
6519-
} else if (zend_string_equals_literal(lcname, ZEND_CLONE_FUNC_NAME)) {
6520-
ce->clone = (zend_function *) op_array;
6521-
} else if (zend_string_equals_literal(lcname, ZEND_CALL_FUNC_NAME)) {
6522-
ce->__call = (zend_function *) op_array;
6523-
} else if (zend_string_equals_literal(lcname, ZEND_CALLSTATIC_FUNC_NAME)) {
6524-
ce->__callstatic = (zend_function *) op_array;
6525-
} else if (zend_string_equals_literal(lcname, ZEND_GET_FUNC_NAME)) {
6526-
ce->__get = (zend_function *) op_array;
6527-
ce->ce_flags |= ZEND_ACC_USE_GUARDS;
6528-
} else if (zend_string_equals_literal(lcname, ZEND_SET_FUNC_NAME)) {
6529-
ce->__set = (zend_function *) op_array;
6530-
ce->ce_flags |= ZEND_ACC_USE_GUARDS;
6531-
} else if (zend_string_equals_literal(lcname, ZEND_UNSET_FUNC_NAME)) {
6532-
ce->__unset = (zend_function *) op_array;
6533-
ce->ce_flags |= ZEND_ACC_USE_GUARDS;
6534-
} else if (zend_string_equals_literal(lcname, ZEND_ISSET_FUNC_NAME)) {
6535-
ce->__isset = (zend_function *) op_array;
6536-
ce->ce_flags |= ZEND_ACC_USE_GUARDS;
6537-
} else if (zend_string_equals_literal(lcname, ZEND_TOSTRING_FUNC_NAME)) {
6538-
ce->__tostring = (zend_function *) op_array;
6512+
zend_add_magic_method(ce, (zend_function *) op_array, lcname);
6513+
if (zend_string_equals_literal(lcname, ZEND_TOSTRING_FUNC_NAME)) {
65396514
add_stringable_interface(ce);
6540-
} else if (zend_string_equals_literal(lcname, ZEND_DEBUGINFO_FUNC_NAME)) {
6541-
ce->__debugInfo = (zend_function *) op_array;
6542-
} else if (zend_string_equals_literal(lcname, "__serialize")) {
6543-
ce->__serialize = (zend_function *) op_array;
6544-
} else if (zend_string_equals_literal(lcname, "__unserialize")) {
6545-
ce->__unserialize = (zend_function *) op_array;
65466515
}
65476516

65486517
return lcname;

Zend/zend_inheritance.c

Lines changed: 1 addition & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1559,44 +1559,6 @@ static void zend_do_implement_interfaces(zend_class_entry *ce, zend_class_entry
15591559
}
15601560
/* }}} */
15611561

1562-
static void zend_add_magic_methods(zend_class_entry* ce, zend_string* mname, zend_function* fe) /* {{{ */
1563-
{
1564-
if (ZSTR_VAL(mname)[0] != '_' || ZSTR_VAL(mname)[1] != '_') {
1565-
/* pass */
1566-
} else if (zend_string_equals_literal(mname, ZEND_CLONE_FUNC_NAME)) {
1567-
ce->clone = fe;
1568-
} else if (zend_string_equals_literal(mname, ZEND_CONSTRUCTOR_FUNC_NAME)) {
1569-
ce->constructor = fe;
1570-
} else if (zend_string_equals_literal(mname, ZEND_DESTRUCTOR_FUNC_NAME)) {
1571-
ce->destructor = fe;
1572-
} else if (zend_string_equals_literal(mname, ZEND_GET_FUNC_NAME)) {
1573-
ce->__get = fe;
1574-
ce->ce_flags |= ZEND_ACC_USE_GUARDS;
1575-
} else if (zend_string_equals_literal(mname, ZEND_SET_FUNC_NAME)) {
1576-
ce->__set = fe;
1577-
ce->ce_flags |= ZEND_ACC_USE_GUARDS;
1578-
} else if (zend_string_equals_literal(mname, ZEND_CALL_FUNC_NAME)) {
1579-
ce->__call = fe;
1580-
} else if (zend_string_equals_literal(mname, ZEND_UNSET_FUNC_NAME)) {
1581-
ce->__unset = fe;
1582-
ce->ce_flags |= ZEND_ACC_USE_GUARDS;
1583-
} else if (zend_string_equals_literal(mname, ZEND_ISSET_FUNC_NAME)) {
1584-
ce->__isset = fe;
1585-
ce->ce_flags |= ZEND_ACC_USE_GUARDS;
1586-
} else if (zend_string_equals_literal(mname, ZEND_CALLSTATIC_FUNC_NAME)) {
1587-
ce->__callstatic = fe;
1588-
} else if (zend_string_equals_literal(mname, ZEND_TOSTRING_FUNC_NAME)) {
1589-
ce->__tostring = fe;
1590-
} else if (zend_string_equals_literal(mname, ZEND_DEBUGINFO_FUNC_NAME)) {
1591-
ce->__debugInfo = fe;
1592-
} else if (zend_string_equals_literal(mname, "__serialize")) {
1593-
ce->__serialize = fe;
1594-
} else if (zend_string_equals_literal(mname, "__unserialize")) {
1595-
ce->__unserialize = fe;
1596-
}
1597-
}
1598-
/* }}} */
1599-
16001562
static void zend_add_trait_method(zend_class_entry *ce, zend_string *name, zend_string *key, zend_function *fn) /* {{{ */
16011563
{
16021564
zend_function *existing_fn = NULL;
@@ -1659,7 +1621,7 @@ static void zend_add_trait_method(zend_class_entry *ce, zend_string *name, zend_
16591621
new_fn->common.function_name = name;
16601622
function_add_ref(new_fn);
16611623
fn = zend_hash_update_ptr(&ce->function_table, key, new_fn);
1662-
zend_add_magic_methods(ce, key, fn);
1624+
zend_add_magic_method(ce, fn, key);
16631625
}
16641626
/* }}} */
16651627

0 commit comments

Comments
 (0)