Skip to content

Commit ccdc03f

Browse files
committed
review fixes
1 parent 24c4f76 commit ccdc03f

File tree

2 files changed

+66
-50
lines changed

2 files changed

+66
-50
lines changed

de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/EliminateClasses.java

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public class EliminateClasses {
4343
INSTANCE_COUNT,
4444
MAX_INSTANCE_COUNT
4545
);
46+
private final Map<ImClass, Integer> classIds;
4647
private ImFunction typeIdToTypeNameFunc;
4748
private ImFunction maxTypeIdFunc;
4849
private ImFunction instanceCountFunc;
@@ -52,6 +53,7 @@ public EliminateClasses(ImTranslator tr, ImProg prog, boolean checkedDispatch) {
5253
translator = tr;
5354
this.prog = prog;
5455
this.checkedDispatch = checkedDispatch;
56+
this.classIds = TypeId.calculate(prog);
5557
}
5658

5759
public void eliminateClasses() {
@@ -115,7 +117,7 @@ private void createReflectionFunctions() {
115117
@NotNull
116118
private ImFunction maxTypeIdFunc() {
117119
ImVars parameters = JassIm.ImVars();
118-
int maxTypeId = calculateMaxTypeId(prog);
120+
int maxTypeId = calculateMaxTypeId(classIds);
119121
ImFunction f = JassIm.ImFunction(prog.getTrace(), "maxTypeId", JassIm.ImTypeVars(), parameters, imInt(), JassIm.ImVars(), JassIm.ImStmts(JassIm.ImReturn(prog.getTrace(), JassIm.ImIntVal(maxTypeId))), Collections.emptyList());
120122
prog.getFunctions().add(f);
121123
return f;
@@ -144,11 +146,9 @@ private ImFunction accessClassManagementVar(String funcName, ImType returnType,
144146
ImVar typeId = JassIm.ImVar(trace, TypesHelper.imInt(), "typeId", false);
145147
ImVars parameters = JassIm.ImVars(typeId);
146148
ImVars locals = JassIm.ImVars();
147-
// Use fresh IDs from current classes to avoid stale attrTypeId cache inconsistencies.
148-
Map<ImClass, Integer> classId = TypeId.calculate(prog);
149-
int maxTypeId = calculateMaxTypeId(classId);
149+
int maxTypeId = calculateMaxTypeId(classIds);
150150
ImClass[] typeIdToClass = new ImClass[maxTypeId + 1];
151-
for (Map.Entry<ImClass, Integer> e : classId.entrySet()) {
151+
for (Map.Entry<ImClass, Integer> e : classIds.entrySet()) {
152152
typeIdToClass[e.getValue()] = e.getKey();
153153
}
154154
ImStmts body = generateBinarySearch(1, maxTypeId, typeId, typeIdToClass, makeAccess);
@@ -561,7 +561,7 @@ private void calculateTypeIdToMethodHelper(ImClass c,
561561
}
562562
}
563563
if (current != null) {
564-
typeIdToMethod.put(c.attrTypeId(), current);
564+
typeIdToMethod.put(typeIdOf(c), current);
565565
}
566566
// process subclasses:
567567
for (ImClass sc : c.attrSubclasses()) {
@@ -687,16 +687,15 @@ private void replaceTypeIdOfObj(ImTypeIdOfObj e) {
687687
}
688688

689689
private void replaceTypeIdOfClass(ImTypeIdOfClass e) {
690-
e.replaceBy(JassIm.ImIntVal(e.getClazz().getClassDef().attrTypeId()));
690+
e.replaceBy(JassIm.ImIntVal(typeIdOf(e.getClazz().getClassDef())));
691691
}
692692

693693
private void replaceInstanceof(ImInstanceof e) {
694694
ImFunction f = e.getNearestFunc();
695695
List<ImClass> allSubClasses = getAllSubclasses(e.getClazz().getClassDef());
696696
List<Integer> subClassIds = new ArrayList<>();
697697
for (ImClass allSubClass : allSubClasses) {
698-
Integer attrTypeId = allSubClass.attrTypeId();
699-
subClassIds.add(attrTypeId);
698+
subClassIds.add(typeIdOf(allSubClass));
700699
}
701700
List<IntRange> idRanges = IntRange.createFromIntList(subClassIds);
702701
ImExpr obj = e.getObj();
@@ -756,6 +755,18 @@ private void getAllSubclassesH(List<ImClass> result, ImClass clazz) {
756755
}
757756
}
758757

758+
private int typeIdOf(ImClass c) {
759+
Integer id = classIds.get(c);
760+
if (id != null) {
761+
return id;
762+
}
763+
Integer fallback = TypeId.calculate(prog).get(c);
764+
if (fallback != null) {
765+
return fallback;
766+
}
767+
throw new CompileError(c, "Could not resolve type id for class " + c.getName() + ".");
768+
}
769+
759770
private void replaceDealloc(ImDealloc e) {
760771
ImFunction deallocFunc = translator.deallocFunc.getFor(e.getClazz().getClassDef());
761772
ImExpr obj = e.getObj();

de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/ImTranslator.java

Lines changed: 46 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -2029,20 +2029,35 @@ public ClassManagementVars getClassManagementVarsFor(ImClass c) {
20292029
if (res != null) {
20302030
return res;
20312031
}
2032-
debugClassManagementMiss("first lookup miss", c, vars);
2033-
// Recover from stale/mutated key situations by rebuilding from current classes.
2034-
classManagementVars = null;
2035-
vars = getClassManagementVars();
2036-
res = vars.get(c);
2037-
if (res != null) {
2038-
return res;
2032+
// Try to recover by aliasing to an already existing entry without rebuilding.
2033+
ClassManagementVars alias = findClassManagementAlias(c, vars);
2034+
if (alias != null) {
2035+
vars.put(c, alias);
2036+
return alias;
2037+
}
2038+
// Extend mapping for current class graph only; do not clear and rebuild map,
2039+
// as rebuilding creates duplicate globals/initializers.
2040+
Partitions<ImClass> p = buildClassPartitions();
2041+
p.add(c);
2042+
for (ImClassType sc : c.getSuperClasses()) {
2043+
p.union(c, sc.getClassDef());
2044+
}
2045+
ImClass rep = p.getRep(c);
2046+
ClassManagementVars repVars = vars.get(rep);
2047+
if (repVars == null) {
2048+
repVars = findClassManagementAlias(rep, vars);
2049+
if (repVars == null) {
2050+
repVars = new ClassManagementVars(rep, this);
2051+
}
2052+
vars.put(rep, repVars);
2053+
}
2054+
for (ImClass cls : imProg.getClasses()) {
2055+
if (p.getRep(cls) == rep) {
2056+
vars.putIfAbsent(cls, repVars);
2057+
}
20392058
}
2040-
debugClassManagementMiss("after rebuild miss", c, vars);
2041-
// Last-resort fallback: ensure compilation does not crash language-server requests.
2042-
WLogger.info("ClassManagementVars missing for class " + c.getName() + ", creating fallback mapping.");
2043-
ClassManagementVars fallback = new ClassManagementVars(c, this);
2044-
vars.put(c, fallback);
2045-
return fallback;
2059+
vars.put(c, repVars);
2060+
return repVars;
20462061
}
20472062

20482063

@@ -2054,15 +2069,7 @@ public Map<ImClass, ClassManagementVars> getClassManagementVars() {
20542069
if (classManagementVars != null) {
20552070
return classManagementVars;
20562071
}
2057-
// create partitions, such that each sub-class and super-class are in
2058-
// the same partition
2059-
Partitions<ImClass> p = new Partitions<>();
2060-
for (ImClass c : imProg.getClasses()) {
2061-
p.add(c);
2062-
for (ImClassType sc : c.getSuperClasses()) {
2063-
p.union(c, sc.getClassDef());
2064-
}
2065-
}
2072+
Partitions<ImClass> p = buildClassPartitions();
20662073
// generate typeId variables
20672074
classManagementVars = new IdentityHashMap<>();
20682075
for (ImClass c : imProg.getClasses()) {
@@ -2073,27 +2080,25 @@ public Map<ImClass, ClassManagementVars> getClassManagementVars() {
20732080
return classManagementVars;
20742081
}
20752082

2076-
private void debugClassManagementMiss(String stage, ImClass c, Map<ImClass, ClassManagementVars> vars) {
2077-
StringBuilder sb = new StringBuilder();
2078-
sb.append("[ClassMgmt] ").append(stage)
2079-
.append(" target=").append(c.getName())
2080-
.append("#").append(System.identityHashCode(c))
2081-
.append(" mapSize=").append(vars.size());
2082-
int sameName = 0;
2083-
int sameIdentity = 0;
2084-
for (ImClass k : vars.keySet()) {
2085-
if (k == c) sameIdentity++;
2086-
if (k.getName().equals(c.getName())) {
2087-
sameName++;
2088-
if (sameName <= 5) {
2089-
sb.append(" | sameNameKey=").append(k.getName())
2090-
.append("#").append(System.identityHashCode(k));
2091-
}
2083+
private Partitions<ImClass> buildClassPartitions() {
2084+
Partitions<ImClass> p = new Partitions<>();
2085+
for (ImClass c : imProg.getClasses()) {
2086+
p.add(c);
2087+
for (ImClassType sc : c.getSuperClasses()) {
2088+
p.union(c, sc.getClassDef());
2089+
}
2090+
}
2091+
return p;
2092+
}
2093+
2094+
private @Nullable ClassManagementVars findClassManagementAlias(ImClass target, Map<ImClass, ClassManagementVars> vars) {
2095+
for (Map.Entry<ImClass, ClassManagementVars> e : vars.entrySet()) {
2096+
ImClass k = e.getKey();
2097+
if (k == target || k.attrTrace() == target.attrTrace()) {
2098+
return e.getValue();
20922099
}
20932100
}
2094-
sb.append(" | sameNameCount=").append(sameName)
2095-
.append(" sameIdentityCount=").append(sameIdentity);
2096-
WLogger.info(sb.toString());
2101+
return null;
20972102
}
20982103

20992104

0 commit comments

Comments
 (0)