else if (type == EINA_VALUE_TYPE_STRING)
{
const char *str = (const char *) va_arg(args, const char *);
- free(value->value.ptr);
+ if (value->value.ptr == str) return EINA_TRUE;
if (!str)
- value->value.ptr = NULL;
+ {
+ free(value->value.ptr);
+ value->value.ptr = NULL;
+ }
else
{
- value->value.ptr = strdup(str);
- if (!value->value.ptr)
+ char *tmp = strdup(str);
+ if (!tmp)
{
eina_error_set(EINA_ERROR_OUT_OF_MEMORY);
return EINA_FALSE;
}
+ free(value->value.ptr);
+ value->value.ptr = tmp;
}
return EINA_TRUE;
}
{
const char * const * pstr = (const char * const *) ptr;
const char *str = *pstr;
-
- free(value->value.ptr);
+ if (value->value.ptr == str) return EINA_TRUE;
if (!str)
- value->value.ptr = NULL;
+ {
+ free(value->value.ptr);
+ value->value.ptr = NULL;
+ }
else
{
- value->value.ptr = strdup(str);
- if (!value->value.ptr)
+ char *tmp = strdup(str);
+ if (!tmp)
{
eina_error_set(EINA_ERROR_OUT_OF_MEMORY);
return EINA_FALSE;
}
+ free(value->value.ptr);
+ value->value.ptr = tmp;
}
return EINA_TRUE;
}
{
char **tmem = mem;
const char *str = va_arg(args, const char *);
- free(*tmem);
- if (str == NULL)
- *tmem = NULL;
+ eina_error_set(0);
+ if (str == *tmem) return EINA_TRUE;
+ if (!str)
+ {
+ free(*tmem);
+ *tmem = NULL;
+ }
else
{
- *tmem = strdup(str);
- if (*tmem == NULL)
+ char *tmp = strdup(str);
+ if (!tmp)
{
eina_error_set(EINA_ERROR_OUT_OF_MEMORY);
return EINA_FALSE;
}
+ free(*tmem);
+ *tmem = tmp;
}
- eina_error_set(0);
return EINA_TRUE;
}
{
char **tmem = mem;
const char * const *str = ptr;
- free(*tmem);
- if (*str == NULL)
- *tmem = NULL;
+ eina_error_set(0);
+ if (*str == *tmem) return EINA_TRUE;
+ if (!*str)
+ {
+ free(*tmem);
+ *tmem = NULL;
+ }
else
{
- *tmem = strdup(*str);
- if (*tmem == NULL)
+ char *tmp = strdup(*str);
+ if (!tmp)
{
eina_error_set(EINA_ERROR_OUT_OF_MEMORY);
return EINA_FALSE;
}
+ free(*tmem);
+ *tmem = tmp;
}
- eina_error_set(0);
return EINA_TRUE;
}
const Eina_Value_Array *desc = ptr;
Eina_Inarray *desc_array;
+ eina_error_set(0);
if ((!tmem->subtype) && (!desc->subtype))
return EINA_TRUE;
{
EINA_SAFETY_ON_FALSE_RETURN_VAL
(desc_array->member_size == desc->subtype->value_size, EINA_FALSE);
+
+ if (desc_array == tmem->array)
+ {
+ tmem->subtype = desc->subtype;
+ return EINA_TRUE;
+ }
}
if (tmem->array)
Eina_Value_List *tmem = mem;
const Eina_Value_List *desc = ptr;
+ eina_error_set(0);
if ((!tmem->subtype) && (!desc->subtype))
return EINA_TRUE;
+ if ((tmem->list) && (tmem->list == desc->list))
+ {
+ tmem->subtype = desc->subtype;
+ return EINA_TRUE;
+ }
+
_eina_value_type_list_flush_elements(tmem);
tmem->subtype = desc->subtype;
tmem->list = desc->list;
Eina_Value_Hash *tmem = mem;
const Eina_Value_Hash *desc = ptr;
+ eina_error_set(0);
if ((!tmem->subtype) && (!desc->subtype))
return EINA_TRUE;
+ if ((tmem->hash) && (tmem->hash == desc->hash))
+ {
+ tmem->subtype = desc->subtype;
+ return EINA_TRUE;
+ }
+
if (tmem->hash) _eina_value_type_hash_flush_elements(tmem);
if (desc->hash)
Eina_Value_Blob *tmem = mem;
const Eina_Value_Blob *desc = ptr;
+ eina_error_set(0);
+ if ((tmem->memory) && (tmem->memory == desc->memory))
+ {
+ tmem->ops = desc->ops;
+ tmem->size = desc->size;
+ return EINA_TRUE;
+ }
+
if ((ops) && (ops->free))
ops->free(ops, (void *)tmem->memory, tmem->size);
return EINA_FALSE;
}
- _eina_value_type_struct_flush(type, mem);
-
- *tmem = *desc;
- if (tmem->memory)
+ eina_error_set(0);
+ if ((tmem->memory) && (tmem->memory == desc->memory))
{
- eina_error_set(0);
+ tmem->desc = desc->desc;
return EINA_TRUE;
}
+ _eina_value_type_struct_flush(type, mem);
+
+ *tmem = *desc;
+ if (tmem->memory) return EINA_TRUE;
+
ops = _eina_value_type_struct_ops_get(desc);
if ((ops) && (ops->alloc))
tmem->memory = ops->alloc(ops, tmem->desc);
goto error;
}
- eina_error_set(0);
return EINA_TRUE;
error:
Eina_Model **tmem = mem;
Eina_Model **p = (Eina_Model **)ptr;
+ eina_error_set(0);
+ if (*tmem == *p) return EINA_TRUE;
+
if (*p) eina_model_ref(*p);
if (*tmem) eina_model_unref(*tmem);