@@ -933,28 +933,84 @@ static int php_git2_odb_backend_exists(git_odb_backend *backend, const git_oid *
933933 return !retval ;
934934
935935}
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+
936965static int php_git2_odb_backend_foreach (git_odb_backend * backend , git_odb_foreach_cb cb , void * data )
937966{
938967 php_git2_t * result ;
939968 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 ;
941970 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 ;
942974 int i = 0 , retval = 0 ;
943975 GIT2_TSRMLS_SET (p -> tsrm_ls );
944976
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+
9451000 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 );
9481003
9491004 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 )) {
9511006 return GIT_EUSER ;
9521007 }
9531008
9541009 retval = Z_LVAL_P (retval_ptr );
9551010 zval_ptr_dtor (& retval_ptr );
9561011 return retval ;
9571012}
1013+
9581014static void php_git2_odb_backend_free (git_odb_backend * _backend )
9591015{
9601016}
@@ -1012,7 +1068,6 @@ PHP_FUNCTION(git_odb_backend_new)
10121068 php_git2_fcall_info_wrapper2 (tmp , & foreach_fci , & foreach_fcc TSRMLS_CC );
10131069 }
10141070
1015-
10161071 Z_ADDREF_P (callbacks );
10171072 php_git2_multi_cb_init (& backend -> multi , callbacks TSRMLS_CC , 8 ,
10181073 & read_fci , & read_fcc ,
0 commit comments