@@ -933,28 +933,84 @@ static int php_git2_odb_backend_exists(git_odb_backend *backend, const git_oid *
933
933
return !retval ;
934
934
935
935
}
936
+
937
+ static const zend_arg_info arginfo_git_odb_backend_foreach_callback [] = {
938
+ ZEND_ARG_INFO (0 , oid )
939
+ ZEND_ARG_INFO (1 , payload )
940
+ };
941
+
942
+ static void git_ex_cb (INTERNAL_FUNCTION_PARAMETERS )
943
+ {
944
+ zval * payload , * this = getThis ();
945
+ php_git2_odb_backend_foreach_callback * _callback ;
946
+ char * oid ;
947
+ int oid_len , retval = 0 ;
948
+ git_oid _oid ;
949
+
950
+ if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC ,
951
+ "sz" , & oid , & oid_len , & payload ) == FAILURE ) {
952
+ return ;
953
+ }
954
+
955
+ if (git_oid_fromstrn (& _oid , oid , oid_len ) != GIT_OK ) {
956
+ return ;
957
+ }
958
+
959
+ _callback = (php_git2_odb_backend_foreach_callback * )zend_object_store_get_object (this TSRMLS_CC );
960
+ _callback -> payload -> payload = payload ;
961
+ retval = _callback -> callback (& _oid , _callback -> payload );
962
+ RETURN_LONG (retval );
963
+ }
964
+
936
965
static int php_git2_odb_backend_foreach (git_odb_backend * backend , git_odb_foreach_cb cb , void * data )
937
966
{
938
967
php_git2_t * result ;
939
968
php_git2_odb_backend * php_backend = (php_git2_odb_backend * )backend ;
940
- zval * param_callback = NULL , * retval_ptr = NULL , * param_payload = (zval * )data ;
969
+ zval * param_callback = NULL , * callback = NULL , * retval_ptr = NULL , * param_payload = (zval * )data ;
941
970
php_git2_multi_cb_t * p = php_backend -> multi ;
971
+ zend_function function = {0 };
972
+ php_git2_odb_backend_foreach_callback * _callback ;
973
+ php_git2_cb_t * __cb = (php_git2_cb_t * )data ;
942
974
int i = 0 , retval = 0 ;
943
975
GIT2_TSRMLS_SET (p -> tsrm_ls );
944
976
977
+ MAKE_STD_ZVAL (callback );
978
+ object_init_ex (callback , php_git2_odb_backend_foreach_callback_class_entry );
979
+ _callback = (php_git2_odb_backend_foreach_callback * )zend_object_store_get_object (callback TSRMLS_CC );
980
+ _callback -> callback = cb ;
981
+ _callback -> payload = __cb ;
982
+ Z_ADDREF_P (callback );
983
+
984
+ function .type = ZEND_INTERNAL_FUNCTION ;
985
+ function .common .function_name = "callback" ;
986
+ function .common .fn_flags = ZEND_ACC_CLOSURE ;
987
+ function .common .num_args = 2 ;
988
+ function .common .required_num_args = 2 ;
989
+ function .common .arg_info = & arginfo_git_odb_backend_foreach_callback ;
990
+ function .common .scope = php_git2_odb_backend_foreach_callback_class_entry ;
991
+ function .internal_function .type = ZEND_INTERNAL_FUNCTION ;
992
+ function .internal_function .scope = php_git2_odb_backend_foreach_callback_class_entry ;
993
+ function .internal_function .fn_flags = ZEND_ACC_CLOSURE ;
994
+ function .internal_function .handler = git_ex_cb ;
995
+ function .internal_function .module = & git2_module_entry ;
996
+ function .internal_function .num_args = 2 ;
997
+ function .internal_function .required_num_args = 2 ;
998
+ function .internal_function .arg_info = & arginfo_git_odb_backend_foreach_callback ;
999
+
945
1000
MAKE_STD_ZVAL (param_callback );
946
- // TODO(chobie): wrap git_odb_foreach_cb with closure
947
- // see zend_create_closure
1001
+ zend_create_closure ( param_callback , & function , php_git2_odb_backend_foreach_callback_class_entry , callback TSRMLS_CC );
1002
+ Z_ADDREF_P ( __cb -> payload );
948
1003
949
1004
if (php_git2_call_function_v (& p -> callbacks [6 ].fci , & p -> callbacks [6 ].fcc TSRMLS_CC , & retval_ptr , 2 ,
950
- & param_callback , & param_payload )) {
1005
+ & param_callback , & __cb -> payload )) {
951
1006
return GIT_EUSER ;
952
1007
}
953
1008
954
1009
retval = Z_LVAL_P (retval_ptr );
955
1010
zval_ptr_dtor (& retval_ptr );
956
1011
return retval ;
957
1012
}
1013
+
958
1014
static void php_git2_odb_backend_free (git_odb_backend * _backend )
959
1015
{
960
1016
}
@@ -1012,7 +1068,6 @@ PHP_FUNCTION(git_odb_backend_new)
1012
1068
php_git2_fcall_info_wrapper2 (tmp , & foreach_fci , & foreach_fcc TSRMLS_CC );
1013
1069
}
1014
1070
1015
-
1016
1071
Z_ADDREF_P (callbacks );
1017
1072
php_git2_multi_cb_init (& backend -> multi , callbacks TSRMLS_CC , 8 ,
1018
1073
& read_fci , & read_fcc ,
0 commit comments