* Fix bug with string included in a list found by Viktor Kojouharov.

* Add a test case for that one.

Problem was simple type inlining in complex structure (like list/hash/array) is
just a hack. We are creating a subtype with the data chunk. That work with INT
or SHORT for example, but not with STRING because it's a pointer to a STRING and
not directly the STRING. This result in a double pointer dereferencing where it
shouldn't. In fact STRING is not really like other simple data type. So we
should handle it differently.

Still need to fix Array and Hash.



SVN revision: 37024
This commit is contained in:
Cedric BAIL 2008-10-23 13:12:33 +00:00
parent b114ef85de
commit 5c096e9ddb
2 changed files with 46 additions and 10 deletions

View File

@ -1124,7 +1124,7 @@ eet_data_descriptor_element_add(Eet_Data_Descriptor *edd,
*/
if (group_type > EET_G_UNKNOWN
&& group_type < EET_G_LAST
&& type != EET_T_UNKNOW
&& type > EET_T_UNKNOW && type < EET_T_STRING
&& subtype == NULL)
{
subtype = calloc(1, sizeof (Eet_Data_Descriptor));
@ -2555,14 +2555,25 @@ eet_data_get_list(const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_E
void **ptr;
void *data_ret;
EET_ASSERT(!IS_SIMPLE_TYPE(type), return 0);
EET_ASSERT(!((type > EET_T_UNKNOW) && (type < EET_T_STRING)), return 0);
ptr = (void **)data;
list = *ptr;
data_ret = NULL;
data_ret = _eet_data_descriptor_decode(ed, ede->subtype, echnk->data, echnk->size, level + 2, dumpfunc, dumpdata);
if (!data_ret) return 0;
if (ede->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) return 0;
}
list = edd->func.list_append(list, data_ret);
*ptr = list;
@ -2832,16 +2843,24 @@ eet_data_put_list(Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element
void *l;
int size;
EET_ASSERT(!IS_SIMPLE_TYPE(ede->type), return );
EET_ASSERT(!((ede->type > EET_T_UNKNOW) && (ede->type < EET_T_STRING)), return );
l = *((void **)(((char *)data_in)));
for (; l; l = edd->func.list_next(l))
{
data = _eet_data_descriptor_encode(ed,
ede->subtype,
edd->func.list_data(l),
&size);
if (data) eet_data_encode(ed, ds, data, ede->name, size, ede->type, ede->group_type);
if (ede->type >= EET_T_STRING)
{
const char *str = edd->func.list_data(l);
eet_data_put_unknown(ed, NULL, ede, ds, &str);
}
else
{
data = _eet_data_descriptor_encode(ed,
ede->subtype,
edd->func.list_data(l),
&size);
if (data) eet_data_encode(ed, ds, data, ede->name, size, ede->type, ede->group_type);
}
}
}

View File

@ -280,6 +280,7 @@ struct _Eet_Test_Ex_Type
Eina_List *list;
Eina_Hash *hash;
Eina_List *ilist;
Eina_List *slist;
Eina_Hash *ihash;
Eet_Test_Basic_Type sarray1[10];
unsigned int sarray2[5];
@ -346,6 +347,9 @@ _eet_build_ex_descriptor(Eet_Data_Descriptor *edd)
eet_data_descriptor_element_add(edd, "ihash", EET_T_INT, EET_G_HASH,
(char *)(&(etbt.ihash)) - (char *)(&(etbt)),
0, /* 0, */NULL, NULL);
eet_data_descriptor_element_add(edd, "slist", EET_T_STRING, EET_G_LIST,
(char *)(&(etbt.slist)) - (char *)(&(etbt)),
0, /* 0, */NULL, NULL);
}
static Eet_Test_Ex_Type*
@ -374,6 +378,7 @@ _eet_test_ex_set(Eet_Test_Ex_Type *res, int offset)
res->hash = NULL;
res->ilist = NULL;
res->ihash = NULL;
res->slist = NULL;
res->varray2 = malloc(sizeof (Eet_Test_Basic_Type) * 10);
res->varray1 = malloc(sizeof (int) * 5);
@ -490,6 +495,7 @@ 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"));
eet_test_setup_eddc(&eddc);
eddc.name = "Eet_Test_Ex_Type";
@ -510,6 +516,8 @@ START_TEST(eet_test_data_type_encoding_decoding)
fail_if(_eet_test_ex_check(eina_list_data_get(result->list), 1) != 0);
fail_if(eina_list_data_get(result->ilist) == NULL);
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);
test = 0;
eina_hash_foreach(result->hash, func, &test);
@ -564,6 +572,7 @@ 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"));
eet_test_setup_eddc(&eddc);
eddc.name = "Eet_Test_Ex_Type";
@ -598,6 +607,8 @@ START_TEST(eet_test_data_type_dump_undump)
fail_if(_eet_test_ex_check(eina_list_data_get(result->list), 1) != 0);
fail_if(eina_list_data_get(result->ilist) == NULL);
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);
test = 0;
eina_hash_foreach(result->hash, func, &test);
@ -696,6 +707,7 @@ 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"));
eet_test_setup_eddc(&eddc);
eddc.name = "Eet_Test_Ex_Type";
@ -761,6 +773,8 @@ START_TEST(eet_file_data_test)
fail_if(_eet_test_ex_check(eina_list_data_get(result->list), 1) != 0);
fail_if(eina_list_data_get(result->ilist) == NULL);
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);
test = 0;
eina_hash_foreach(result->hash, func, &test);
@ -826,6 +840,7 @@ 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"));
eet_test_setup_eddc(&eddc);
eddc.name = "Eet_Test_Ex_Type";
@ -871,6 +886,8 @@ START_TEST(eet_file_data_dump_test)
fail_if(_eet_test_ex_check(eina_list_data_get(result->list), 1) != 0);
fail_if(eina_list_data_get(result->ilist) == NULL);
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);
test = 0;
eina_hash_foreach(result->hash, func, &test);