Commit 73028af85c11bd947184a73c1e2d7902819695b2

Patrick Steinhardt 2017-01-27T14:20:24

khash: avoid using macro magic to get return address

diff --git a/src/attr.c b/src/attr.c
index 93dea12..4023526 100644
--- a/src/attr.c
+++ b/src/attr.c
@@ -209,7 +209,7 @@ int git_attr_foreach(
 				if (git_strmap_exists(seen, assign->name))
 					continue;
 
-				git_strmap_insert(seen, assign->name, assign, error);
+				git_strmap_insert(seen, assign->name, assign, &error);
 				if (error < 0)
 					goto cleanup;
 
diff --git a/src/attrcache.c b/src/attrcache.c
index cf0707e..8860d77 100644
--- a/src/attrcache.c
+++ b/src/attrcache.c
@@ -82,7 +82,7 @@ static int attr_cache_make_entry(
 		&entry, git_repository_workdir(repo), path, &cache->pool);
 
 	if (!error) {
-		git_strmap_insert(cache->files, entry->path, entry, error);
+		git_strmap_insert(cache->files, entry->path, entry, &error);
 		if (error > 0)
 			error = 0;
 	}
@@ -435,7 +435,7 @@ int git_attr_cache__insert_macro(git_repository *repo, git_attr_rule *macro)
 		giterr_set(GITERR_OS, "unable to get attr cache lock");
 		error = -1;
 	} else {
-		git_strmap_insert(macros, macro->match.pattern, macro, error);
+		git_strmap_insert(macros, macro->match.pattern, macro, &error);
 		git_mutex_unlock(&cache->lock);
 	}
 
