Skip to content

Commit 6cbd97e

Browse files
committed
ok, now running without a crash
1 parent 34d4a4a commit 6cbd97e

File tree

5 files changed

+44
-17
lines changed

5 files changed

+44
-17
lines changed

git2_tests/000_base.php

+11
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,15 @@
3030
var_dump(bin2hex($tree->id()));
3131
var_dump($tree->entrycount());
3232

33+
$cb = function($root, $entry, &$data) {
34+
echo "$root => ".$entry->name()." ($data)\n";
35+
$data .= 'o';
36+
return 0;
37+
};
38+
$test = 'hello';
39+
40+
$tree->walk(Git2\Tree::WALK_POST, $cb, $test);
41+
42+
var_dump($test);
43+
3344

git2_tree.c

+9-8
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ GIT2_TREE_GET_LONG(entrycount)
8282

8383
struct git2_treewalk_payload {
8484
zval *this;
85-
zval **callback_data;
85+
zval *callback_data;
8686
zend_fcall_info callback_i;
8787
zend_fcall_info_cache callback_ic;
8888
};
@@ -94,26 +94,28 @@ static int git2_treewalk_cb(const char *root, const git_tree_entry *entry, void
9494
struct git2_treewalk_payload *p = payload;
9595

9696
ZVAL_STRING(&argv[0], root);
97-
git2_tree_entry_spawn(&argv[1], entry);
98-
ZVAL_COPY_VALUE(&argv[2], *p->callback_data);
97+
git2_tree_entry_spawn_ephemeral(&argv[1], entry);
98+
ZVAL_COPY_VALUE(&argv[2], p->callback_data);
9999

100100
p->callback_i.retval = &retval;
101101
p->callback_i.param_count = 3;
102102
p->callback_i.params = argv;
103103

104-
// TODO HERE
105104
error = zend_call_function(&p->callback_i, &p->callback_ic);
106105
if (error == FAILURE) {
107106
return -1; // causes end of walk
108107
} else if (!Z_ISUNDEF(retval)) {
109108
convert_to_long(&retval);
110109
error = Z_LVAL(retval);
111110
zval_ptr_dtor(&retval);
111+
} else {
112+
error = 0;
112113
}
113114

114115
zval_ptr_dtor(&argv[0]);
115-
zval_ptr_dtor(&argv[1]);
116-
zval_ptr_dtor(&argv[2]); // ?
116+
// zval_ptr_dtor(&argv[1]);
117+
// zval_ptr_dtor(&argv[2]); // ?
118+
return error;
117119
}
118120

119121
ZEND_BEGIN_ARG_INFO_EX(arginfo_tree_walk, 0, 0, 2)
@@ -124,11 +126,10 @@ ZEND_END_ARG_INFO()
124126

125127
static PHP_METHOD(Tree, walk) {
126128
long mode;
127-
zval **callback_data;
128129
struct git2_treewalk_payload p;
129130
p.this = getThis();
130131

131-
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lfZ", &mode, &p.callback_i, &p.callback_ic, &callback_data) != SUCCESS) {
132+
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lf|z", &mode, &p.callback_i, &p.callback_ic, &p.callback_data) != SUCCESS) {
132133
return;
133134
}
134135

git2_tree_entry.c

+13-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ static zend_object_handlers php_git2_tree_entry_handler;
77
typedef struct _git2_tree_entry_object {
88
zend_object std;
99
git_tree_entry *e;
10+
zend_bool readonly;
1011
} git2_tree_entry_object_t;
1112

1213
#define GIT2_TREE_ENTRY_FETCH() git2_tree_entry_object_t *intern = (git2_tree_entry_object_t*)Z_OBJ_P(getThis()); \
@@ -49,13 +50,24 @@ GIT2_TREE_ENTRY_GET_LONG(type)
4950
GIT2_TREE_ENTRY_GET_LONG(filemode)
5051
GIT2_TREE_ENTRY_GET_LONG(filemode_raw)
5152

53+
zend_object *php_git2_tree_entry_create_object(zend_class_entry *class_type TSRMLS_DC);
5254

5355
void git2_tree_entry_spawn(zval *return_value, git_tree_entry *e TSRMLS_DC) {
5456
git2_tree_entry_object_t *intern;
5557

5658
object_init_ex(return_value, php_git2_tree_entry_ce);
5759
intern = (git2_tree_entry_object_t*)Z_OBJ_P(return_value);
5860
intern->e = e;
61+
intern->readonly = 0;
62+
}
63+
64+
void git2_tree_entry_spawn_ephemeral(zval *return_value, const git_tree_entry *e TSRMLS_DC) {
65+
git2_tree_entry_object_t *intern;
66+
67+
object_init_ex(return_value, php_git2_tree_entry_ce);
68+
intern = (git2_tree_entry_object_t*)Z_OBJ_P(return_value);
69+
intern->e = e;
70+
intern->readonly = 1;
5971
}
6072

6173
zend_object *php_git2_tree_entry_create_object(zend_class_entry *class_type TSRMLS_DC) {
@@ -77,7 +89,7 @@ static void php_git2_tree_entry_free_object(zend_object *object TSRMLS_DC) {
7789

7890
zend_object_std_dtor(&intern->std TSRMLS_CC);
7991

80-
if (intern->e) {
92+
if ((intern->e) && (!intern->readonly)) {
8193
git_tree_entry_free(intern->e);
8294
intern->e = NULL;
8395
}

git2_tree_entry.h

+1
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@
44
void git2_tree_entry_init(TSRMLS_DC);
55

66
void git2_tree_entry_spawn(zval *return_value, git_tree_entry *e TSRMLS_DC);
7+
void git2_tree_entry_spawn_ephemeral(zval *return_value, const git_tree_entry *e TSRMLS_DC);
78

89
#endif /* GIT2_TREE_ENTRY_H */

php_git2.c

+10-8
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "git2_commit.h"
99
#include "git2_remote.h"
1010
#include "git2_tree.h"
11+
#include "git2_tree_entry.h"
1112

1213
static zend_class_entry *php_git2_base_ce;
1314
static zend_object_handlers php_git2_base_handler;
@@ -71,14 +72,15 @@ PHP_MINIT_FUNCTION(git2) {
7172
GIT2_BASE_CONST(OBJ_BLOB);
7273
GIT2_BASE_CONST(OBJ_ANY);
7374

74-
git2_exception_init(TSRMLS_CC);
75-
git2_repository_init(TSRMLS_CC);
76-
git2_config_init(TSRMLS_CC);
77-
git2_config_entry_init(TSRMLS_CC);
78-
git2_reference_init(TSRMLS_CC);
79-
git2_commit_init(TSRMLS_CC);
80-
git2_remote_init(TSRMLS_CC);
81-
git2_tree_init(TSRMLS_CC);
75+
git2_exception_init(TSRMLS_C);
76+
git2_repository_init(TSRMLS_C);
77+
git2_config_init(TSRMLS_C);
78+
git2_config_entry_init(TSRMLS_C);
79+
git2_reference_init(TSRMLS_C);
80+
git2_commit_init(TSRMLS_C);
81+
git2_remote_init(TSRMLS_C);
82+
git2_tree_init(TSRMLS_C);
83+
git2_tree_entry_init(TSRMLS_C);
8284

8385
return SUCCESS;
8486
}

0 commit comments

Comments
 (0)