@@ -84,6 +84,16 @@ public function isSavior()
84
84
}
85
85
}
86
86
87
+ public function isCallbacker ()
88
+ {
89
+ foreach ($ this ->args as $ arg ) {
90
+ if (preg_match ("/_cb$/ " , $ arg ->getType ())) {
91
+ return true ;
92
+ }
93
+ }
94
+ return false ;
95
+ }
96
+
87
97
public function getArguments ()
88
98
{
89
99
return $ this ->args ;
@@ -137,6 +147,11 @@ public function getType()
137
147
return $ this ->type ;
138
148
}
139
149
150
+ public function isCallback ()
151
+ {
152
+ return preg_match ("/_cb$/ " , $ this ->type );
153
+ }
154
+
140
155
public function getPtr ()
141
156
{
142
157
return str_repeat ("* " , $ this ->ptr - 1 );
@@ -164,6 +179,8 @@ public function getZendType()
164
179
return "char " ;
165
180
} else if (preg_match ("/^git_/ " , $ this ->type )) {
166
181
return "zval " ;
182
+ } else if (preg_match ("/payload/ " , $ this ->name )) {
183
+ return "zval " ;
167
184
} else {
168
185
error_log (sprintf ("%s (zendtype) " , $ this ->type ));
169
186
}
@@ -360,6 +377,7 @@ public function shouldResource(Arg $arg)
360
377
"git_filter_source " ,
361
378
"git_diff_line " ,
362
379
"git_reference_iterator " ,
380
+ "git_config_iterator " ,
363
381
);
364
382
}
365
383
@@ -425,6 +443,8 @@ public function generateProto(Printer $printer, Func $f)
425
443
$ printer ->put ("array " );
426
444
} else if (preg_match ("/(git_strarray)/ " , $ arg ->getType ())) {
427
445
$ printer ->put ("array " );
446
+ } else if (preg_match ("/_cb$/ " , $ arg ->getType ())) {
447
+ $ printer ->put ("Callable " );
428
448
} else {
429
449
error_log (sprintf ("# unknown type (%s) " , $ arg ->getType ()));
430
450
}
@@ -551,6 +571,20 @@ public function generateDeclarations(Printer $printer, Func $f)
551
571
"value " => "NULL " ,
552
572
);
553
573
}
574
+ if ($ f ->isCallbacker ()) {
575
+ $ tables ["zend_fcall_info " ][] = array (
576
+ "name " => "fci " ,
577
+ "value " => "empty_fcall_info " ,
578
+ );
579
+ $ tables ["zend_fcall_info_cache " ][] = array (
580
+ "name " => "fcc " ,
581
+ "value " => "empty_fcall_info_cache " ,
582
+ );
583
+ $ tables ["php_git2_cb_t " ][] = array (
584
+ "name " => "*cb " ,
585
+ "value " => "NULL " ,
586
+ );
587
+ }
554
588
555
589
556
590
foreach ($ tables as $ type => $ values ) {
@@ -594,6 +628,10 @@ public function generateParse(Printer $printer, Func $f)
594
628
$ printer ->put ("a " );
595
629
} else if ($ this ->shouldResource ($ arg )) {
596
630
$ printer ->put ("r " );
631
+ } else if ($ arg ->isCallback ()) {
632
+ $ printer ->put ("f " );
633
+ } else if ($ f ->isCallbacker () && preg_match ("/payload/ " , $ arg ->getName ())) {
634
+ $ printer ->put ("z " );
597
635
} else {
598
636
$ printer ->put ("< {$ arg ->getType ()}> " );
599
637
}
@@ -612,7 +650,12 @@ public function generateParse(Printer $printer, Func $f)
612
650
continue ;
613
651
}
614
652
615
- $ printer ->put ("&`name` " , "name " , $ arg ->getName ());
653
+ if ($ arg ->isCallback ()) {
654
+ $ printer ->put ("&fci, " );
655
+ $ printer ->put ("&fcc " );
656
+ } else {
657
+ $ printer ->put ("&`name` " , "name " , $ arg ->getName ());
658
+ }
616
659
if (preg_match ("/char/ " , $ arg ->getZendType ())) {
617
660
$ printer ->put (", " );
618
661
$ printer ->put ("&`name`_len " , "name " , $ arg ->getName ());
@@ -648,26 +691,45 @@ public function generateFetchResourceIfNeeded(Printer $printer, Func $f)
648
691
}
649
692
}
650
693
651
- public function generateOidTranslation (Printer $ printer , Func $ f )
652
- {
653
- foreach ($ f ->getArguments () as $ arg ) {
654
- /** @var Arg $arg */
655
- if ($ arg ->getType () == "git_oid " ) {
656
- $ printer ->put ("if (git_oid_fromstrn(&__`name`, `name`, `name`_len)) { \n" ,
657
- "name " , $ arg ->getName ()
658
- );
659
- $ printer ->block (function (Printer $ printer ) use ($ arg ) {
660
- $ printer ->put ("RETURN_FALSE; \n" );
661
- });
662
- $ printer ->put ("} \n" );
663
- $ arg ->setName ("__ " . $ arg ->getName ());
664
- }
694
+ public function generateOidTranslation (Printer $ printer , Func $ f )
695
+ {
696
+ foreach ($ f ->getArguments () as $ arg ) {
697
+ /** @var Arg $arg */
698
+ if ($ arg ->getType () == "git_oid " ) {
699
+ $ printer ->put ("if (git_oid_fromstrn(&__`name`, `name`, `name`_len)) { \n" ,
700
+ "name " , $ arg ->getName ()
701
+ );
702
+ $ printer ->block (function (Printer $ printer ) use ($ arg ) {
703
+ $ printer ->put ("RETURN_FALSE; \n" );
704
+ });
705
+ $ printer ->put ("} \n" );
706
+ $ arg ->setName ("__ " . $ arg ->getName ());
665
707
}
666
708
}
709
+ }
710
+
711
+ public function generateCallbackInit (Printer $ printer , Func $ f )
712
+ {
713
+ if ($ f ->isCallbacker ()) {
714
+ $ printer ->put ("if (php_git2_cb_init(&cb, &fci, &fcc, payload TSRMLS_CC)) { \n" );
715
+ $ printer ->block (function (Printer $ printer ) {
716
+ $ printer ->put ("RETURN_FALSE; \n" );
717
+ });
718
+ $ printer ->put ("} \n" );
719
+ }
720
+ }
721
+
722
+ public function generateCallbackFree (Printer $ printer , Func $ f )
723
+ {
724
+ if ($ f ->isCallbacker ()) {
725
+ $ printer ->put ("php_git2_cb_free(cb); \n" );
726
+ }
727
+ }
667
728
668
729
public function generateFunctionCall (Printer $ printer , Func $ f )
669
730
{
670
731
$ this ->generateOidTranslation ($ printer , $ f );
732
+ $ this ->generateCallbackInit ($ printer , $ f );
671
733
if ($ f ->getReturnType () == "int " && $ f ->isResourceCreator ()) {
672
734
$ printer ->put ("error = `function` " ,
673
735
"function " , $ f ->getName ()
@@ -801,6 +863,10 @@ public function generateFunctionCall(Printer $printer, Func $f)
801
863
);
802
864
} else if ($ arg ->shouldWrite ()) {
803
865
$ printer ->put ("&`name` " , "name " , $ arg ->getName ());
866
+ } else if ($ arg ->isCallback ()) {
867
+ $ printer ->put ("<CHANGEME> " );
868
+ } else if (preg_match ("/payload/ " , $ arg ->getName ())) {
869
+ $ printer ->put ("cb " );
804
870
} else {
805
871
$ printer ->put ("`name` " , "name " , $ arg ->getName ());
806
872
}
@@ -812,6 +878,7 @@ public function generateFunctionCall(Printer $printer, Func $f)
812
878
}
813
879
$ printer ->put ("); \n" );
814
880
881
+ $ this ->generateCallbackFree ($ printer , $ f );
815
882
if (preg_match ("/_is_/ " , $ f ->getName ())) {
816
883
$ printer ->put ("RETURN_BOOL(`name`); \n" , "name " , "result " );
817
884
} else {
0 commit comments