path: root/pack-objects.h
diff options
authorNguyễn Thái Ngọc Duy <>2018-04-14 15:35:01 (GMT)
committerJunio C Hamano <>2018-04-16 03:38:58 (GMT)
commitfd9b1baef8a940c9c251995b006a3d96f210e639 (patch)
tree2f9bd735fc03a7fcd6c0626f4d4f6ba191511d21 /pack-objects.h
parent8d6ccce14fd1a5843f5c9b231d4dcb81f6ceeb25 (diff)
pack-objects: turn type and in_pack_type to bitfields
An extra field type_valid is added to carry the equivalent of OBJ_BAD in the original "type" field. in_pack_type always contains a valid type so we only need 3 bits for it. A note about accepting OBJ_NONE as "valid" type. The function read_object_list_from_stdin() can pass this value [1] and it eventually calls create_object_entry() where current code skip setting "type" field if the incoming type is zero. This does not have any bad side effects because "type" field should be memset()'d anyway. But since we also need to set type_valid now, skipping oe_set_type() leaves type_valid zero/false, which will make oe_type() return OBJ_BAD, not OBJ_NONE anymore. Apparently we do care about OBJ_NONE in prepare_pack(). This switch from OBJ_NONE to OBJ_BAD may trigger fatal: unable to get type of object ... Accepting OBJ_NONE [2] does sound wrong, but this is how it is has been for a very long time and I haven't time to dig in further. [1] See 5c49c11686 (pack-objects: better check_object() performances - 2007-04-16) [2] 21666f1aae (convert object type handling from a string to a number - 2007-02-26) Signed-off-by: Nguyễn Thái Ngọc Duy <> Signed-off-by: Junio C Hamano <>
Diffstat (limited to 'pack-objects.h')
1 files changed, 18 insertions, 2 deletions
diff --git a/pack-objects.h b/pack-objects.h
index c0a1f61..b4a83a6 100644
--- a/pack-objects.h
+++ b/pack-objects.h
@@ -59,8 +59,9 @@ struct object_entry {
void *delta_data; /* cached delta (uncompressed) */
unsigned long delta_size; /* delta data size (uncompressed) */
unsigned long z_delta_size; /* delta data size (compressed) */
- enum object_type type;
- enum object_type in_pack_type; /* could be delta */
+ unsigned type_:TYPE_BITS;
+ unsigned in_pack_type:TYPE_BITS; /* could be delta */
+ unsigned type_valid:1;
uint32_t hash; /* name hint hash */
unsigned int in_pack_pos;
unsigned char in_pack_header_size;
@@ -123,4 +124,19 @@ static inline uint32_t pack_name_hash(const char *name)
return hash;
+static inline enum object_type oe_type(const struct object_entry *e)
+ return e->type_valid ? e->type_ : OBJ_BAD;
+static inline void oe_set_type(struct object_entry *e,
+ enum object_type type)
+ if (type >= OBJ_ANY)
+ BUG("OBJ_ANY cannot be set in pack-objects code");
+ e->type_valid = type >= OBJ_NONE;
+ e->type_ = (unsigned)type;