forked from enlightenment/efl
* 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:
parent
b114ef85de
commit
5c096e9ddb
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue