diff --git a/CMakeLists.txt b/CMakeLists.txt index a906bd19f..7edf307f7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -207,6 +207,11 @@ if(APPLE) elseif(UNIX) option(USE_XDG "Utilize XDG Base Directory Specification" ON) option(ENABLE_WAYLAND "Build support for Wayland" ON) + if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) + option(ENABLE_DARRAY_TYPE_TEST "Test types of darray argument" ON) + else() + option(ENABLE_DARRAY_TYPE_TEST "Test types of darray argument" OFF) + endif() if(USE_XDG) add_definitions(-DUSE_XDG) @@ -215,6 +220,10 @@ elseif(UNIX) if(NOT UNIX_STRUCTURE) list(APPEND CMAKE_INSTALL_RPATH "$ORIGIN") endif() + + if(ENABLE_DARRAY_TYPE_TEST) + add_definitions(-DENABLE_DARRAY_TYPE_TEST) + endif() endif() if(LOWERCASE_CMAKE_SYSTEM_PROCESSOR MATCHES "e2k") diff --git a/libobs/graphics/effect-parser.c b/libobs/graphics/effect-parser.c index c0c8508f8..fc9f68ce7 100644 --- a/libobs/graphics/effect-parser.c +++ b/libobs/graphics/effect-parser.c @@ -1017,12 +1017,14 @@ static inline int ep_parse_param_assign_intfloat(struct effect_parser *ep, float f = (float)os_strtod(ep->cfp.cur_token->str.array); if (is_negative) f = -f; - da_push_back_array(param->default_val, &f, sizeof(float)); + da_push_back_array(param->default_val, (uint8_t *)&f, + sizeof(float)); } else { long l = strtol(ep->cfp.cur_token->str.array, NULL, 10); if (is_negative) l = -l; - da_push_back_array(param->default_val, &l, sizeof(long)); + da_push_back_array(param->default_val, (uint8_t *)&l, + sizeof(long)); } return PARSE_SUCCESS; @@ -1036,11 +1038,13 @@ static inline int ep_parse_param_assign_bool(struct effect_parser *ep, if (cf_token_is(&ep->cfp, "true")) { long l = 1; - da_push_back_array(param->default_val, &l, sizeof(long)); + da_push_back_array(param->default_val, (uint8_t *)&l, + sizeof(long)); return PARSE_SUCCESS; } else if (cf_token_is(&ep->cfp, "false")) { long l = 0; - da_push_back_array(param->default_val, &l, sizeof(long)); + da_push_back_array(param->default_val, (uint8_t *)&l, + sizeof(long)); return PARSE_SUCCESS; } diff --git a/libobs/graphics/effect-parser.h b/libobs/graphics/effect-parser.h index 1c6000c7b..63925b768 100644 --- a/libobs/graphics/effect-parser.h +++ b/libobs/graphics/effect-parser.h @@ -223,10 +223,10 @@ struct ep_func { char *name, *ret_type, *mapping; struct dstr contents; DARRAY(struct ep_var) param_vars; - DARRAY(const char *) func_deps; - DARRAY(const char *) struct_deps; - DARRAY(const char *) param_deps; - DARRAY(const char *) sampler_deps; + DARRAY(char *) func_deps; + DARRAY(char *) struct_deps; + DARRAY(char *) param_deps; + DARRAY(char *) sampler_deps; bool written; }; diff --git a/libobs/graphics/shader-parser.c b/libobs/graphics/shader-parser.c index c685e6b48..ceddd368a 100644 --- a/libobs/graphics/shader-parser.c +++ b/libobs/graphics/shader-parser.c @@ -541,12 +541,14 @@ static inline int sp_parse_param_assign_intfloat(struct shader_parser *sp, float f = (float)os_strtod(sp->cfp.cur_token->str.array); if (is_negative) f = -f; - da_push_back_array(param->default_val, &f, sizeof(float)); + da_push_back_array(param->default_val, (uint8_t *)&f, + sizeof(float)); } else { long l = strtol(sp->cfp.cur_token->str.array, NULL, 10); if (is_negative) l = -l; - da_push_back_array(param->default_val, &l, sizeof(long)); + da_push_back_array(param->default_val, (uint8_t *)&l, + sizeof(long)); } return PARSE_SUCCESS; diff --git a/libobs/obs-output.c b/libobs/obs-output.c index b3f9a27d3..d4abf2333 100644 --- a/libobs/obs-output.c +++ b/libobs/obs-output.c @@ -1222,7 +1222,7 @@ static bool add_caption(struct obs_output *output, struct encoder_packet *out) sei_init(&sei, 0.0); da_init(out_data); - da_push_back_array(out_data, &ref, sizeof(ref)); + da_push_back_array(out_data, (uint8_t *)&ref, sizeof(ref)); da_push_back_array(out_data, out->data, out->size); if (output->caption_data.size > 0) { diff --git a/libobs/util/array-serializer.c b/libobs/util/array-serializer.c index 1d682fc94..05cbf1d6f 100644 --- a/libobs/util/array-serializer.c +++ b/libobs/util/array-serializer.c @@ -20,7 +20,7 @@ static size_t array_output_write(void *param, const void *data, size_t size) { struct array_output_data *output = param; - da_push_back_array(output->bytes, data, size); + da_push_back_array(output->bytes, (uint8_t *)data, size); return size; } diff --git a/libobs/util/darray.h b/libobs/util/darray.h index a4a0e2931..b18d86614 100644 --- a/libobs/util/darray.h +++ b/libobs/util/darray.h @@ -494,33 +494,124 @@ static inline void darray_swap(const size_t element_size, struct darray *dst, #define da_move(dst, src) darray_move(&dst.da, &src.da) -#define da_find(v, item, idx) darray_find(sizeof(*v.array), &v.da, item, idx) +#ifdef ENABLE_DARRAY_TYPE_TEST +#ifdef __cplusplus +#define da_type_test(v, item) \ + ({ \ + if (false) { \ + auto _t = v.array; \ + _t = (item); \ + (void)_t; \ + *(v).array = *(item); \ + } \ + }) +#else +#define da_type_test(v, item) \ + ({ \ + if (false) { \ + const typeof(*v.array) *_t; \ + _t = (item); \ + (void)_t; \ + *(v).array = *(item); \ + } \ + }) +#endif +#endif // ENABLE_DARRAY_TYPE_TEST +#ifdef ENABLE_DARRAY_TYPE_TEST +#define da_find(v, item, idx) \ + ({ \ + da_type_test(v, item); \ + darray_find(sizeof(*v.array), &v.da, item, idx); \ + }) +#else +#define da_find(v, item, idx) darray_find(sizeof(*v.array), &v.da, item, idx) +#endif + +#ifdef ENABLE_DARRAY_TYPE_TEST +#define da_push_back(v, item) \ + ({ \ + da_type_test(v, item); \ + darray_push_back(sizeof(*v.array), &v.da, item); \ + }) +#else #define da_push_back(v, item) darray_push_back(sizeof(*v.array), &v.da, item) +#endif #define da_push_back_new(v) darray_push_back_new(sizeof(*v.array), &v.da) +#ifdef ENABLE_DARRAY_TYPE_TEST +#define da_push_back_array(dst, src_array, n) \ + ({ \ + da_type_test(dst, src_array); \ + darray_push_back_array(sizeof(*dst.array), &dst.da, src_array, \ + n); \ + }) +#else #define da_push_back_array(dst, src_array, n) \ darray_push_back_array(sizeof(*dst.array), &dst.da, src_array, n) +#endif +#ifdef ENABLE_DARRAY_TYPE_TEST +#define da_push_back_da(dst, src) \ + ({ \ + da_type_test(dst, src.array); \ + darray_push_back_darray(sizeof(*dst.array), &dst.da, &src.da); \ + }) +#else #define da_push_back_da(dst, src) \ darray_push_back_darray(sizeof(*dst.array), &dst.da, &src.da) +#endif +#ifdef ENABLE_DARRAY_TYPE_TEST +#define da_insert(v, idx, item) \ + ({ \ + da_type_test(v, item); \ + darray_insert(sizeof(*v.array), &v.da, idx, item); \ + }) +#else #define da_insert(v, idx, item) \ darray_insert(sizeof(*v.array), &v.da, idx, item) +#endif #define da_insert_new(v, idx) darray_insert_new(sizeof(*v.array), &v.da, idx) +#ifdef ENABLE_DARRAY_TYPE_TEST +#define da_insert_array(dst, idx, src_array, n) \ + ({ \ + da_type_test(dst, src_array); \ + darray_insert_array(sizeof(*dst.array), &dst.da, idx, \ + src_array, n); \ + }) +#else #define da_insert_array(dst, idx, src_array, n) \ darray_insert_array(sizeof(*dst.array), &dst.da, idx, src_array, n) +#endif +#ifdef ENABLE_DARRAY_TYPE_TEST +#define da_insert_da(dst, idx, src) \ + ({ \ + da_type_test(dst, src.array); \ + darray_insert_darray(sizeof(*dst.array), &dst.da, idx, \ + &src.da); \ + }) +#else #define da_insert_da(dst, idx, src) \ darray_insert_darray(sizeof(*dst.array), &dst.da, idx, &src.da) +#endif #define da_erase(dst, idx) darray_erase(sizeof(*dst.array), &dst.da, idx) +#ifdef ENABLE_DARRAY_TYPE_TEST +#define da_erase_item(dst, item) \ + ({ \ + da_type_test(dst, item); \ + darray_erase_item(sizeof(*dst.array), &dst.da, item); \ + }) +#else #define da_erase_item(dst, item) \ darray_erase_item(sizeof(*dst.array), &dst.da, item) +#endif #define da_erase_range(dst, from, to) \ darray_erase_range(sizeof(*dst.array), &dst.da, from, to)