Skip to content

Commit 227f9f3

Browse files
MweximMwexim
and
Mwexim
authored
improve: cache clearing improvements (#88)
* improve: cache clearing improvements * improve: add EffContinue test for while loops * improve: change the Expression javadocs to be more informative Co-authored-by: Mwexim <[email protected]>
1 parent d9aaf95 commit 227f9f3

File tree

15 files changed

+48
-32
lines changed

15 files changed

+48
-32
lines changed

src/main/java/io/github/syst3ms/skriptparser/Skript.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import io.github.syst3ms.skriptparser.lang.SkriptEvent;
55
import io.github.syst3ms.skriptparser.lang.Statement;
66
import io.github.syst3ms.skriptparser.lang.Trigger;
7+
import io.github.syst3ms.skriptparser.lang.base.ExecutableExpression;
78
import io.github.syst3ms.skriptparser.registration.SkriptAddon;
89
import io.github.syst3ms.skriptparser.util.ThreadUtils;
910
import io.github.syst3ms.skriptparser.util.Time;
@@ -70,4 +71,9 @@ public void finishedLoading() {
7071
ThreadUtils.runPeriodically(() -> Statement.runAll(trigger, ctx), initialDelay, Duration.ofDays(1));
7172
}
7273
}
74+
75+
@Override
76+
public void walkingForward() {
77+
ExecutableExpression.getCachedValues().clear();
78+
}
7379
}

src/main/java/io/github/syst3ms/skriptparser/effects/EffAsync.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public boolean init(Expression<?>[] expressions, int matchedPattern, ParseContex
4444

4545
@Override
4646
public void execute(TriggerContext ctx) {
47-
ThreadUtils.runAsync(() -> effect.walk(ctx, true));
47+
ThreadUtils.runAsync(() -> effect.walk(ctx));
4848
}
4949

5050
@Override

src/main/java/io/github/syst3ms/skriptparser/effects/EffChange.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,9 +163,10 @@ public void execute(TriggerContext ctx) {
163163
if (changeWith == null) {
164164
changed.change(ctx, new Object[0], mode);
165165
} else {
166-
if (changeWith.getValues(ctx).length == 0)
166+
var values= changeWith.getValues(ctx);
167+
if (values.length == 0)
167168
return;
168-
changed.change(ctx, changeWith.getValues(ctx), mode);
169+
changed.change(ctx, values, mode);
169170
}
170171
}
171172
}

src/main/java/io/github/syst3ms/skriptparser/effects/EffContinue.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ public void execute(TriggerContext ctx) {
5858
}
5959

