@@ -1263,11 +1263,29 @@ static zend_always_inline zend_function *zend_get_user_callstatic_function(zend_
1263
1263
}
1264
1264
/* }}} */
1265
1265
1266
+ static zend_always_inline zend_function * get_static_method_fallback (
1267
+ zend_class_entry * ce , zend_string * function_name )
1268
+ {
1269
+ zend_object * object ;
1270
+ if (ce -> __call &&
1271
+ (object = zend_get_this_object (EG (current_execute_data ))) != NULL &&
1272
+ instanceof_function (object -> ce , ce )) {
1273
+ /* Call the top-level defined __call().
1274
+ * see: tests/classes/__call_004.phpt */
1275
+
1276
+ ZEND_ASSERT (object -> ce -> __call );
1277
+ return zend_get_user_call_function (object -> ce , function_name );
1278
+ } else if (ce -> __callstatic ) {
1279
+ return zend_get_user_callstatic_function (ce , function_name );
1280
+ } else {
1281
+ return NULL ;
1282
+ }
1283
+ }
1284
+
1266
1285
ZEND_API zend_function * zend_std_get_static_method (zend_class_entry * ce , zend_string * function_name , const zval * key ) /* {{{ */
1267
1286
{
1268
1287
zend_function * fbc = NULL ;
1269
1288
zend_string * lc_function_name ;
1270
- zend_object * object ;
1271
1289
zend_class_entry * scope ;
1272
1290
1273
1291
if (EXPECTED (key != NULL )) {
@@ -1293,19 +1311,7 @@ ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_st
1293
1311
if (UNEXPECTED (!key )) {
1294
1312
zend_string_release_ex (lc_function_name , 0 );
1295
1313
}
1296
- if (ce -> __call &&
1297
- (object = zend_get_this_object (EG (current_execute_data ))) != NULL &&
1298
- instanceof_function (object -> ce , ce )) {
1299
- /* Call the top-level defined __call().
1300
- * see: tests/classes/__call_004.phpt */
1301
-
1302
- ZEND_ASSERT (object -> ce -> __call );
1303
- return zend_get_user_call_function (object -> ce , function_name );
1304
- } else if (ce -> __callstatic ) {
1305
- return zend_get_user_callstatic_function (ce , function_name );
1306
- } else {
1307
- return NULL ;
1308
- }
1314
+ return get_static_method_fallback (ce , function_name );
1309
1315
}
1310
1316
} while (0 );
1311
1317
@@ -1321,12 +1327,11 @@ ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_st
1321
1327
if (UNEXPECTED (fbc -> common .scope != scope )) {
1322
1328
if (UNEXPECTED (fbc -> op_array .fn_flags & ZEND_ACC_PRIVATE )
1323
1329
|| UNEXPECTED (!zend_check_protected (zend_get_function_root_class (fbc ), scope ))) {
1324
- if (ce -> __callstatic ) {
1325
- fbc = zend_get_user_callstatic_function (ce , function_name );
1326
- } else {
1330
+ zend_function * fallback_fbc = get_static_method_fallback (ce , function_name );
1331
+ if (!fallback_fbc ) {
1327
1332
zend_bad_method_call (fbc , function_name , scope );
1328
- fbc = NULL ;
1329
1333
}
1334
+ fbc = fallback_fbc ;
1330
1335
}
1331
1336
}
1332
1337
}
0 commit comments