From: terencehill Date: Sun, 19 Mar 2023 23:19:39 +0000 (+0100) Subject: Add back support for nested intrusive list loops X-Git-Tag: xonotic-v0.8.6~141^2~1 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=45b7328c668fda2ed541879a8ad055c0c95f33ee;p=xonotic%2Fxonotic-data.pk3dir.git Add back support for nested intrusive list loops --- 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);