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
c9ca481
..
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;
@@
-196,15
+198,18
@@
struct object *parse_object(const unsigned char *sha1)
struct object *obj;
if (check_sha1_signature(sha1, buffer, size, type) < 0)
printf("sha1 mismatch %s\n", sha1_to_hex(sha1));
struct object *obj;
if (check_sha1_signature(sha1, buffer, size, type) < 0)
printf("sha1 mismatch %s\n", sha1_to_hex(sha1));
- if (!strcmp(type,
"blob"
)) {
+ if (!strcmp(type,
blob_type
)) {
struct blob *blob = lookup_blob(sha1);
parse_blob_buffer(blob, buffer, size);
obj = &blob->object;
struct blob *blob = lookup_blob(sha1);
parse_blob_buffer(blob, buffer, size);
obj = &blob->object;
- } else if (!strcmp(type,
"tree"
)) {
+ } else if (!strcmp(type,
tree_type
)) {
struct tree *tree = lookup_tree(sha1);
struct tree *tree = lookup_tree(sha1);
- parse_tree_buffer(tree, buffer, size);
obj = &tree->object;
obj = &tree->object;
- } else if (!strcmp(type, "commit")) {
+ 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);
if (!commit->buffer) {
struct commit *commit = lookup_commit(sha1);
parse_commit_buffer(commit, buffer, size);
if (!commit->buffer) {
@@
-212,7
+217,7
@@
struct object *parse_object(const unsigned char *sha1)
buffer = NULL;
}
obj = &commit->object;
buffer = NULL;
}
obj = &commit->object;
- } else if (!strcmp(type,
"tag"
)) {
+ } else if (!strcmp(type,
tag_type
)) {
struct tag *tag = lookup_tag(sha1);
parse_tag_buffer(tag, buffer, size);
obj = &tag->object;
struct tag *tag = lookup_tag(sha1);
parse_tag_buffer(tag, buffer, size);
obj = &tag->object;