@@ -952,12 +952,13 @@ PHP_METHOD(SQLite3, createFunction)
952952 php_sqlite3_func * func ;
953953 char * sql_func ;
954954 size_t sql_func_len ;
955- zval * callback_func ;
955+ zend_fcall_info fci ;
956+ zend_fcall_info_cache fcc ;
956957 zend_long sql_func_num_args = -1 ;
957958 zend_long flags = 0 ;
958959 db_obj = Z_SQLITE3_DB_P (object );
959960
960- if (zend_parse_parameters (ZEND_NUM_ARGS (), "sz |ll" , & sql_func , & sql_func_len , & callback_func , & sql_func_num_args , & flags ) == FAILURE ) {
961+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "sf |ll" , & sql_func , & sql_func_len , & fci , & fcc , & sql_func_num_args , & flags ) == FAILURE ) {
961962 RETURN_THROWS ();
962963 }
963964
@@ -967,19 +968,12 @@ PHP_METHOD(SQLite3, createFunction)
967968 RETURN_FALSE ;
968969 }
969970
970- if (!zend_is_callable (callback_func , 0 , NULL )) {
971- zend_string * callback_name = zend_get_callable_name (callback_func );
972- php_sqlite3_error (db_obj , "Not a valid callback function %s" , ZSTR_VAL (callback_name ));
973- zend_string_release_ex (callback_name , 0 );
974- RETURN_FALSE ;
975- }
976-
977971 func = (php_sqlite3_func * )ecalloc (1 , sizeof (* func ));
978972
979973 if (sqlite3_create_function (db_obj -> db , sql_func , sql_func_num_args , flags | SQLITE_UTF8 , func , php_sqlite3_callback_func , NULL , NULL ) == SQLITE_OK ) {
980974 func -> func_name = estrdup (sql_func );
981975
982- ZVAL_COPY (& func -> func , callback_func );
976+ ZVAL_COPY (& func -> func , & fci . function_name );
983977
984978 func -> argc = sql_func_num_args ;
985979 func -> next = db_obj -> funcs ;
@@ -1001,11 +995,12 @@ PHP_METHOD(SQLite3, createAggregate)
1001995 php_sqlite3_func * func ;
1002996 char * sql_func ;
1003997 size_t sql_func_len ;
1004- zval * step_callback , * fini_callback ;
998+ zend_fcall_info step_fci , fini_fci ;
999+ zend_fcall_info_cache step_fcc , fini_fcc ;
10051000 zend_long sql_func_num_args = -1 ;
10061001 db_obj = Z_SQLITE3_DB_P (object );
10071002
1008- if (zend_parse_parameters (ZEND_NUM_ARGS (), "szz |l" , & sql_func , & sql_func_len , & step_callback , & fini_callback , & sql_func_num_args ) == FAILURE ) {
1003+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "sff |l" , & sql_func , & sql_func_len , & step_fci , & step_fcc , & fini_fci , & fini_fcc , & sql_func_num_args ) == FAILURE ) {
10091004 RETURN_THROWS ();
10101005 }
10111006
@@ -1015,27 +1010,13 @@ PHP_METHOD(SQLite3, createAggregate)
10151010 RETURN_FALSE ;
10161011 }
10171012
1018- if (!zend_is_callable (step_callback , 0 , NULL )) {
1019- zend_string * callback_name = zend_get_callable_name (step_callback );
1020- php_sqlite3_error (db_obj , "Not a valid callback function %s" , ZSTR_VAL (callback_name ));
1021- zend_string_release_ex (callback_name , 0 );
1022- RETURN_FALSE ;
1023- }
1024-
1025- if (!zend_is_callable (fini_callback , 0 , NULL )) {
1026- zend_string * callback_name = zend_get_callable_name (fini_callback );
1027- php_sqlite3_error (db_obj , "Not a valid callback function %s" , ZSTR_VAL (callback_name ));
1028- zend_string_release_ex (callback_name , 0 );
1029- RETURN_FALSE ;
1030- }
1031-
10321013 func = (php_sqlite3_func * )ecalloc (1 , sizeof (* func ));
10331014
10341015 if (sqlite3_create_function (db_obj -> db , sql_func , sql_func_num_args , SQLITE_UTF8 , func , NULL , php_sqlite3_callback_step , php_sqlite3_callback_final ) == SQLITE_OK ) {
10351016 func -> func_name = estrdup (sql_func );
10361017
1037- ZVAL_COPY (& func -> step , step_callback );
1038- ZVAL_COPY (& func -> fini , fini_callback );
1018+ ZVAL_COPY (& func -> step , & step_fci . function_name );
1019+ ZVAL_COPY (& func -> fini , & fini_fci . function_name );
10391020
10401021 func -> argc = sql_func_num_args ;
10411022 func -> next = db_obj -> funcs ;
@@ -1057,10 +1038,11 @@ PHP_METHOD(SQLite3, createCollation)
10571038 php_sqlite3_collation * collation ;
10581039 char * collation_name ;
10591040 size_t collation_name_len ;
1060- zval * callback_func ;
1041+ zend_fcall_info fci ;
1042+ zend_fcall_info_cache fcc ;
10611043 db_obj = Z_SQLITE3_DB_P (object );
10621044
1063- if (zend_parse_parameters (ZEND_NUM_ARGS (), "sz " , & collation_name , & collation_name_len , & callback_func ) == FAILURE ) {
1045+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "sf " , & collation_name , & collation_name_len , & fci , & fcc ) == FAILURE ) {
10641046 RETURN_THROWS ();
10651047 }
10661048
@@ -1070,18 +1052,11 @@ PHP_METHOD(SQLite3, createCollation)
10701052 RETURN_FALSE ;
10711053 }
10721054
1073- if (!zend_is_callable (callback_func , 0 , NULL )) {
1074- zend_string * callback_name = zend_get_callable_name (callback_func );
1075- php_sqlite3_error (db_obj , "Not a valid callback function %s" , ZSTR_VAL (callback_name ));
1076- zend_string_release_ex (callback_name , 0 );
1077- RETURN_FALSE ;
1078- }
1079-
10801055 collation = (php_sqlite3_collation * )ecalloc (1 , sizeof (* collation ));
10811056 if (sqlite3_create_collation (db_obj -> db , collation_name , SQLITE_UTF8 , collation , php_sqlite3_callback_compare ) == SQLITE_OK ) {
10821057 collation -> collation_name = estrdup (collation_name );
10831058
1084- ZVAL_COPY (& collation -> cmp_func , callback_func );
1059+ ZVAL_COPY (& collation -> cmp_func , & fci . function_name );
10851060
10861061 collation -> next = db_obj -> collations ;
10871062 db_obj -> collations = collation ;
0 commit comments