diff --git a/src/cache.c b/src/cache.c
index 5f71d16..f76e72d 100644
--- a/src/cache.c
+++ b/src/cache.c
@@ -199,7 +199,7 @@ static void *cache_store(git_cache *cache, git_cached_obj *entry)
 	if (!git_oidmap_valid_index(cache->map, pos)) {
 		int rval;
 
-		git_oidmap_insert(cache->map, &entry->oid, entry, rval);
+		git_oidmap_insert(cache->map, &entry->oid, entry, &rval);
 		if (rval >= 0) {
 			git_cached_obj_incref(entry);
 			cache->used_memory += entry->size;
diff --git a/src/config_file.c b/src/config_file.c
index 2e3d568..6a37389 100644
--- a/src/config_file.c
+++ b/src/config_file.c
@@ -179,7 +179,7 @@ static int append_entry(git_strmap *values, cvar_t *var)
 
 	pos = git_strmap_lookup_index(values, var->entry->name);
 	if (!git_strmap_valid_index(values, pos)) {
-		git_strmap_insert(values, var->entry->name, var, error);
+		git_strmap_insert(values, var->entry->name, var, &error);
 	} else {
 		existing = git_strmap_value_at(values, pos);
 		while (existing->next != NULL) {
diff --git a/src/describe.c b/src/describe.c
index 16e1955..1523858 100644
--- a/src/describe.c
+++ b/src/describe.c
@@ -127,7 +127,7 @@ static int add_to_known_names(
 		if (!found) {
 			int ret;
 
-			git_oidmap_insert(names, &e->peeled, e, ret);
+			git_oidmap_insert(names, &e->peeled, e, &ret);
 			if (ret < 0)
 				return -1;
 		}
diff --git a/src/diff_driver.c b/src/diff_driver.c
index 0adf704..721388b 100644
--- a/src/diff_driver.c
+++ b/src/diff_driver.c
@@ -217,7 +217,7 @@ static int git_diff_driver_builtin(
 		goto done;
 	}
 
-	git_strmap_insert(reg->drivers, drv->name, drv, error);
+	git_strmap_insert(reg->drivers, drv->name, drv, &error);
 	if (error > 0)
 		error = 0;
 
@@ -331,7 +331,7 @@ static int git_diff_driver_load(
 		goto done;
 
 	/* store driver in registry */
-	git_strmap_insert(reg->drivers, drv->name, drv, error);
+	git_strmap_insert(reg->drivers, drv->name, drv, &error);
 	if (error < 0)
 		goto done;
 	error = 0;
diff --git a/src/fileops.c b/src/fileops.c
index 7a87332..0b0ed42 100644
--- a/src/fileops.c
+++ b/src/fileops.c
@@ -607,7 +607,7 @@ retry_lstat:
 
 			memcpy(cache_path, make_path.ptr, make_path.size + 1);
 
-			git_strmap_insert(opts->dir_map, cache_path, cache_path, error);
+			git_strmap_insert(opts->dir_map, cache_path, cache_path, &error);
 			if (error < 0)
 				goto done;
 		}
diff --git a/src/idxmap.h b/src/idxmap.h
index 4122a89..e8fd363 100644
--- a/src/idxmap.h
+++ b/src/idxmap.h
@@ -51,16 +51,16 @@ static kh_inline khint_t idxentry_hash(const git_index_entry *e)
 	((*(hp) = kh_init(idxicase)) == NULL) ? giterr_set_oom(), -1 : 0
 
 #define git_idxmap_insert(h, key, val, rval) do { \
-	khiter_t __pos = kh_put(idx, h, key, &rval); \
-	if (rval >= 0) { \
-		if (rval == 0) kh_key(h, __pos) = key; \
+	khiter_t __pos = kh_put(idx, h, key, rval); \
+	if ((*rval) >= 0) { \
+		if ((*rval) == 0) kh_key(h, __pos) = key; \
 		kh_val(h, __pos) = val; \
 	} } while (0)
 
 #define git_idxmap_icase_insert(h, key, val, rval) do { \
-	khiter_t __pos = kh_put(idxicase, h, key, &rval); \
-	if (rval >= 0) { \
-		if (rval == 0) kh_key(h, __pos) = key; \
+	khiter_t __pos = kh_put(idxicase, h, key, rval); \
+	if ((*rval) >= 0) { \
+		if ((*rval) == 0) kh_key(h, __pos) = key; \
 		kh_val(h, __pos) = val; \
 	} } while (0)
 
diff --git a/src/index.c b/src/index.c
index f27fa16..d7deae5 100644
--- a/src/index.c
+++ b/src/index.c
@@ -1365,7 +1365,7 @@ static int index_insert(
 		error = git_vector_insert_sorted(&index->entries, entry, index_no_dups);
 
 		if (error == 0) {
-			INSERT_IN_MAP(index, entry, error);
+			INSERT_IN_MAP(index, entry, &error);
 		}
 	}
 
@@ -1592,7 +1592,7 @@ int git_index__fill(git_index *index, const git_vector *source_entries)
 		if ((ret = git_vector_insert(&index->entries, entry)) < 0)
 			break;
 
-		INSERT_IN_MAP(index, entry, ret);
+		INSERT_IN_MAP(index, entry, &ret);
 		if (ret < 0)
 			break;
 	}
@@ -2499,7 +2499,7 @@ static int parse_index(git_index *index, const char *buffer, size_t buffer_size)
 			goto done;
 		}
 
-		INSERT_IN_MAP(index, entry, error);
+		INSERT_IN_MAP(index, entry, &error);
 
 		if (error < 0) {
 			index_entry_free(entry);
@@ -2984,7 +2984,7 @@ int git_index_read_tree(git_index *index, const git_tree *tree)
 		kh_resize(idx, entries_map, entries.length);
 
 	git_vector_foreach(&entries, i, e) {
-		INSERT_IN_MAP_EX(index, entries_map, e, error);
+		INSERT_IN_MAP_EX(index, entries_map, e, &error);
 
 		if (error < 0) {
 			giterr_set(GITERR_INDEX, "failed to insert entry into map");
@@ -3103,7 +3103,7 @@ static int git_index_read_iterator(
 
 		if (add_entry) {
 			if ((error = git_vector_insert(&new_entries, add_entry)) == 0)
-				INSERT_IN_MAP_EX(index, new_entries_map, add_entry, error);
+				INSERT_IN_MAP_EX(index, new_entries_map, add_entry, &error);
 		}
 
 		if (remove_entry && error >= 0)
diff --git a/src/mwindow.c b/src/mwindow.c
index 520e768..91dbcae 100644
--- a/src/mwindow.c
+++ b/src/mwindow.c
@@ -84,7 +84,7 @@ int git_mwindow_get_pack(struct git_pack_file **out, const char *path)
 
 	git_atomic_inc(&pack->refcount);
 
-	git_strmap_insert(git__pack_cache, pack->pack_name, pack, error);
+	git_strmap_insert(git__pack_cache, pack->pack_name, pack, &error);
 	git_mutex_unlock(&git__mwindow_mutex);
 
 	if (error < 0) {
diff --git a/src/offmap.h b/src/offmap.h
index 1fcd9f6..56003cf 100644
--- a/src/offmap.h
+++ b/src/offmap.h
@@ -41,9 +41,9 @@ typedef khash_t(off) git_offmap;
 #define git_offmap_put(h, k, err)          kh_put(off, h, k, err)
 
 #define git_offmap_insert(h, key, val, rval) do { \
-	khiter_t __pos = kh_put(off, h, key, &rval); \
-	if (rval >= 0) { \
-		if (rval == 0) kh_key(h, __pos) = key; \
+	khiter_t __pos = kh_put(off, h, key, rval); \
+	if ((*rval) >= 0) { \
+		if ((*rval) == 0) kh_key(h, __pos) = key; \
 		kh_val(h, __pos) = val; \
 	} } while (0)
 
diff --git a/src/oidmap.h b/src/oidmap.h
index e736a51..0a14436 100644
--- a/src/oidmap.h
+++ b/src/oidmap.h
@@ -48,9 +48,9 @@ GIT_INLINE(khint_t) git_oidmap_hash(const git_oid *oid)
 #define git_oidmap_put(h, k, err) kh_put(oid, h, k, err)
 
 #define git_oidmap_insert(h, key, val, rval) do { \
-	khiter_t __pos = kh_put(oid, h, key, &rval); \
-	if (rval >= 0) { \
-		if (rval == 0) kh_key(h, __pos) = key; \
+	khiter_t __pos = kh_put(oid, h, key, rval); \
+	if ((*rval) >= 0) { \
+		if ((*rval) == 0) kh_key(h, __pos) = key; \
 		kh_val(h, __pos) = val; \
 	} } while (0)
 
diff --git a/src/pack-objects.c b/src/pack-objects.c
index fa11763..1b4ec9d 100644
--- a/src/pack-objects.c
+++ b/src/pack-objects.c
@@ -1540,7 +1540,7 @@ static int retrieve_object(git_walk_object **out, git_packbuilder *pb, const git
 		if ((error = lookup_walk_object(&obj, pb, id)) < 0)
 			return error;
 
-		git_oidmap_insert(pb->walk_objects, &obj->id, obj, error);
+		git_oidmap_insert(pb->walk_objects, &obj->id, obj, &error);
 	}
 
 	*out = obj;
diff --git a/src/strmap.h b/src/strmap.h
index 7b96956..b926310 100644
--- a/src/strmap.h
+++ b/src/strmap.h
@@ -46,9 +46,9 @@ typedef khiter_t git_strmap_iter;
 #define git_strmap_put(h, k, err)          kh_put(str, h, k, err)
 
 #define git_strmap_insert(h, key, val, rval) do { \
-	khiter_t __pos = kh_put(str, h, key, &rval); \
-	if (rval >= 0) { \
-		if (rval == 0) kh_key(h, __pos) = key; \
+	khiter_t __pos = kh_put(str, h, key, rval); \
+	if ((*rval) >= 0) { \
+		if ((*rval) == 0) kh_key(h, __pos) = key; \
 		kh_val(h, __pos) = val; \
 	} } while (0)
 
diff --git a/src/submodule.c b/src/submodule.c
index f922518..095bbb0 100644
--- a/src/submodule.c
+++ b/src/submodule.c
@@ -186,7 +186,7 @@ static int load_submodule_names(git_strmap *out, git_config *cfg)
 		ldot = strrchr(entry->name, '.');
 
 		git_buf_put(&buf, fdot + 1, ldot - fdot - 1);
-		git_strmap_insert(out, entry->value, git_buf_detach(&buf), rval);
+		git_strmap_insert(out, entry->value, git_buf_detach(&buf), &rval);
 		if (rval < 0) {
 			giterr_set(GITERR_NOMEMORY, "error inserting submodule into hash table");
 			return -1;
@@ -1866,7 +1866,7 @@ static int submodule_load_each(const git_config_entry *entry, void *payload)
 		goto done;
 	}
 
-	git_strmap_insert(map, sm->name, sm, error);
+	git_strmap_insert(map, sm->name, sm, &error);
 	assert(error != 0);
 	if (error < 0)
 		goto done;
diff --git a/src/transaction.c b/src/transaction.c
index ffe374a..5b345e1 100644
--- a/src/transaction.c
+++ b/src/transaction.c
@@ -120,7 +120,7 @@ int git_transaction_lock_ref(git_transaction *tx, const char *refname)
 	if ((error = git_refdb_lock(&node->payload, tx->db, refname)) < 0)
 		return error;
 
-	git_strmap_insert(tx->locks, node->name, node, error);
+	git_strmap_insert(tx->locks, node->name, node, &error);
 	if (error < 0) 
 		goto cleanup;
 
diff --git a/src/tree.c b/src/tree.c
index 26da296..8f4cab8 100644
--- a/src/tree.c
+++ b/src/tree.c
@@ -505,7 +505,7 @@ static int append_entry(
 
 	entry->attr = (uint16_t)filemode;
 
-	git_strmap_insert(bld->map, entry->filename, entry, error);
+	git_strmap_insert(bld->map, entry->filename, entry, &error);
 	if (error < 0) {
 		git_tree_entry_free(entry);
 		giterr_set(GITERR_TREE, "failed to append entry %s to the tree builder", filename);
@@ -754,7 +754,7 @@ int git_treebuilder_insert(
 		entry = alloc_entry(filename, strlen(filename), id);
 		GITERR_CHECK_ALLOC(entry);
 
-		git_strmap_insert(bld->map, entry->filename, entry, error);
+		git_strmap_insert(bld->map, entry->filename, entry, &error);
 
 		if (error < 0) {
 			git_tree_entry_free(entry);
diff --git a/tests/core/strmap.c b/tests/core/strmap.c
index 3b4276a..860f110 100644
--- a/tests/core/strmap.c
+++ b/tests/core/strmap.c
@@ -36,7 +36,7 @@ static void insert_strings(git_strmap *table, int count)
 		for (j = 0, over = i / 26; over > 0; j++, over = over / 26)
 			str[j] = 'A' + (over % 26);
 
-		git_strmap_insert(table, str, str, err);
+		git_strmap_insert(table, str, str, &err);
 		cl_assert(err >= 0);
 	}