Skip to content

Commit a7606ec

Browse files
committed
Merge branch 'master' into less-garbage
2 parents c61c893 + 03acf56 commit a7606ec

46 files changed

Lines changed: 1017 additions & 746 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

de.peeeq.wurstscript/build.gradle

Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -103,15 +103,18 @@ dependencies {
103103
implementation 'org.eclipse.lsp4j:org.eclipse.lsp4j:0.24.0'
104104
implementation 'org.eclipse.jdt:org.eclipse.jdt.annotation:2.1.0'
105105
implementation 'com.google.code.gson:gson:2.10.1'
106-
implementation 'org.apache.velocity:velocity:1.7'
106+
implementation 'commons-lang:commons-lang:2.6'
107107
implementation 'com.github.albfernandez:juniversalchardet:2.4.0'
108108
implementation 'com.github.inwc3:jmpq3:29b55f2c32'
109-
implementation 'com.github.inwc3:wc3libs:bab65b961b'
110-
implementation 'com.github.wurstscript:wurstsetup:393cf5ea39'
109+
implementation 'com.github.inwc3:wc3libs:cc49c8e63c'
110+
implementation('com.github.wurstscript:wurstsetup:393cf5ea39') {
111+
exclude group: 'org.eclipse.jgit', module: 'org.eclipse.jgit'
112+
exclude group: 'org.eclipse.jgit', module: 'org.eclipse.jgit.ssh.apache'
113+
}
111114
implementation 'org.slf4j:slf4j-api:2.0.17'
112115
implementation 'ch.qos.logback:logback-classic:1.5.20'
113-
implementation 'org.eclipse.jgit:org.eclipse.jgit:6.7.0.202309050840-r'
114-
implementation 'org.eclipse.jgit:org.eclipse.jgit.ssh.apache:6.7.0.202309050840-r'
116+
testImplementation 'org.eclipse.jgit:org.eclipse.jgit:6.7.0.202309050840-r'
117+
testImplementation 'org.eclipse.jgit:org.eclipse.jgit.ssh.apache:6.7.0.202309050840-r'
115118
implementation 'it.unimi.dsi:fastutil:8.5.16'
116119

117120
// Smallcheck
@@ -339,27 +342,7 @@ tasks.register('create_zips') {
339342
}
340343
}
341344

342-
/** -------- Hotdoc generation -------- */
343-
344-
tasks.register('generate_hotdoc') {
345-
dependsOn 'compileJava', 'downloadAndUnzipFile'
346-
347-
doLast {
348-
ExecOperations execOps = project.services.get(ExecOperations)
349-
350-
copy {
351-
from("src/main/resources/")
352-
// Gradle 9 output classes dir
353-
into("build/classes/java/main/")
354-
}
355-
execOps.javaexec {
356-
classpath = sourceSets.main.runtimeClasspath
357-
mainClass.set('de.peeeq.wurstio.Main')
358-
args("--hotdoc", "./build/deps/", "../downloads/hotdoc")
359-
}
360-
}
361-
}
362-
345+
// TODO add a modern documentation generator replacement for the removed legacy hotdoc pipeline.
363346
tasks.named("coveralls") {
364347
notCompatibleWithConfigurationCache("coveralls plugin task uses Project at execution time")
365348
}

