Skip to content

Commit 942f7ec

Browse files
committed
Merge branch 'master' into interpreter-recycling
2 parents fa41e15 + 75dd08c commit 942f7ec

62 files changed

Lines changed: 2182 additions & 794 deletions

File tree

Some content is hidden

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

Wurstpack/wurstscript/grill.cmd

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
@echo off
2-
setlocal
2+
setlocal EnableExtensions DisableDelayedExpansion
33

4-
rem Save current code page
5-
for /f "tokens=2 delims=: " %%A in ('chcp') do set "_OLDCP=%%A"
4+
rem Save current code page (extract number after ':')
5+
for /f "tokens=2 delims=:" %%A in ('chcp') do for /f "tokens=1" %%B in ("%%A") do set "_OLDCP=%%B"
66

77
rem Switch to UTF-8 for this session
88
chcp 65001 >NUL
@@ -38,3 +38,4 @@ rem Restore previous code page if we captured it
3838
if defined _OLDCP chcp %_OLDCP% >NUL
3939

4040
endlocal
41+
exit /b %ERRORLEVEL%

Wurstpack/wurstscript/wurstscript.cmd

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
@echo off
2-
setlocal
2+
setlocal EnableExtensions DisableDelayedExpansion
33

4-
rem Save current code page
5-
for /f "tokens=2 delims=: " %%A in ('chcp') do set "_OLDCP=%%A"
4+
rem Save current code page (extract number after ':')
5+
for /f "tokens=2 delims=:" %%A in ('chcp') do for /f "tokens=1" %%B in ("%%A") do set "_OLDCP=%%B"
66

77
rem Switch to UTF-8
88
chcp 65001 >NUL
@@ -34,3 +34,4 @@ if not exist "%JAVA%" (
3434
:restore
3535
if defined _OLDCP chcp %_OLDCP% >NUL
3636
endlocal
37+
exit /b %ERRORLEVEL%

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
@@ -53,6 +53,8 @@ public class CompiletimeFunctionRunner {
5353
private boolean injectObjects;
5454
private final Deque<Runnable> delayedActions = new ArrayDeque<>();
5555
private final Map<ClassManagementVars, List<CompiletimeObjectInit>> compiletimeObjects = new LinkedHashMap<>();
56+
private final Map<String, Long> compiletimeFunctionNanos = new LinkedHashMap<>();
57+
private long compiletimeExprNanos = 0L;
5658

5759
public ILInterpreter getInterpreter() {
5860
return interpreter;
@@ -99,22 +101,30 @@ public CompiletimeFunctionRunner(
99101

100102
public void run() {
101103
try {
104+
long t0 = System.nanoTime();
102105
List<Either<ImCompiletimeExpr, ImFunction>> toExecute = new ArrayList<>();
103106
collectCompiletimeExpressions(toExecute);
104107
collectCompiletimeFunctions(toExecute);
108+
long tCollected = System.nanoTime();
105109

106110
toExecute.sort(Comparator.comparing(this::getOrderIndex));
111+
long tSorted = System.nanoTime();
107112

108113
execute(toExecute);
114+
long tExecuted = System.nanoTime();
109115

110116

111117
if (functionFlag == FunctionFlagToRun.CompiletimeFunctions) {
112118
interpreter.writebackGlobalState(isInjectObjects());
113119
}
120+
long tWriteback = System.nanoTime();
114121
runDelayedActions();
115122
emitCompiletimeObjectAllocs();
123+
long tDelayed = System.nanoTime();
116124

117125
partitionCompiletimeStateInitFunction();
126+
long tPartitioned = System.nanoTime();
127+
logCompiletimeTiming(toExecute, t0, tCollected, tSorted, tExecuted, tWriteback, tDelayed, tPartitioned);
118128

119129
} catch (InterpreterException e) {
120130
Element origin = e.getTrace();
@@ -139,6 +149,48 @@ public void run() {
139149

140150
}
141151

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

224276

225277
private void executeCompiletimeExpr(ImCompiletimeExpr cte) {
278+
long t0 = System.nanoTime();
226279
try {
227280
ProgramState globalState = interpreter.getGlobalState();
228281
globalState.setLastStatement(cte);
@@ -264,6 +317,8 @@ private void executeCompiletimeExpr(ImCompiletimeExpr cte) {
264317
e.setStacktrace(msg);
265318
e.setTrace(cte.attrTrace());
266319
throw e;
320+
} finally {
321+
compiletimeExprNanos += System.nanoTime() - t0;
267322
}
268323
}
269324

@@ -555,11 +610,12 @@ private ImFunction findNative(String funcName, WPos trace) {
555610

556611
private void executeCompiletimeFunction(ImFunction f) {
557612
if (functionFlag.matches(f)) {
613+
long t0 = System.nanoTime();
558614
try {
559615
if (!f.getBody().isEmpty()) {
560616
interpreter.getGlobalState().setLastStatement(f.getBody().get(0));
561617
}
562-
WLogger.debug("running " + functionFlag + " function " + f.getName());
618+
WLogger.trace(() -> "running " + functionFlag + " function " + f.getName());
563619
interpreter.runVoidFunc(f, null);
564620
successTests.add(f);
565621
} catch (TestSuccessException e) {
@@ -569,6 +625,8 @@ private void executeCompiletimeFunction(ImFunction f) {
569625
} catch (Throwable e) {
570626
failTests.put(f, Pair.create(interpreter.getLastStatement(), e.toString()));
571627
throw e;
628+
} finally {
629+
compiletimeFunctionNanos.merge(f.getName(), System.nanoTime() - t0, Long::sum);
572630
}
573631
}
574632
}

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: 16 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();
@@ -561,7 +563,12 @@ public JassProg transformProgToJass() {
561563
// translate flattened intermediate lang to jass:
562564

563565
beginPhase(14, "translate to jass");
564-
getImTranslator().calculateCallRelationsAndUsedVariables();
566+
optimizer.removeGarbage();
567+
imProg.flatten(imTranslator);
568+
imTranslator.removeEmptyPackageInits();
569+
optimizer.removeGarbage();
570+
imProg.flatten(imTranslator);
571+
getImTranslator().calculateCallRelationsAndReadVariables();
565572
ImToJassTranslator translator =
566573
new ImToJassTranslator(getImProg(), getImTranslator().getCalledFunctions(), getImTranslator().getMainFunc(), getImTranslator().getConfFunc());
567574
prog = translator.translate();
@@ -952,12 +959,14 @@ public LuaCompilationUnit transformProgToLua() {
952959

953960
printDebugImProg("./test-output/lua/im " + stage++ + "_afterlocalopts.im");
954961

955-
optimizer.removeGarbage();
962+
boolean garbageChanged = optimizer.removeGarbage();
956963
imProg.flatten(imTranslator);
957964

958965
// Re-run to avoid #883
959-
optimizer.removeGarbage();
960-
imProg.flatten(imTranslator);
966+
if (garbageChanged) {
967+
optimizer.removeGarbage();
968+
imProg.flatten(imTranslator);
969+
}
961970

962971
printDebugImProg("./test-output/lua/im " + stage++ + "_afterremoveGarbage1.im");
963972

0 commit comments

Comments
 (0)