From 45b7328c668fda2ed541879a8ad055c0c95f33ee Mon Sep 17 00:00:00 2001 From: terencehill Date: Mon, 20 Mar 2023 00:19:39 +0100 Subject: [PATCH] Add back support for nested intrusive list loops --- .gitlab-ci.yml | 2 +- qcsrc/lib/intrusivelist.qh | 23 ++++++++++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 887b0691e..8646ed655 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -75,7 +75,7 @@ test_sv_game: - wget -nv -O data/maps/stormkeep.waypoints https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints - wget -nv -O data/maps/stormkeep.waypoints.cache https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints.cache - - EXPECT=55338fabce73c671336171e6cb055f74 + - EXPECT=5223e8f614f63ee8d0914e2244aff3d4 - HASH=$(${ENGINE} +timestamps 1 +exec serverbench.cfg | tee /dev/stderr | sed -e 's,^\[[^]]*\] ,,' diff --git a/qcsrc/lib/intrusivelist.qh b/qcsrc/lib/intrusivelist.qh index 3dee9ca38..d3a56ba4d 100644 --- a/qcsrc/lib/intrusivelist.qh +++ b/qcsrc/lib/intrusivelist.qh @@ -188,6 +188,8 @@ void IL_REMOVE(IntrusiveList this, entity it) assert(_il); \ .entity il_next = _il.il_nextfld; \ noref int i = 0; \ + entity il_loop_item_save = this.il_loop_item; \ + this.il_loop_item = NULL; \ for (entity _next, _it = _il.il_head; _it; (_it = _next, ++i)) \ { \ const noref entity it = _it; \ @@ -199,7 +201,7 @@ void IL_REMOVE(IntrusiveList this, entity it) else \ _next = it.(il_next); /* in case next item has changed */ \ } \ - this.il_loop_item = NULL; \ + this.il_loop_item = il_loop_item_save; \ MACRO_END .int il_id; @@ -343,6 +345,25 @@ TEST(intrusivelist, ModificationsWhileLooping) }); EXPECT_TRUE(s == "1234"); + IL_TEST_BUILD(); + IL_EACH(il_test, true, + { + s = strcat(s, it.classname); + if (it == ent2) + IL_EACH(il_test, true, + { + s = strcat(s, it.classname); + if (it == ent3) + IL_EACH(il_test, true, + { + s = strcat(s, it.classname); + }); + if (it == ent4) + break; + }); + }); + EXPECT_TRUE(s == "12123123454345"); + IL_DELETE(il_test); delete(ent1); delete(ent2); delete(ent3); delete(ent4); delete(ent5); -- 2.39.2