de.peeeq.wurstscript/src/main/java/de/peeeq/wurstio/CompiletimeFunctionRunner.java

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ public class CompiletimeFunctionRunner {
5151
private final ImTranslator translator;
5252
private boolean injectObjects;
5353
private final Deque<Runnable> delayedActions = new ArrayDeque<>();
54+
private final Map<String, Long> compiletimeFunctionNanos = new LinkedHashMap<>();
55+
private long compiletimeExprNanos = 0L;
5456

5557
public ILInterpreter getInterpreter() {
5658
return interpreter;
@@ -97,21 +99,29 @@ public CompiletimeFunctionRunner(
9799

98100
public void run() {
99101
try {
102+
long t0 = System.nanoTime();
100103
List<Either<ImCompiletimeExpr, ImFunction>> toExecute = new ArrayList<>();
101104
collectCompiletimeExpressions(toExecute);
102105
collectCompiletimeFunctions(toExecute);
106+
long tCollected = System.nanoTime();
103107

104108
toExecute.sort(Comparator.comparing(this::getOrderIndex));
109+
long tSorted = System.nanoTime();
105110

106111
execute(toExecute);
112+
long tExecuted = System.nanoTime();
107113

108114

109115
if (functionFlag == FunctionFlagToRun.CompiletimeFunctions) {
110116
interpreter.writebackGlobalState(isInjectObjects());
111117
}
118+
long tWriteback = System.nanoTime();
112119
runDelayedActions();
120+
long tDelayed = System.nanoTime();
113121

114122
partitionCompiletimeStateInitFunction();
123+
long tPartitioned = System.nanoTime();
124+
logCompiletimeTiming(toExecute, t0, tCollected, tSorted, tExecuted, tWriteback, tDelayed, tPartitioned);
115125

116126
} catch (InterpreterException e) {
117127
Element origin = e.getTrace();
@@ -136,6 +146,48 @@ public void run() {
136146

137147
}
138148

149+
private void logCompiletimeTiming(List<Either<ImCompiletimeExpr, ImFunction>> toExecute,
150+
long t0, long tCollected, long tSorted, long tExecuted,
151+
long tWriteback, long tDelayed, long tPartitioned) {
152+
int exprCount = 0;
153+
int funcCount = 0;
154+
for (Either<ImCompiletimeExpr, ImFunction> e : toExecute) {
155+
if (e.isLeft()) {
156+
exprCount++;
157+
} else {
158+
funcCount++;
159+
}
160+
}
161+
WLogger.info(String.format(
162+
"Compiletime breakdown: total=%dms collect=%dms sort=%dms execute=%dms writeback=%dms delayed=%dms partition=%dms funcs=%d exprs=%d exprEval=%dms",
163+
ms(tPartitioned - t0),
164+
ms(tCollected - t0),
165+
ms(tSorted - tCollected),
166+
ms(tExecuted - tSorted),
167+
ms(tWriteback - tExecuted),
168+
ms(tDelayed - tWriteback),
169+
ms(tPartitioned - tDelayed),
170+
funcCount,
171+
exprCount,
172+
ms(compiletimeExprNanos)
173+
));
174+
if (!compiletimeFunctionNanos.isEmpty()) {
175+
List<Map.Entry<String, Long>> top = compiletimeFunctionNanos.entrySet().stream()
176+
.sorted((a, b) -> Long.compare(b.getValue(), a.getValue()))
177+
.limit(10)
178+
.collect(Collectors.toList());
179+
StringBuilder sb = new StringBuilder("Top compiletime functions:");
180+
for (Map.Entry<String, Long> e : top) {
181+
sb.append("\n ").append(e.getKey()).append(": ").append(ms(e.getValue())).append("ms");
182+
}
183+
WLogger.info(sb.toString());
184+
}
185+
}
186+
187+
private static long ms(long nanos) {
188+
return nanos / 1_000_000L;
189+
}
190+
139191
private void partitionCompiletimeStateInitFunction() {
140192
if (compiletimeStateInitFunction == null) {
141193
return;
@@ -220,6 +272,7 @@ public void visit(ImCompiletimeExpr e) {
220272

221273

222274
private void executeCompiletimeExpr(ImCompiletimeExpr cte) {
275+
long t0 = System.nanoTime();
223276
try {
224277
ProgramState globalState = interpreter.getGlobalState();
225278
globalState.setLastStatement(cte);
@@ -261,6 +314,8 @@ private void executeCompiletimeExpr(ImCompiletimeExpr cte) {
261314
e.setStacktrace(msg);
262315
e.setTrace(cte.attrTrace());
263316
throw e;
317+
} finally {
318+
compiletimeExprNanos += System.nanoTime() - t0;
264319
}
265320
}
266321

@@ -491,11 +546,12 @@ private ImFunction findNative(String funcName, WPos trace) {
491546

492547
private void executeCompiletimeFunction(ImFunction f) {
493548
if (functionFlag.matches(f)) {
549+
long t0 = System.nanoTime();
494550
try {
495551
if (!f.getBody().isEmpty()) {
496552
interpreter.getGlobalState().setLastStatement(f.getBody().get(0));
497553
}
498-
WLogger.debug("running " + functionFlag + " function " + f.getName());
554+
WLogger.trace(() -> "running " + functionFlag + " function " + f.getName());
499555
interpreter.runVoidFunc(f, null);
500556
successTests.add(f);
501557
} catch (TestSuccessException e) {
@@ -505,6 +561,8 @@ private void executeCompiletimeFunction(ImFunction f) {
505561
} catch (Throwable e) {
506562
failTests.put(f, Pair.create(interpreter.getLastStatement(), e.toString()));
507563
throw e;
564+
} finally {
565+
compiletimeFunctionNanos.merge(f.getName(), System.nanoTime() - t0, Long::sum);
508566
}
509567
}
510568
}

de.peeeq.wurstscript/src/main/java/de/peeeq/wurstio/Main.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import de.peeeq.wurstio.compilationserver.WurstServer;
88
import de.peeeq.wurstio.gui.AboutDialog;
99
import de.peeeq.wurstio.gui.WurstGuiImpl;
10-
import de.peeeq.wurstio.hotdoc.HotdocGenerator;
1110
import de.peeeq.wurstio.languageserver.LanguageServerStarter;
1211
import de.peeeq.wurstio.languageserver.ProjectConfigBuilder;
1312
import de.peeeq.wurstio.languageserver.WFile;
@@ -97,12 +96,6 @@ public static void main(String[] args) {
9796
return;
9897
}
9998

100-
if (runArgs.createHotDoc()) {
101-
HotdocGenerator hg = new HotdocGenerator(runArgs.getFiles());
102-
hg.generateDoc();
103-
return;
104-
}
105-
10699
if (runArgs.isGui()) {
107100
gui = new WurstGuiImpl();
108101
// use the error reporting with GUI

de.peeeq.wurstscript/src/main/java/de/peeeq/wurstio/WurstCompilerJassImpl.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -535,12 +535,14 @@ public JassProg transformProgToJass() {
535535
}
536536

537537
beginPhase(13, "flatten");
538-
optimizer.removeGarbage();
538+
boolean garbageChanged = optimizer.removeGarbage();
539539
imProg.flatten(imTranslator);
540540

541541
// Re-run to avoid #883
542-
optimizer.removeGarbage();
543-
imProg.flatten(imTranslator);
542+
if (garbageChanged) {
543+
optimizer.removeGarbage();
544+
imProg.flatten(imTranslator);
545+
}
544546

545547
printDebugImProg("./test-output/im " + stage++ + "_afterremoveGarbage1.im");
546548
timeTaker.endPhase();
@@ -566,7 +568,7 @@ public JassProg transformProgToJass() {
566568
imTranslator.removeEmptyPackageInits();
567569
optimizer.removeGarbage();
568570
imProg.flatten(imTranslator);
569-
getImTranslator().calculateCallRelationsAndUsedVariables();
571+
getImTranslator().calculateCallRelationsAndReadVariables();
570572
ImToJassTranslator translator =
571573
new ImToJassTranslator(getImProg(), getImTranslator().getCalledFunctions(), getImTranslator().getMainFunc(), getImTranslator().getConfFunc());
572574
prog = translator.translate();
@@ -957,12 +959,14 @@ public LuaCompilationUnit transformProgToLua() {
957959

958960
printDebugImProg("./test-output/lua/im " + stage++ + "_afterlocalopts.im");
959961

960-
optimizer.removeGarbage();
962+
boolean garbageChanged = optimizer.removeGarbage();
961963
imProg.flatten(imTranslator);
962964

963965
// Re-run to avoid #883
964-
optimizer.removeGarbage();
965-
imProg.flatten(imTranslator);
966+
if (garbageChanged) {
967+
optimizer.removeGarbage();
968+
imProg.flatten(imTranslator);
969+
}
966970

967971
printDebugImProg("./test-output/lua/im " + stage++ + "_afterremoveGarbage1.im");
968972

0 commit comments

Comments
 (0)