@@ -1035,29 +1035,37 @@ ZEND_API int zend_check_protected(zend_class_entry *ce, zend_class_entry *scope)
1035
1035
}
1036
1036
/* }}} */
1037
1037
1038
+ static inline zend_op_array * zend_get_proxy_call_function (zend_class_entry * ce , zend_string * method_name , int is_static ) /* {{{ */ {
1039
+ zend_op_array * call_user_call = ecalloc (1 , ZEND_MM_ALIGNED_SIZE (sizeof (zend_op_array )) + sizeof (zend_op ));
1040
+
1041
+ ZEND_ASSERT (ce -> type == ZEND_USER_CLASS );
1042
+
1043
+ call_user_call -> type = ZEND_USER_FUNCTION ;
1044
+ call_user_call -> scope = ce ;
1045
+ call_user_call -> prototype = is_static ? ce -> __callstatic : ce -> __call ;
1046
+ call_user_call -> fn_flags = ZEND_ACC_CALL_VIA_HANDLER | (is_static ? (ZEND_ACC_STATIC | ZEND_ACC_PUBLIC ) : 0 );
1047
+ call_user_call -> this_var = -1 ;
1048
+ call_user_call -> filename = is_static ? ce -> __callstatic -> op_array . filename : ce -> __call -> op_array .filename ;
1049
+ call_user_call -> opcodes = (zend_op * )((char * )call_user_call + ZEND_MM_ALIGNED_SIZE (sizeof (zend_op_array )));
1050
+ call_user_call -> opcodes [0 ].opcode = ZEND_PROXY_CALL ;
1051
+ call_user_call -> opcodes [0 ].op1_type = IS_UNUSED ;
1052
+ call_user_call -> opcodes [0 ].op2_type = IS_UNUSED ;
1053
+ call_user_call -> opcodes [0 ].result_type = IS_UNUSED ;
1054
+ ZEND_VM_SET_OPCODE_HANDLER (& call_user_call -> opcodes [0 ]);
1055
+ if (UNEXPECTED (strlen (method_name -> val ) != method_name -> len )) {
1056
+ call_user_call -> function_name = zend_string_init (method_name -> val , strlen (method_name -> val ), 0 );
1057
+ } else {
1058
+ call_user_call -> function_name = zend_string_copy (method_name );
1059
+ }
1060
+
1061
+ return call_user_call ;
1062
+ }
1063
+ /* }}} */
1064
+
1038
1065
static inline union _zend_function * zend_get_user_call_function (zend_class_entry * ce , zend_string * method_name ) /* {{{ */
1039
1066
{
1040
1067
if (ce -> type == ZEND_USER_CLASS ) {
1041
- zend_op_array * call_user_call = ecalloc (1 , ZEND_MM_ALIGNED_SIZE (sizeof (zend_op_array )) + sizeof (zend_op ));
1042
- call_user_call -> type = ZEND_USER_FUNCTION ;
1043
- call_user_call -> scope = ce ;
1044
- call_user_call -> prototype = ce -> __call ;
1045
- call_user_call -> fn_flags = ZEND_ACC_CALL_VIA_HANDLER ;
1046
- call_user_call -> this_var = -1 ;
1047
- call_user_call -> filename = ce -> __call -> op_array .filename ;
1048
- call_user_call -> opcodes = (zend_op * )((char * )call_user_call + ZEND_MM_ALIGNED_SIZE (sizeof (zend_op_array )));
1049
- call_user_call -> opcodes [0 ].opcode = ZEND_PROXY_CALL ;
1050
- call_user_call -> opcodes [0 ].op1_type = IS_UNUSED ;
1051
- call_user_call -> opcodes [0 ].op2_type = IS_UNUSED ;
1052
- call_user_call -> opcodes [0 ].result_type = IS_UNUSED ;
1053
- ZEND_VM_SET_OPCODE_HANDLER (& call_user_call -> opcodes [0 ]);
1054
-
1055
- if (UNEXPECTED (strlen (method_name -> val ) != method_name -> len )) {
1056
- call_user_call -> function_name = zend_string_init (method_name -> val , strlen (method_name -> val ), 0 );
1057
- } else {
1058
- call_user_call -> function_name = zend_string_copy (method_name );
1059
- }
1060
- return (union _zend_function * )call_user_call ;
1068
+ return (union _zend_function * )zend_get_proxy_call_function (ce , method_name , 0 );
1061
1069
} else {
1062
1070
zend_internal_function * call_user_call = emalloc (sizeof (zend_internal_function ));
1063
1071
call_user_call -> type = ZEND_INTERNAL_FUNCTION ;
@@ -1206,23 +1214,27 @@ ZEND_API void zend_std_callstatic_user_call(INTERNAL_FUNCTION_PARAMETERS) /* {{{
1206
1214
1207
1215
static inline union _zend_function * zend_get_user_callstatic_function (zend_class_entry * ce , zend_string * method_name ) /* {{{ */
1208
1216
{
1209
- zend_internal_function * callstatic_user_call = emalloc (sizeof (zend_internal_function ));
1210
- callstatic_user_call -> type = ZEND_INTERNAL_FUNCTION ;
1211
- callstatic_user_call -> module = (ce -> type == ZEND_INTERNAL_CLASS ) ? ce -> info .internal .module : NULL ;
1212
- callstatic_user_call -> handler = zend_std_callstatic_user_call ;
1213
- callstatic_user_call -> arg_info = NULL ;
1214
- callstatic_user_call -> num_args = 0 ;
1215
- callstatic_user_call -> scope = ce ;
1216
- callstatic_user_call -> fn_flags = ZEND_ACC_STATIC | ZEND_ACC_PUBLIC | ZEND_ACC_CALL_VIA_HANDLER ;
1217
- //??? keep compatibility for "\0" characters
1218
- //??? see: Zend/tests/bug46238.phpt
1219
- if (UNEXPECTED (strlen (method_name -> val ) != method_name -> len )) {
1220
- callstatic_user_call -> function_name = zend_string_init (method_name -> val , strlen (method_name -> val ), 0 );
1217
+ if (ce -> type == ZEND_USER_CLASS ) {
1218
+ return (union _zend_function * )zend_get_proxy_call_function (ce , method_name , 1 );
1221
1219
} else {
1222
- callstatic_user_call -> function_name = zend_string_copy (method_name );
1223
- }
1220
+ zend_internal_function * callstatic_user_call = emalloc (sizeof (zend_internal_function ));
1221
+ callstatic_user_call -> type = ZEND_INTERNAL_FUNCTION ;
1222
+ callstatic_user_call -> module = (ce -> type == ZEND_INTERNAL_CLASS ) ? ce -> info .internal .module : NULL ;
1223
+ callstatic_user_call -> handler = zend_std_callstatic_user_call ;
1224
+ callstatic_user_call -> arg_info = NULL ;
1225
+ callstatic_user_call -> num_args = 0 ;
1226
+ callstatic_user_call -> scope = ce ;
1227
+ callstatic_user_call -> fn_flags = ZEND_ACC_STATIC | ZEND_ACC_PUBLIC | ZEND_ACC_CALL_VIA_HANDLER ;
1228
+ //??? keep compatibility for "\0" characters
1229
+ //??? see: Zend/tests/bug46238.phpt
1230
+ if (UNEXPECTED (strlen (method_name -> val ) != method_name -> len )) {
1231
+ callstatic_user_call -> function_name = zend_string_init (method_name -> val , strlen (method_name -> val ), 0 );
1232
+ } else {
1233
+ callstatic_user_call -> function_name = zend_string_copy (method_name );
1234
+ }
1224
1235
1225
- return (zend_function * )callstatic_user_call ;
1236
+ return (zend_function * )callstatic_user_call ;
1237
+ }
1226
1238
}
1227
1239
/* }}} */
1228
1240
0 commit comments