From 012d1b0197caa54e199f22560b5c255043ec1831 Mon Sep 17 00:00:00 2001 From: APickledWalrus Date: Mon, 1 Jul 2024 15:40:31 -0400 Subject: [PATCH 1/2] Fix current section update issues It was possible to methods like loadCode to be holding onto invalid/no longer used current section list references --- src/main/java/ch/njol/skript/lang/Section.java | 12 +++++++++--- .../java/ch/njol/skript/lang/TriggerSection.java | 12 +++++++++--- .../6843-current section reference issue.sk | 9 +++++++++ 3 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 src/test/skript/tests/regressions/6843-current section reference issue.sk diff --git a/src/main/java/ch/njol/skript/lang/Section.java b/src/main/java/ch/njol/skript/lang/Section.java index c511e88b2a2..82281a10007 100644 --- a/src/main/java/ch/njol/skript/lang/Section.java +++ b/src/main/java/ch/njol/skript/lang/Section.java @@ -27,6 +27,7 @@ import org.bukkit.event.Event; import org.eclipse.jdt.annotation.Nullable; +import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.function.Supplier; @@ -81,12 +82,17 @@ public abstract boolean init(Expression[] expressions, * (although the loaded code may change it), the calling code must deal with this. */ protected void loadCode(SectionNode sectionNode) { - List currentSections = getParser().getCurrentSections(); - currentSections.add(this); + ParserInstance parser = getParser(); + List currentSections = parser.getCurrentSections(); + + List newSections = new ArrayList<>(currentSections); + newSections.add(this); + parser.setCurrentSections(newSections); + try { setTriggerItems(ScriptLoader.loadItems(sectionNode)); } finally { - currentSections.remove(currentSections.size() - 1); + parser.setCurrentSections(currentSections); } } diff --git a/src/main/java/ch/njol/skript/lang/TriggerSection.java b/src/main/java/ch/njol/skript/lang/TriggerSection.java index d1343d43605..1376c3d90f7 100644 --- a/src/main/java/ch/njol/skript/lang/TriggerSection.java +++ b/src/main/java/ch/njol/skript/lang/TriggerSection.java @@ -24,6 +24,7 @@ import org.bukkit.event.Event; import org.eclipse.jdt.annotation.Nullable; +import java.util.ArrayList; import java.util.List; /** @@ -42,12 +43,17 @@ protected TriggerSection(List items) { } protected TriggerSection(SectionNode node) { - List currentSections = ParserInstance.get().getCurrentSections(); - currentSections.add(this); + ParserInstance parser = ParserInstance.get(); + List currentSections = parser.getCurrentSections(); + + List newSections = new ArrayList<>(currentSections); + newSections.add(this); + parser.setCurrentSections(newSections); + try { setTriggerItems(ScriptLoader.loadItems(node)); } finally { - currentSections.remove(currentSections.size() - 1); + parser.setCurrentSections(currentSections); } } diff --git a/src/test/skript/tests/regressions/6843-current section reference issue.sk b/src/test/skript/tests/regressions/6843-current section reference issue.sk new file mode 100644 index 00000000000..e232fff54c6 --- /dev/null +++ b/src/test/skript/tests/regressions/6843-current section reference issue.sk @@ -0,0 +1,9 @@ +test "outdated current section references": + parse: + loop {_list::*}: + spawn a sheep at {_loc}: + set {_e} to event-entity + loop {_list::*}: + set {_var} to loop-value + set {_var} to loop-value-1 + assert last parse logs is not set with "loop-value and loop-value-1 should've worked: %last parse logs%" From ac3634e6953feb24746304cf0c2d330ebda75636 Mon Sep 17 00:00:00 2001 From: APickledWalrus Date: Mon, 1 Jul 2024 15:50:30 -0400 Subject: [PATCH 2/2] Naming tweaks --- src/main/java/ch/njol/skript/lang/Section.java | 10 +++++----- src/main/java/ch/njol/skript/lang/TriggerSection.java | 10 +++++----- .../6843-current section reference issue.sk | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/ch/njol/skript/lang/Section.java b/src/main/java/ch/njol/skript/lang/Section.java index 82281a10007..5a665165eff 100644 --- a/src/main/java/ch/njol/skript/lang/Section.java +++ b/src/main/java/ch/njol/skript/lang/Section.java @@ -83,16 +83,16 @@ public abstract boolean init(Expression[] expressions, */ protected void loadCode(SectionNode sectionNode) { ParserInstance parser = getParser(); - List currentSections = parser.getCurrentSections(); + List previousSections = parser.getCurrentSections(); - List newSections = new ArrayList<>(currentSections); - newSections.add(this); - parser.setCurrentSections(newSections); + List sections = new ArrayList<>(previousSections); + sections.add(this); + parser.setCurrentSections(sections); try { setTriggerItems(ScriptLoader.loadItems(sectionNode)); } finally { - parser.setCurrentSections(currentSections); + parser.setCurrentSections(previousSections); } } diff --git a/src/main/java/ch/njol/skript/lang/TriggerSection.java b/src/main/java/ch/njol/skript/lang/TriggerSection.java index 1376c3d90f7..e7945784752 100644 --- a/src/main/java/ch/njol/skript/lang/TriggerSection.java +++ b/src/main/java/ch/njol/skript/lang/TriggerSection.java @@ -44,16 +44,16 @@ protected TriggerSection(List items) { protected TriggerSection(SectionNode node) { ParserInstance parser = ParserInstance.get(); - List currentSections = parser.getCurrentSections(); + List previousSections = parser.getCurrentSections(); - List newSections = new ArrayList<>(currentSections); - newSections.add(this); - parser.setCurrentSections(newSections); + List sections = new ArrayList<>(previousSections); + sections.add(this); + parser.setCurrentSections(sections); try { setTriggerItems(ScriptLoader.loadItems(node)); } finally { - parser.setCurrentSections(currentSections); + parser.setCurrentSections(previousSections); } } diff --git a/src/test/skript/tests/regressions/6843-current section reference issue.sk b/src/test/skript/tests/regressions/6843-current section reference issue.sk index e232fff54c6..20e8beb20ef 100644 --- a/src/test/skript/tests/regressions/6843-current section reference issue.sk +++ b/src/test/skript/tests/regressions/6843-current section reference issue.sk @@ -6,4 +6,4 @@ test "outdated current section references": loop {_list::*}: set {_var} to loop-value set {_var} to loop-value-1 - assert last parse logs is not set with "loop-value and loop-value-1 should've worked: %last parse logs%" + assert last parse logs is not set with "loop-value and loop-value-1 should've worked"