diff options
author | wm4 <wm4@nowhere> | 2012-09-18 16:08:17 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2012-09-23 14:58:31 +0200 |
commit | bfc3dbae88dc70a832e82c5b44474fdf5a5e65a5 (patch) | |
tree | c769b3d50393a01c59c329d96236cd54b3d24ca1 /m_config.c | |
parent | 7fe56f16026d6b2440e879078f8848a5056f1da8 (diff) | |
download | mpv-bfc3dbae88dc70a832e82c5b44474fdf5a5e65a5.tar.bz2 mpv-bfc3dbae88dc70a832e82c5b44474fdf5a5e65a5.tar.xz |
options: simplify somewhat by introducing a union for option values
The m_option_value union is supposed to contain a field for each
possible option type (as long as it actually stores data). This helps
avoiding silly temporary memory alocations. Using a pointer to an union
and to a field of the union interchangeably should be allowed by
standard C.
Diffstat (limited to 'm_config.c')
-rw-r--r-- | m_config.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/m_config.c b/m_config.c index ae7f528060..11272766d2 100644 --- a/m_config.c +++ b/m_config.c @@ -334,15 +334,14 @@ static void m_config_add_option(struct m_config *config, } else if (arg->type->flags & M_OPT_TYPE_DYNAMIC) { // Initialize dynamically managed fields from static data (like // string options): copy the option into temporary memory, - // clear the original option (to void m_option freeing the + // clear the original option (to stop m_option from freeing the // static data), copy it back. if (co->data) { - void *temp = talloc_zero_size(NULL, arg->type->size); - m_option_copy(arg, temp, co->data); + union m_option_value temp = {0}; + m_option_copy(arg, &temp, co->data); memset(co->data, 0, arg->type->size); - m_option_copy(arg, co->data, temp); - m_option_free(arg, temp); - talloc_free(temp); + m_option_copy(arg, co->data, &temp); + m_option_free(arg, &temp); } } } |