* Fix Hash of String bug.
* Add a test case for it. SVN revision: 37029
This commit is contained in:
parent
5c096e9ddb
commit
04edb0cbec
|
@ -1400,22 +1400,28 @@ eet_data_descriptor_encode_hash_cb(void *hash __UNUSED__, const char *key, void
|
|||
data = NULL;
|
||||
}
|
||||
|
||||
EET_ASSERT(!IS_SIMPLE_TYPE(ede->type), return 1);
|
||||
EET_ASSERT(!((ede->type > EET_T_UNKNOW) && (ede->type < EET_T_STRING)), return );
|
||||
|
||||
/* Store data */
|
||||
if (ede->subtype)
|
||||
data = _eet_data_descriptor_encode(ed,
|
||||
ede->subtype,
|
||||
hdata,
|
||||
&size);
|
||||
if (data)
|
||||
if (ede->type >= EET_T_STRING)
|
||||
eet_data_put_unknown(ed, NULL, ede, ds, &hdata);
|
||||
else
|
||||
{
|
||||
echnk = eet_data_chunk_new(data, size, ede->name, ede->type, ede->group_type);
|
||||
eet_data_chunk_put(ed, echnk, ds);
|
||||
eet_data_chunk_free(echnk);
|
||||
free(data);
|
||||
data = NULL;
|
||||
if (ede->subtype)
|
||||
data = _eet_data_descriptor_encode(ed,
|
||||
ede->subtype,
|
||||
hdata,
|
||||
&size);
|
||||
if (data)
|
||||
{
|
||||
echnk = eet_data_chunk_new(data, size, ede->name, ede->type, ede->group_type);
|
||||
eet_data_chunk_put(ed, echnk, ds);
|
||||
eet_data_chunk_free(echnk);
|
||||
free(data);
|
||||
data = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -2594,7 +2600,7 @@ eet_data_get_hash(const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_E
|
|||
void *data_ret = NULL;
|
||||
int ret = 0;
|
||||
|
||||
EET_ASSERT(!IS_SIMPLE_TYPE(type), return 0);
|
||||
EET_ASSERT(!((type > EET_T_UNKNOW) && (type < EET_T_STRING)), return 0);
|
||||
|
||||
ptr = (void **)data;
|
||||
hash = *ptr;
|
||||
|
@ -2615,14 +2621,25 @@ eet_data_get_hash(const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_E
|
|||
eet_data_chunk_get(ed, echnk, *p, *size);
|
||||
if (!echnk->name) goto on_error;
|
||||
|
||||
data_ret = _eet_data_descriptor_decode(ed,
|
||||
ede->subtype,
|
||||
echnk->data,
|
||||
echnk->size,
|
||||
level + 2,
|
||||
dumpfunc,
|
||||
dumpdata);
|
||||
if (!data_ret) goto on_error;
|
||||
if (type >= EET_T_STRING)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = eet_data_get_unknown(ed, edd, ede, echnk, ede->type, EET_G_UNKNOWN,
|
||||
&data_ret, level, dumpfunc, dumpdata, p, size);
|
||||
if (!ret) return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
data_ret = _eet_data_descriptor_decode(ed,
|
||||
ede->subtype,
|
||||
echnk->data,
|
||||
echnk->size,
|
||||
level + 2,
|
||||
dumpfunc,
|
||||
dumpdata);
|
||||
if (!data_ret) goto on_error;
|
||||
}
|
||||
|
||||
hash = edd->func.hash_add(hash, key, data_ret);
|
||||
*ptr = hash;
|
||||
|
|
|
@ -282,6 +282,7 @@ struct _Eet_Test_Ex_Type
|
|||
Eina_List *ilist;
|
||||
Eina_List *slist;
|
||||
Eina_Hash *ihash;
|
||||
Eina_Hash *shash;
|
||||
Eet_Test_Basic_Type sarray1[10];
|
||||
unsigned int sarray2[5];
|
||||
unsigned int varray1_count;
|
||||
|
@ -350,6 +351,9 @@ _eet_build_ex_descriptor(Eet_Data_Descriptor *edd)
|
|||
eet_data_descriptor_element_add(edd, "slist", EET_T_STRING, EET_G_LIST,
|
||||
(char *)(&(etbt.slist)) - (char *)(&(etbt)),
|
||||
0, /* 0, */NULL, NULL);
|
||||
eet_data_descriptor_element_add(edd, "shash", EET_T_STRING, EET_G_HASH,
|
||||
(char *)(&(etbt.shash)) - (char *)(&(etbt)),
|
||||
0, /* 0, */NULL, NULL);
|
||||
}
|
||||
|
||||
static Eet_Test_Ex_Type*
|
||||
|
@ -379,6 +383,7 @@ _eet_test_ex_set(Eet_Test_Ex_Type *res, int offset)
|
|||
res->ilist = NULL;
|
||||
res->ihash = NULL;
|
||||
res->slist = NULL;
|
||||
res->shash = NULL;
|
||||
|
||||
res->varray2 = malloc(sizeof (Eet_Test_Basic_Type) * 10);
|
||||
res->varray1 = malloc(sizeof (int) * 5);
|
||||
|
@ -495,7 +500,9 @@ START_TEST(eet_test_data_type_encoding_decoding)
|
|||
etbt.ilist = eina_list_prepend(etbt.ilist, &i42);
|
||||
etbt.ihash = eina_hash_string_superfast_new(NULL);
|
||||
eina_hash_add(etbt.ihash, EET_TEST_KEY1, &i7);
|
||||
etbt.slist = eina_list_prepend(NULL, strdup("test"));
|
||||
etbt.slist = eina_list_prepend(NULL, "test");
|
||||
etbt.shash = eina_hash_string_superfast_new(NULL);
|
||||
eina_hash_add(etbt.shash, EET_TEST_KEY1, "test");
|
||||
|
||||
eet_test_setup_eddc(&eddc);
|
||||
eddc.name = "Eet_Test_Ex_Type";
|
||||
|
@ -518,6 +525,8 @@ START_TEST(eet_test_data_type_encoding_decoding)
|
|||
fail_if(*((int*)eina_list_data_get(result->ilist)) != 42);
|
||||
fail_if(eina_list_data_get(result->slist) == NULL);
|
||||
fail_if(strcmp(eina_list_data_get(result->slist), "test") != 0);
|
||||
fail_if(eina_hash_find(result->shash, EET_TEST_KEY1) == NULL);
|
||||
fail_if(strcmp(eina_hash_find(result->shash, EET_TEST_KEY1), "test") != 0);
|
||||
|
||||
test = 0;
|
||||
eina_hash_foreach(result->hash, func, &test);
|
||||
|
@ -572,7 +581,9 @@ START_TEST(eet_test_data_type_dump_undump)
|
|||
eina_hash_add(etbt.ihash, EET_TEST_KEY1, &i7);
|
||||
etbt.ihash = eina_hash_string_superfast_new(NULL);
|
||||
eina_hash_add(etbt.ihash, EET_TEST_KEY2, &i7);
|
||||
etbt.slist = eina_list_prepend(NULL, strdup("test"));
|
||||
etbt.slist = eina_list_prepend(NULL, "test");
|
||||
etbt.shash = eina_hash_string_superfast_new(NULL);
|
||||
eina_hash_add(etbt.shash, EET_TEST_KEY1, "test");
|
||||
|
||||
eet_test_setup_eddc(&eddc);
|
||||
eddc.name = "Eet_Test_Ex_Type";
|
||||
|
@ -609,6 +620,8 @@ START_TEST(eet_test_data_type_dump_undump)
|
|||
fail_if(*((int*)eina_list_data_get(result->ilist)) != 42);
|
||||
fail_if(eina_list_data_get(result->slist) == NULL);
|
||||
fail_if(strcmp(eina_list_data_get(result->slist), "test") != 0);
|
||||
fail_if(eina_hash_find(result->shash, EET_TEST_KEY1) == NULL);
|
||||
fail_if(strcmp(eina_hash_find(result->shash, EET_TEST_KEY1), "test") != 0);
|
||||
|
||||
test = 0;
|
||||
eina_hash_foreach(result->hash, func, &test);
|
||||
|
@ -707,7 +720,9 @@ START_TEST(eet_file_data_test)
|
|||
eina_hash_add(etbt.ihash, EET_TEST_KEY1, &i7);
|
||||
etbt.ihash = eina_hash_string_superfast_new(NULL);
|
||||
eina_hash_add(etbt.ihash, EET_TEST_KEY2, &i7);
|
||||
etbt.slist = eina_list_prepend(NULL, strdup("test"));
|
||||
etbt.slist = eina_list_prepend(NULL, "test");
|
||||
etbt.shash = eina_hash_string_superfast_new(NULL);
|
||||
eina_hash_add(etbt.shash, EET_TEST_KEY1, "test");
|
||||
|
||||
eet_test_setup_eddc(&eddc);
|
||||
eddc.name = "Eet_Test_Ex_Type";
|
||||
|
@ -775,6 +790,8 @@ START_TEST(eet_file_data_test)
|
|||
fail_if(*((int*)eina_list_data_get(result->ilist)) != 42);
|
||||
fail_if(eina_list_data_get(result->slist) == NULL);
|
||||
fail_if(strcmp(eina_list_data_get(result->slist), "test") != 0);
|
||||
fail_if(eina_hash_find(result->shash, EET_TEST_KEY1) == NULL);
|
||||
fail_if(strcmp(eina_hash_find(result->shash, EET_TEST_KEY1), "test") != 0);
|
||||
|
||||
test = 0;
|
||||
eina_hash_foreach(result->hash, func, &test);
|
||||
|
@ -840,7 +857,9 @@ START_TEST(eet_file_data_dump_test)
|
|||
eina_hash_add(etbt.ihash, EET_TEST_KEY1, &i7);
|
||||
etbt.ihash = eina_hash_string_superfast_new(NULL);
|
||||
eina_hash_add(etbt.ihash, EET_TEST_KEY2, &i7);
|
||||
etbt.slist = eina_list_prepend(NULL, strdup("test"));
|
||||
etbt.slist = eina_list_prepend(NULL, "test");
|
||||
etbt.hash = eina_hash_string_superfast_new(NULL);
|
||||
eina_hash_add(etbt.shash, EET_TEST_KEY1, "test");
|
||||
|
||||
eet_test_setup_eddc(&eddc);
|
||||
eddc.name = "Eet_Test_Ex_Type";
|
||||
|
@ -888,6 +907,8 @@ START_TEST(eet_file_data_dump_test)
|
|||
fail_if(*((int*)eina_list_data_get(result->ilist)) != 42);
|
||||
fail_if(eina_list_data_get(result->slist) == NULL);
|
||||
fail_if(strcmp(eina_list_data_get(result->slist), "test") != 0);
|
||||
fail_if(eina_hash_find(result->shash, EET_TEST_KEY1) == NULL);
|
||||
fail_if(strcmp(eina_hash_find(result->shash, EET_TEST_KEY1), "test") != 0);
|
||||
|
||||
test = 0;
|
||||
eina_hash_foreach(result->hash, func, &test);
|
||||
|
|
Loading…
Reference in New Issue