projects
/
git.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Some more memory leak avoidance
[git.git]
/
object.c
diff --git
a/object.c
b/object.c
index
b5c0ecf
..
0f70890
100644
(file)
--- a/
object.c
+++ b/
object.c
@@
-9,7
+9,11
@@
struct object **objs;
static int nr_objs;
int obj_allocs;
static int nr_objs;
int obj_allocs;
-int track_object_refs = 1;
+const char *type_names[] = {
+ "none", "blob", "tree", "commit", "bad"
+};
+
+int track_object_refs = 0;
static int hashtable_index(const unsigned char *sha1)
{
static int hashtable_index(const unsigned char *sha1)
{
@@
-50,7
+54,7
@@
void created_object(const unsigned char *sha1, struct object *obj)
obj->parsed = 0;
memcpy(obj->sha1, sha1, 20);
obj->parsed = 0;
memcpy(obj->sha1, sha1, 20);
- obj->type =
NULL
;
+ obj->type =
TYPE_NONE
;
obj->refs = NULL;
obj->used = 0;
obj->refs = NULL;
obj->used = 0;
@@
-85,8
+89,7
@@
struct object_refs *alloc_object_refs(unsigned count)
struct object_refs *refs;
size_t size = sizeof(*refs) + count*sizeof(struct object *);
struct object_refs *refs;
size_t size = sizeof(*refs) + count*sizeof(struct object *);
- refs = xmalloc(size);
- memset(refs, 0, size);
+ refs = xcalloc(1, size);
refs->count = count;
return refs;
}
refs->count = count;
return refs;
}
@@
-178,10
+181,9
@@
struct object *lookup_unknown_object(const unsigned char *sha1)
{
struct object *obj = lookup_object(sha1);
if (!obj) {
{
struct object *obj = lookup_object(sha1);
if (!obj) {
- union any_object *ret = xmalloc(sizeof(*ret));
- memset(ret, 0, sizeof(*ret));
+ union any_object *ret = xcalloc(1, sizeof(*ret));
created_object(sha1, &ret->object);
created_object(sha1, &ret->object);
- ret->object.type =
NULL
;
+ ret->object.type =
TYPE_NONE
;
return &ret->object;
}
return obj;
return &ret->object;
}
return obj;
@@
-202,8
+204,11
@@
struct object *parse_object(const unsigned char *sha1)
obj = &blob->object;
} else if (!strcmp(type, tree_type)) {
struct tree *tree = lookup_tree(sha1);
obj = &blob->object;
} else if (!strcmp(type, tree_type)) {
struct tree *tree = lookup_tree(sha1);
- parse_tree_buffer(tree, buffer, size);
obj = &tree->object;
obj = &tree->object;
+ if (!tree->object.parsed) {
+ parse_tree_buffer(tree, buffer, size);
+ buffer = NULL;
+ }
} else if (!strcmp(type, commit_type)) {
struct commit *commit = lookup_commit(sha1);
parse_commit_buffer(commit, buffer, size);
} else if (!strcmp(type, commit_type)) {
struct commit *commit = lookup_commit(sha1);
parse_commit_buffer(commit, buffer, size);