6060
@Override
61-
protected Optional<? extends Statement> walk(TriggerContext ctx) {
62-
loop.walk(ctx, true);
61+
public Optional<? extends Statement> walk(TriggerContext ctx) {
62+
loop.walk(ctx);
6363
return Optional.empty();
6464
}
6565

src/main/java/io/github/syst3ms/skriptparser/effects/EffDoIf.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public boolean init(Expression<?>[] expressions, int matchedPattern, ParseContex
5353
@Override
5454
public void execute(TriggerContext ctx) {
5555
if (condition.getSingle(ctx).filter(b -> b).isPresent())
56-
effect.walk(ctx, true);
56+
effect.walk(ctx);
5757
}
5858

5959
@Override

src/main/java/io/github/syst3ms/skriptparser/effects/EffWait.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,10 @@ public Optional<? extends Statement> walk(TriggerContext ctx) {
6767
return Optional.empty();
6868

6969
if (isConditional) {
70+
var cond = condition.getSingle(ctx);
7071
// The code we want to run each check.
7172
Consumer<ExecutorService> code = exec -> {
72-
if (condition.getSingle(ctx).filter(b -> negated == b).isPresent()) {
73+
if (cond.filter(b -> negated == b).isPresent()) {
7374
Statement.runAll(getNext().get(), ctx);
7475
exec.shutdownNow();
7576
}

src/main/java/io/github/syst3ms/skriptparser/expressions/CondExprCompare.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -244,8 +244,7 @@ private boolean initialize() {
244244
: ClassUtils.getCommonSuperclass(second.getReturnType(), third.getReturnType());
245245
if (f == Object.class || s == Object.class)
246246
return true;
247-
comp = (Comparator<Object, Object>) Comparators.getComparator(f, s).orElse(null);
248-
return comp != null;
247+
return (comp = (Comparator<Object, Object>) Comparators.getComparator(f, s).orElse(null)) != null;
249248
}
250249

251250
/*

src/main/java/io/github/syst3ms/skriptparser/lang/Expression.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
public interface Expression<T> extends SyntaxElement {
3030
/**
3131
* Retrieves all values of this Expression.
32+
* Note that this method may have possible side-effects.
3233
* @param ctx the event
3334
* @return an array of the values
3435
*/

src/main/java/io/github/syst3ms/skriptparser/lang/Statement.java

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.github.syst3ms.skriptparser.lang;
22

33
import io.github.syst3ms.skriptparser.lang.base.ExecutableExpression;
4+
import io.github.syst3ms.skriptparser.registration.SkriptAddon;
45
import org.jetbrains.annotations.Nullable;
56

67
import java.util.Optional;
@@ -26,7 +27,7 @@ public static boolean runAll(Statement start, TriggerContext context) {
2627
Optional<? extends Statement> item = Optional.of(start);
2728
try {
2829
while (item.isPresent())
29-
item = item.flatMap(i -> i.walk(context, true));
30+
item = item.flatMap(i -> i.walk(context));
3031
return true;
3132
} catch (StackOverflowError so) {
3233
System.err.println("The script repeated itself infinitely !");
@@ -88,25 +89,15 @@ public Statement setNext(@Nullable Statement next) {
8889
/**
8990
* By default, runs {@link #run(TriggerContext)} ; returns {@link #getNext()} if it returns true, or {@code null} otherwise.
9091
* Note that if this method is overridden, then the implementation of {@linkplain #run(TriggerContext)} doesn't matter.
92+
* <br>
93+
* This method also calls {@link SkriptAddon#walkingForward()} for all registered addons. This
94+
* implementation is not particularly required, unless you are make extensive use of {@link ExecutableExpression}
95+
* and cache that needs to be cleared after each statement.
9196
* @param ctx the event
92-
* @param clearCache whether or not some of the ongoing cache should be cleared
9397
* @return the next item to be ran, or {@code null} if this is the last item to be executed
9498
*/
95-
public final Optional<? extends Statement> walk(TriggerContext ctx, boolean clearCache) {
96-
if (clearCache) {
97-
// Clear all cache needed to be cleared.
98-
ExecutableExpression.getCachedValues().clear();
99-
}
100-
return walk(ctx);
101-
}
102-
103-
/**
104-
* By default, runs {@link #run(TriggerContext)} ; returns {@link #getNext()} if it returns true, or {@code null} otherwise.
105-
* Note that if this method is overridden, then the implementation of {@linkplain #run(TriggerContext)} doesn't matter.
106-
* @param ctx the event
107-
* @return the next item to be ran, or {@code null} if this is the last item to be executed
108-
*/
109-
protected Optional<? extends Statement> walk(TriggerContext ctx) {
99+
public Optional<? extends Statement> walk(TriggerContext ctx) {
100+
SkriptAddon.getAddons().forEach(SkriptAddon::walkingForward);
110101
var proceed = run(ctx);
111102
if (proceed) {
112103
return getNext();

src/main/java/io/github/syst3ms/skriptparser/lang/lambda/SkriptConsumer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public void accept(TriggerContext ctx, Object... args) {
4141
var item = starterFunction.apply(section);
4242
while (item.isPresent()) {
4343
var cur = item.orElse(null);
44-
item = item.flatMap(s -> s.walk(ctx, true));
44+
item = item.flatMap(s -> s.walk(ctx));
4545
if (stepFunction.test(section, cur)) {
4646
break;
4747
}

src/main/java/io/github/syst3ms/skriptparser/lang/lambda/SkriptFunction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public Optional<T[]> apply(TriggerContext ctx, Object... args) {
4545
var item = starterFunction.apply(section);
4646
while (item.isPresent()) {
4747
var cur = item.orElse(null);
48-
item = item.flatMap(s -> s.walk(ctx, true));
48+
item = item.flatMap(s -> s.walk(ctx));
4949
var stepResult = stepFunction.apply(section, cur);
5050
if (stepResult.isPresent()) {
5151
result = stepResult.get();

src/main/java/io/github/syst3ms/skriptparser/registration/SkriptAddon.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@ public static List<SkriptAddon> getAddons() {
3636
*/
3737
public void finishedLoading() {}
3838

39+
/**
40+
* Is called when moving to the next statement of the parser. Optionally overridable.
41+
* Note that this is not always called, only in most occasions.
42+
*/
43+
public void walkingForward() {}
44+
3945
/**
4046
* Checks to see whether the given event has been registered by this SkriptAddon ; a basic way to filter out
4147
* triggers you aren't able to deal with in {@link SkriptAddon#handleTrigger(Trigger)}.

src/main/java/io/github/syst3ms/skriptparser/sections/SecAsync.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public Optional<? extends Statement> walk(TriggerContext ctx) {
5151
Optional<? extends Statement>[] item = new Optional[]{getFirst()};
5252
ThreadUtils.runAsync(() -> {
5353
while (!item[0].equals(getNext())) // Calling equals() on optionals calls equals() on their values
54-
item[0] = item[0].flatMap(i -> i.walk(ctx, true));
54+
item[0] = item[0].flatMap(i -> i.walk(ctx));
5555
});
5656
return getNext();
5757
}

src/test/java/io/github/syst3ms/skriptparser/syntax/SecBirth.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public boolean init(Expression<?>[] expressions, int matchedPattern, ParseContex
5454
public Optional<? extends Statement> walk(TriggerContext ctx) {
5555
var item = getFirst();
5656
while (!item.equals(getNext())) {
57-
item = item.flatMap(val -> val.walk(ctx, true));
57+
item = item.flatMap(val -> val.walk(ctx));
5858
}
5959
if (currentDeaths.isEmpty()) {
6060
SyntaxParserTest.addError(new SkriptRuntimeException(

src/test/resources/effects/EffContinue.txt

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,22 @@
22
# - CHarcoalToast
33
# - Mwexim
44
# Date: 2020/10/31
5+
# - 2020/12/27
56

67
test:
7-
{var} = 0
8+
set {var} to 0
89
loop 5 times:
910
if loop-value < 3:
1011
continue
1112
add 1 to {var}
12-
assert {var} = 3 with "'continue'-statement didn't work properly: %{var}% != 3"
13+
assert {var} = 3 with "{var} (in loop) should equal 3: %{var}%"
14+
15+
set {var} to 0
16+
set {flag} to 0
17+
while {var} < 1:
18+
if {flag} < 5:
19+
add 1 to {flag}
20+
continue
21+
add 1 to {var}
22+
assert {var} = 1 with "{var} (in while) should equal 1: %{var}%"
23+
assert {flag} = 4 with "{flag} (in while) should equal 4: %{flag}%"

0 commit comments

Comments
 (0)