1. 21 7月, 2017 1 次提交
  2. 17 6月, 2017 1 次提交
  3. 08 5月, 2017 6 次提交
    • B
      object: convert parse_object* to take struct object_id · c251c83d
      brian m. carlson 提交于
      Make parse_object, parse_object_or_die, and parse_object_buffer take a
      pointer to struct object_id.  Remove the temporary variables inserted
      earlier, since they are no longer necessary.  Transform all of the
      callers using the following semantic patch:
      
      @@
      expression E1;
      @@
      - parse_object(E1.hash)
      + parse_object(&E1)
      
      @@
      expression E1;
      @@
      - parse_object(E1->hash)
      + parse_object(E1)
      
      @@
      expression E1, E2;
      @@
      - parse_object_or_die(E1.hash, E2)
      + parse_object_or_die(&E1, E2)
      
      @@
      expression E1, E2;
      @@
      - parse_object_or_die(E1->hash, E2)
      + parse_object_or_die(E1, E2)
      
      @@
      expression E1, E2, E3, E4, E5;
      @@
      - parse_object_buffer(E1.hash, E2, E3, E4, E5)
      + parse_object_buffer(&E1, E2, E3, E4, E5)
      
      @@
      expression E1, E2, E3, E4, E5;
      @@
      - parse_object_buffer(E1->hash, E2, E3, E4, E5)
      + parse_object_buffer(E1, E2, E3, E4, E5)
      Signed-off-by: Nbrian m. carlson <sandals@crustytoothpaste.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      c251c83d
    • B
      Convert lookup_tag to struct object_id · d3101b53
      brian m. carlson 提交于
      Convert lookup_tag to take a pointer to struct object_id.
      Signed-off-by: Nbrian m. carlson <sandals@crustytoothpaste.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      d3101b53
    • B
      Convert lookup_tree to struct object_id · 740ee055
      brian m. carlson 提交于
      Convert the lookup_tree function to take a pointer to struct object_id.
      
      The commit was created with manual changes to tree.c, tree.h, and
      object.c, plus the following semantic patch:
      
      @@
      @@
      - lookup_tree(EMPTY_TREE_SHA1_BIN)
      + lookup_tree(&empty_tree_oid)
      
      @@
      expression E1;
      @@
      - lookup_tree(E1.hash)
      + lookup_tree(&E1)
      
      @@
      expression E1;
      @@
      - lookup_tree(E1->hash)
      + lookup_tree(E1)
      Signed-off-by: Nbrian m. carlson <sandals@crustytoothpaste.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      740ee055
    • B
      Convert lookup_blob to struct object_id · 3aca1fc6
      brian m. carlson 提交于
      Convert lookup_blob to take a pointer to struct object_id.
      
      The commit was created with manual changes to blob.c and blob.h, plus
      the following semantic patch:
      
      @@
      expression E1;
      @@
      - lookup_blob(E1.hash)
      + lookup_blob(&E1)
      
      @@
      expression E1;
      @@
      - lookup_blob(E1->hash)
      + lookup_blob(E1)
      Signed-off-by: Nbrian m. carlson <sandals@crustytoothpaste.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      3aca1fc6
    • B
      Convert remaining callers of lookup_blob to object_id · 3e930981
      brian m. carlson 提交于
      All but a few callers of lookup_blob have been converted to struct
      object_id.  Introduce a temporary, which will be removed later, into
      parse_object to ease the transition, and convert the remaining callers
      so that we can update lookup_blob to take struct object_id *.
      Signed-off-by: Nbrian m. carlson <sandals@crustytoothpaste.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      3e930981
    • B
      Convert lookup_commit* to struct object_id · bc83266a
      brian m. carlson 提交于
      Convert lookup_commit, lookup_commit_or_die,
      lookup_commit_reference, and lookup_commit_reference_gently to take
      struct object_id arguments.
      
      Introduce a temporary in parse_object buffer in order to convert this
      function.  This is required since in order to convert parse_object and
      parse_object_buffer, lookup_commit_reference_gently and
      lookup_commit_or_die would need to be converted.  Not introducing a
      temporary would therefore require that lookup_commit_or_die take a
      struct object_id *, but lookup_commit would take unsigned char *,
      leaving a confusing and hard-to-use interface.
      
      parse_object_buffer will lose this temporary in a later patch.
      
      This commit was created with manual changes to commit.c, commit.h, and
      object.c, plus the following semantic patch:
      
      @@
      expression E1, E2;
      @@
      - lookup_commit_reference_gently(E1.hash, E2)
      + lookup_commit_reference_gently(&E1, E2)
      
      @@
      expression E1, E2;
      @@
      - lookup_commit_reference_gently(E1->hash, E2)
      + lookup_commit_reference_gently(E1, E2)
      
      @@
      expression E1;
      @@
      - lookup_commit_reference(E1.hash)
      + lookup_commit_reference(&E1)
      
      @@
      expression E1;
      @@
      - lookup_commit_reference(E1->hash)
      + lookup_commit_reference(E1)
      
      @@
      expression E1;
      @@
      - lookup_commit(E1.hash)
      + lookup_commit(&E1)
      
      @@
      expression E1;
      @@
      - lookup_commit(E1->hash)
      + lookup_commit(E1)
      
      @@
      expression E1, E2;
      @@
      - lookup_commit_or_die(E1.hash, E2)
      + lookup_commit_or_die(&E1, E2)
      
      @@
      expression E1, E2;
      @@
      - lookup_commit_or_die(E1->hash, E2)
      + lookup_commit_or_die(E1, E2)
      Signed-off-by: Nbrian m. carlson <sandals@crustytoothpaste.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      bc83266a
  4. 31 1月, 2017 1 次提交
    • R
      use SWAP macro · 35d803bc
      René Scharfe 提交于
      Apply the semantic patch swap.cocci to convert hand-rolled swaps to use
      the macro SWAP.  The resulting code is shorter and easier to read, the
      object code is effectively unchanged.
      
      The patch for object.c had to be hand-edited in order to preserve the
      comment before the change; Coccinelle tried to eat it for some reason.
      Signed-off-by: NRene Scharfe <l.s.r@web.de>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      35d803bc
  5. 20 11月, 2015 3 次提交
  6. 18 4月, 2015 1 次提交
  7. 20 10月, 2014 1 次提交
  8. 17 10月, 2014 3 次提交
    • J
      make add_object_array_with_context interface more sane · 9e0c3c4f
      Jeff King 提交于
      When you resolve a sha1, you can optionally keep any context
      found during the resolution, including the path and mode of
      a tree entry (e.g., when looking up "HEAD:subdir/file.c").
      
      The add_object_array_with_context function lets you then
      attach that context to an entry in a list. Unfortunately,
      the interface for doing so is horrible. The object_context
      structure is large and most object_array users do not use
      it. Therefore we keep a pointer to the structure to avoid
      burdening other users too much. But that means when we do
      use it that we must allocate the struct ourselves. And the
      struct contains a fixed PATH_MAX-sized buffer, which makes
      this wholly unsuitable for any large arrays.
      
      We can observe that there is only a single user of the
      "with_context" variant: builtin/grep.c. And in that use
      case, the only element we care about is the path. We can
      therefore store only the path as a pointer (the context's
      mode field was redundant with the object_array_entry itself,
      and nobody actually cared about the surrounding tree). This
      still requires a strdup of the pathname, but at least we are
      only consuming the minimum amount of memory for each string.
      
      We can also handle the copying ourselves in
      add_object_array_*, and free it as appropriate in
      object_array_release_entry.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      9e0c3c4f
    • J
      object_array: add a "clear" function · 46be8231
      Jeff King 提交于
      There's currently no easy way to free the memory associated
      with an object_array (and in most cases, we simply leak the
      memory in a rev_info's pending array). Let's provide a
      helper to make this easier to handle.
      
      We can make use of it in list-objects.c, which does the same
      thing by hand (but fails to free the "name" field of each
      entry, potentially leaking memory).
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      46be8231
    • J
      object_array: factor out slopbuf-freeing logic · 68f49235
      Jeff King 提交于
      This is not a lot of code, but it's a logical construct that
      should not need to be repeated (and we are about to add a
      third repetition).
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      68f49235
  9. 19 9月, 2014 1 次提交
  10. 11 9月, 2014 1 次提交
  11. 29 7月, 2014 4 次提交
    • J
      object_as_type: set commit index · 34dfe197
      Jeff King 提交于
      The point of the "index" field of struct commit is that
      every allocated commit would have one. It is supposed to be
      an invariant that whenever object->type is set to
      OBJ_COMMIT, we have a unique index.
      
      Commit 969eba63 (commit: push commit_index update into
      alloc_commit_node, 2014-06-10) covered this case for
      newly-allocated commits. However, we may also allocate an
      "unknown" object via lookup_unknown_object, and only later
      convert it to a commit. We must make sure that we set the
      commit index when we switch the type field.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      34dfe197
    • J
      add object_as_type helper for casting objects · c4ad00f8
      Jeff King 提交于
      When we call lookup_commit, lookup_tree, etc, the logic goes
      something like:
      
        1. Look for an existing object struct. If we don't have
           one, allocate and return a new one.
      
        2. Double check that any object we have is the expected
           type (and complain and return NULL otherwise).
      
        3. Convert an object with type OBJ_NONE (from a prior
           call to lookup_unknown_object) to the expected type.
      
      We can encapsulate steps 2 and 3 in a helper function which
      checks whether we have the expected object type, converts
      OBJ_NONE as appropriate, and returns the object.
      
      Not only does this shorten the code, but it also provides
      one central location for converting OBJ_NONE objects into
      objects of other types. Future patches will use that to
      enforce type-specific invariants.
      
      Since this is a refactoring, we would want it to behave
      exactly as the current code. It takes a little reasoning to
      see that this is the case:
      
        - for lookup_{commit,tree,etc} functions, we are just
          pulling steps 2 and 3 into a function that does the same
          thing.
      
        - for the call in peel_object, we currently only do step 3
          (but we want to consolidate it with the others, as
          mentioned above). However, step 2 is a noop here, as the
          surrounding conditional makes sure we have OBJ_NONE
          (which we want to keep to avoid an extraneous call to
          sha1_object_info).
      
        - for the call in lookup_commit_reference_gently, we are
          currently doing step 2 but not step 3. However, step 3
          is a noop here. The object we got will have just come
          from deref_tag, which must have figured out the type for
          each object in order to know when to stop peeling.
          Therefore the type will never be OBJ_NONE.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      c4ad00f8
    • J
      parse_object_buffer: do not set object type · fe0444b5
      Jeff King 提交于
      The only way that "obj" can be non-NULL is if it came from
      one of the lookup_* functions. These functions always ensure
      that the object has the expected type (and return NULL
      otherwise), so there is no need for us to set the type.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      fe0444b5
    • J
      move setting of object->type to alloc_* functions · fe24d396
      Jeff King 提交于
      The "struct object" type implements basic object
      polymorphism.  Individual instances are allocated as
      concrete types (or as a union type that can store any
      object), and a "struct object *" can be cast into its real
      type after examining its "type" enum.  This means it is
      dangerous to have a type field that does not match the
      allocation (e.g., setting the type field of a "struct blob"
      to "OBJ_COMMIT" would mean that a reader might read past the
      allocated memory).
      
      In most of the current code this is not a problem; the first
      thing we do after allocating an object is usually to set its
      type field by passing it to create_object. However, the
      virtual commits we create in merge-recursive.c do not ever
      get their type set. This does not seem to have caused
      problems in practice, though (presumably because we always
      pass around a "struct commit" pointer and never even look at
      the type).
      
      We can fix this oversight and also make it harder for future
      code to get it wrong by setting the type directly in the
      object allocation functions.
      
      This will also make it easier to fix problems with commit
      index allocation, as we know that any object allocated by
      alloc_commit_node will meet the invariant that an object
      with an OBJ_COMMIT type field will have a unique index
      number.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      fe24d396
  12. 14 7月, 2014 4 次提交
    • J
      object_as_type: set commit index · d66bebcb
      Jeff King 提交于
      The point of the "index" field of struct commit is that
      every allocated commit would have one. It is supposed to be
      an invariant that whenever object->type is set to
      OBJ_COMMIT, we have a unique index.
      
      Commit 969eba63 (commit: push commit_index update into
      alloc_commit_node, 2014-06-10) covered this case for
      newly-allocated commits. However, we may also allocate an
      "unknown" object via lookup_unknown_object, and only later
      convert it to a commit. We must make sure that we set the
      commit index when we switch the type field.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      d66bebcb
    • J
      add object_as_type helper for casting objects · 8ff226a9
      Jeff King 提交于
      When we call lookup_commit, lookup_tree, etc, the logic goes
      something like:
      
        1. Look for an existing object struct. If we don't have
           one, allocate and return a new one.
      
        2. Double check that any object we have is the expected
           type (and complain and return NULL otherwise).
      
        3. Convert an object with type OBJ_NONE (from a prior
           call to lookup_unknown_object) to the expected type.
      
      We can encapsulate steps 2 and 3 in a helper function which
      checks whether we have the expected object type, converts
      OBJ_NONE as appropriate, and returns the object.
      
      Not only does this shorten the code, but it also provides
      one central location for converting OBJ_NONE objects into
      objects of other types. Future patches will use that to
      enforce type-specific invariants.
      
      Since this is a refactoring, we would want it to behave
      exactly as the current code. It takes a little reasoning to
      see that this is the case:
      
        - for lookup_{commit,tree,etc} functions, we are just
          pulling steps 2 and 3 into a function that does the same
          thing.
      
        - for the call in peel_object, we currently only do step 3
          (but we want to consolidate it with the others, as
          mentioned above). However, step 2 is a noop here, as the
          surrounding conditional makes sure we have OBJ_NONE
          (which we want to keep to avoid an extraneous call to
          sha1_object_info).
      
        - for the call in lookup_commit_reference_gently, we are
          currently doing step 2 but not step 3. However, step 3
          is a noop here. The object we got will have just come
          from deref_tag, which must have figured out the type for
          each object in order to know when to stop peeling.
          Therefore the type will never be OBJ_NONE.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      8ff226a9
    • J
      parse_object_buffer: do not set object type · 5af01caa
      Jeff King 提交于
      The only way that "obj" can be non-NULL is if it came from
      one of the lookup_* functions. These functions always ensure
      that the object has the expected type (and return NULL
      otherwise), so there is no need for us to set the type.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      5af01caa
    • J
      move setting of object->type to alloc_* functions · d36f51c1
      Jeff King 提交于
      The "struct object" type implements basic object
      polymorphism.  Individual instances are allocated as
      concrete types (or as a union type that can store any
      object), and a "struct object *" can be cast into its real
      type after examining its "type" enum.  This means it is
      dangerous to have a type field that does not match the
      allocation (e.g., setting the type field of a "struct blob"
      to "OBJ_COMMIT" would mean that a reader might read past the
      allocated memory).
      
      In most of the current code this is not a problem; the first
      thing we do after allocating an object is usually to set its
      type field by passing it to create_object. However, the
      virtual commits we create in merge-recursive.c do not ever
      get their type set. This does not seem to have caused
      problems in practice, though (presumably because we always
      pass around a "struct commit" pointer and never even look at
      the type).
      
      We can fix this oversight and also make it harder for future
      code to get it wrong by setting the type directly in the
      object allocation functions.
      
      This will also make it easier to fix problems with commit
      index allocation, as we know that any object allocated by
      alloc_commit_node will meet the invariant that an object
      with an OBJ_COMMIT type field will have a unique index
      number.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      d36f51c1
  13. 08 7月, 2014 1 次提交
  14. 14 6月, 2014 3 次提交
    • J
      commit: record buffer length in cache · 8597ea3a
      Jeff King 提交于
      Most callsites which use the commit buffer try to use the
      cached version attached to the commit, rather than
      re-reading from disk. Unfortunately, that interface provides
      only a pointer to the NUL-terminated buffer, with no
      indication of the original length.
      
      For the most part, this doesn't matter. People do not put
      NULs in their commit messages, and the log code is happy to
      treat it all as a NUL-terminated string. However, some code
      paths do care. For example, when checking signatures, we
      want to be very careful that we verify all the bytes to
      avoid malicious trickery.
      
      This patch just adds an optional "size" out-pointer to
      get_commit_buffer and friends. The existing callers all pass
      NULL (there did not seem to be any obvious sites where we
      could avoid an immediate strlen() call, though perhaps with
      some further refactoring we could).
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      8597ea3a
    • J
      use get_cached_commit_buffer where appropriate · a97934d8
      Jeff King 提交于
      Some call sites check commit->buffer to see whether we have
      a cached buffer, and if so, do some work with it. In the
      long run we may want to switch these code paths to make
      their decision on a different boolean flag (because checking
      the cache may get a little more expensive in the future).
      But for now, we can easily support them by converting the
      calls to use get_cached_commit_buffer.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      a97934d8
    • J
      provide a helper to set the commit buffer · 66c2827e
      Jeff King 提交于
      Right now this is just a one-liner, but abstracting it will
      make it easier to change later.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      66c2827e
  15. 01 3月, 2014 1 次提交
  16. 12 9月, 2013 1 次提交
  17. 18 7月, 2013 1 次提交
    • S
      parse_object_buffer: correct freeing the buffer · 8e92e8f2
      Stefan Beller 提交于
      If we exit early in the function parse_object_buffer, we did not
      write to *eaten_p. Then the calling function parse_object, which looks
      like the following with respect to the eaten variable, cannot rely on a
      proper value set in eaten, hence the freeing of the buffer depends
      on random values in memory.
      
      	struct object *parse_object(const unsigned char *sha1)
      	{
      		int eaten;
      		...
      		obj = parse_object_buffer(sha1, type, size, buffer, &eaten);
      		if (!eaten)
      			free(buffer);
      	}
      
      This change makes sure, the buffer freeing condition is deterministic.
      Signed-off-by: NStefan Beller <stefanbeller@googlemail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      8e92e8f2
  18. 03 6月, 2013 1 次提交
    • M
      object_array_entry: fix memory handling of the name field · 31faeb20
      Michael Haggerty 提交于
      Previously, the memory management of the object_array_entry::name
      field was inconsistent and undocumented.  object_array_entries are
      ultimately created by a single function, add_object_array_with_mode(),
      which has an argument "const char *name".  This function used to
      simply set the name field to reference the string pointed to by the
      name parameter, and nobody on the object_array side ever freed the
      memory.  Thus, it assumed that the memory for the name field would be
      managed by the caller, and that the lifetime of that string would be
      at least as long as the lifetime of the object_array_entry.  But
      callers were inconsistent:
      
      * Some passed pointers to constant strings or argv entries, which was
        OK.
      
      * Some passed pointers to newly-allocated memory, but didn't arrange
        for the memory ever to be freed.
      
      * Some passed the return value of sha1_to_hex(), which is a pointer to
        a statically-allocated buffer that can be overwritten at any time.
      
      * Some passed pointers to refnames that they received from a
        for_each_ref()-type iteration, but the lifetimes of such refnames is
        not guaranteed by the refs API.
      
      Bring consistency to this mess by changing object_array to make its
      own copy for the object_array_entry::name field and free this memory
      when an object_array_entry is deleted from the array.
      
      Many callers were passing the empty string as the name parameter, so
      as a performance optimization, treat the empty string specially.
      Instead of making a copy, store a pointer to a statically-allocated
      empty string to object_array_entry::name.  When deleting such an
      entry, skip the free().
      
      Change the callers that were already passing copies to
      add_object_array_with_mode() to either skip the copy, or (if the
      memory needed to be allocated anyway) freeing the memory itself.
      
      A part of this commit effectively reverts
      
          70d26c6e read_revisions_from_stdin: make copies for handle_revision_arg
      
      because the copying introduced by that commit (which is still
      necessary) is now done at a deeper level.
      Signed-off-by: NMichael Haggerty <mhagger@alum.mit.edu>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      31faeb20
  19. 29 5月, 2013 2 次提交
  20. 11 5月, 2013 1 次提交
  21. 02 5月, 2013 1 次提交
    • J
      lookup_object: prioritize recently found objects · 9a414486
      Jeff King 提交于
      The lookup_object function is backed by a hash table of all
      objects we have seen in the program. We manage collisions
      with a linear walk over the colliding entries, checking each
      with hashcmp(). The main cost of lookup is in these
      hashcmp() calls; finding our item in the first slot is
      cheaper than finding it in the second slot, which is cheaper
      than the third, and so on.
      
      If we assume that there is some locality to the object
      lookups (e.g., if X and Y collide, and we have just looked
      up X, the next lookup is more likely to be for X than for
      Y), then we can improve our average lookup speed by checking
      X before Y.
      
      This patch does so by swapping a found item to the front of
      the collision chain. The p0001 perf test reveals that this
      does indeed exploit locality in the case of "rev-list --all
      --objects":
      
      Test                               origin          this tree
      -------------------------------------------------------------------------
      0001.1: rev-list --all             0.40(0.38+0.02) 0.40(0.36+0.03) +0.0%
      0001.2: rev-list --all --objects   2.24(2.17+0.05) 1.86(1.79+0.05) -17.0%
      
      This is not surprising, as the full object traversal will
      hit the same tree entries over and over (e.g., for every
      commit that doesn't change "Documentation/", we will have to
      look up the same sha1 just to find out that we already
      processed it).
      
      The reason why this technique works (and does not violate
      any properties of the hash table) is subtle and bears some
      explanation. Let's imagine we get a lookup for sha1 `X`, and
      it hashes to bucket `i` in our table. That stretch of the
      table may look like:
      
      index       | i-1 |  i  | i+1 | i+2 |
             -----------------------------------
      entry   ... |  A  |  B  |  C  |  X  | ...
             -----------------------------------
      
      We start our probe at i, see that B does not match, nor does
      C, and finally find X. There may be multiple C's in the
      middle, but we know that there are no empty slots (or else
      we would not find X at all).
      
      We do not know the original index of B; it may be `i`, or it
      may be less than i (e.g., if it were `i-1`, it would collide
      with A and spill over into the `i` bucket). So it is
      acceptable for us to move it to the right of a contiguous
      stretch of entries (because we will find it from a linear
      walk starting anywhere at `i` or before), but never to the
      left (if we moved it to `i-1`, we would miss it when
      starting our walk at `i`).
      
      We do know the original index of X; it is `i`, so it is safe
      to place it anywhere in the contiguous stretch between `i`
      and where we found it (`i+2` in the this case).
      
      This patch does a pure swap; after finding X in the
      situation above, we would end with:
      
      index       | i-1 |  i  | i+1 | i+2 |
             -----------------------------------
      entry   ... |  A  |  X  |  C  |  B  | ...
             -----------------------------------
      
      We could instead bump X into the `i` slot, and then shift
      the whole contiguous chain down by one, resulting in:
      
      index       | i-1 |  i  | i+1 | i+2 |
             -----------------------------------
      entry   ... |  A  |  X  |  B  |  C  | ...
             -----------------------------------
      
      That puts our chain in true most-recently-used order.
      However, experiments show that it is not any faster (and in
      fact, is slightly slower due to the extra manipulation).
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      9a414486
  22. 18 3月, 2013 1 次提交
    • J
      avoid segfaults on parse_object failure · 75a95490
      Jeff King 提交于
      Many call-sites of parse_object assume that they will get a
      non-NULL return value; this is not the case if we encounter
      an error while parsing the object.
      
      This patch adds a wrapper function around parse_object that
      handles dying automatically, and uses it anywhere we
      immediately try to access the return value as a non-NULL
      pointer (i.e., anywhere that we would currently segfault).
      
      This wrapper may also be useful in other places. The most
      obvious one is code like:
      
        o = parse_object(sha1);
        if (!o)
      	  die(...);
      
      However, these should not be mechanically converted to
      parse_object_or_die, as the die message is sometimes
      customized. Later patches can address these sites on a
      case-by-case basis.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      75a95490