[Bf-blender-cvs] [57e8714b381] master: Fix shadowing in sequencer iterator
Sergey Sharybin
noreply at git.blender.org
Fri Aug 27 14:46:02 CEST 2021
Commit: 57e8714b381c37cc5e934ad0a166e5de208f8828
Author: Sergey Sharybin
Date: Fri Aug 27 14:44:12 2021 +0200
Branches: master
https://developer.blender.org/rB57e8714b381c37cc5e934ad0a166e5de208f8828
Fix shadowing in sequencer iterator
The __LINE__ was not properly expanded.
===================================================================
M source/blender/sequencer/SEQ_iterator.h
===================================================================
diff --git a/source/blender/sequencer/SEQ_iterator.h b/source/blender/sequencer/SEQ_iterator.h
index 9fca25653e1..7eab9f84b50 100644
--- a/source/blender/sequencer/SEQ_iterator.h
+++ b/source/blender/sequencer/SEQ_iterator.h
@@ -34,12 +34,24 @@ struct GSet;
struct GSetIterator;
struct Sequence;
-#define SEQ_ITERATOR_FOREACH_IMPL(var, collection, suffix) \
- for (SeqIterator iter##suffix = {{{NULL}}}; \
- SEQ_iterator_ensure(collection, &iter##suffix, &var) && var != NULL; \
- var = SEQ_iterator_yield(&iter##suffix))
+/* Utility macro to construct an unique (within a file) variable name for iterator macro.
+ * Use indirect macro evaluation to ensure the `__LINE__` is expanded (rather than being
+ * treated as a name token),
+ *
+ * The `__LINE__` is defined at the invocation of the `SEQ_ITERATOR_FOREACH` and is not changed
+ * afterwards. This makes it safe to expand it several times in the `SEQ_ITERATOR_FOREACH`.
+ *
+ * This allows to have nested foreach loops.
+ *
+ * NOTE: Putting nested loop to a wrapper macro is not supported. */
+#define _SEQ_ITERATOR_NAME_JOIN(x, y) x##_##y
+#define _SEQ_ITERATOR_NAME_EVALUATE(x, y) _SEQ_ITERATOR_NAME_JOIN(x, y)
+#define _SEQ_ITERATOR_NAME(prefix) _SEQ_ITERATOR_NAME_EVALUATE(prefix, __LINE__)
-#define SEQ_ITERATOR_FOREACH(var, collection) SEQ_ITERATOR_FOREACH_IMPL(var, collection, __LINE__)
+#define SEQ_ITERATOR_FOREACH(var, collection) \
+ for (SeqIterator _SEQ_ITERATOR_NAME(iter) = {{{NULL}}}; \
+ SEQ_iterator_ensure(collection, &_SEQ_ITERATOR_NAME(iter), &var) && var != NULL; \
+ var = SEQ_iterator_yield(&_SEQ_ITERATOR_NAME(iter)))
typedef struct SeqCollection {
struct GSet *set;
More information about the Bf-blender-cvs
mailing list