Skip to content

Commit

Permalink
do not map Serializable classes and their members
Browse files Browse the repository at this point in the history
  • Loading branch information
SpaceWalkerRS committed Nov 28, 2024
1 parent 9a84fcf commit d55ad17
Show file tree
Hide file tree
Showing 6 changed files with 112 additions and 74 deletions.
8 changes: 4 additions & 4 deletions src/main/java/net/fabricmc/stitch/commands/GenState.java
Original file line number Diff line number Diff line change
Expand Up @@ -50,16 +50,16 @@ public static boolean isMappedClass(JarClassEntry c) {
return true;
}

public static boolean isMappedField(JarFieldEntry f) {
return isMappedFieldName(f.getName());
public static boolean isMappedField(Classpath storage, JarClassEntry c, JarFieldEntry f) {
return isMappedFieldName(f.getName()) && !c.isSerializable(storage);
}

public static boolean isMappedFieldName(String name) {
return true; // make sure even unobfuscated fields are given names
return !"serialVersionUID".equals(name); // only skip Java field names, make sure even unobfuscated fields are given names
}

public static boolean isMappedMethod(Classpath storage, JarClassEntry c, JarMethodEntry m) {
return isMappedMethodName(m.getName()) && m.isSource(storage, c) && !isEnumMethod(storage, c, m);
return isMappedMethodName(m.getName()) && m.isSource(storage, c) && !isEnumMethod(storage, c, m) && !c.isSerializable(storage);
}

public static boolean isMappedMethodName(String name) {
Expand Down
46 changes: 26 additions & 20 deletions src/main/java/net/fabricmc/stitch/commands/GenStateMerged.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,19 +63,22 @@ public void generate(File file, Classpath storage, List<Classpath> storagesOld)
private String inheritFieldName(Classpath storage, Classpath storageOld, JarClassEntry c, JarFieldEntry f, GenMap newToOld, GenMap oldToIntermediary) {
EntryTriple findEntry = newToOld.getField(c.getName(), f.getName(), f.getDescriptor());
if (findEntry != null) {
EntryTriple findIntermediaryEntry = oldToIntermediary.getField(findEntry);
if (findIntermediaryEntry != null) {
return findIntermediaryEntry.getName();
} else if (!isMappedFieldName(findEntry.getName())) {
return findEntry.getName();
JarClassEntry oldClass = storageOld.getClass(findEntry.getOwner());
if (oldClass != null && !oldClass.isSerializable(storageOld)) {
EntryTriple findIntermediaryEntry = oldToIntermediary.getField(findEntry);
if (findIntermediaryEntry != null) {
return findIntermediaryEntry.getName();
} else if (!isMappedFieldName(findEntry.getName())) {
return findEntry.getName();
}
}
}
return null;
}

@Nullable
private String getFieldName(Classpath storage, List<Classpath> storagesOld, JarClassEntry c, JarFieldEntry f) {
if (!isMappedField(f)) {
if (!isMappedField(storage, c, f)) {
return null;
}

Expand Down Expand Up @@ -145,19 +148,19 @@ private void findNames(Classpath storage, Classpath storageOld, JarClassEntry c,
if (findEntry == null && newToOld != null) {
findEntry = newToOld.getMethod(cc.getName(), m.getName(), m.getDescriptor());
if (findEntry != null) {
EntryTriple oldEntry = findEntry;
findEntry = oldToIntermediary.getMethod(oldEntry);
if (findEntry != null) {
names.computeIfAbsent(findEntry.getName(), (s) -> new TreeSet<>()).add(getNamesListEntry(storage, cc) + suffix);
} else {
if (!isMappedMethodName(oldEntry.getName())) {
names.computeIfAbsent(oldEntry.getName(), (s) -> new TreeSet<>()).add(getNamesListEntry(storage, cc) + suffix);
JarClassEntry oldClass = storageOld.getClass(findEntry.getOwner());
if (oldClass != null && !oldClass.isSerializable(storageOld)) {
EntryTriple oldEntry = findEntry;
findEntry = oldToIntermediary.getMethod(oldEntry);
if (findEntry != null) {
names.computeIfAbsent(findEntry.getName(), (s) -> new TreeSet<>()).add(getNamesListEntry(storage, cc) + suffix);
} else {
// more involved...
JarClassEntry oldBase = storageOld.getClass(oldEntry.getOwner());
if (oldBase != null) {
JarMethodEntry oldM = oldBase.getMethod(oldEntry.getName() + oldEntry.getDesc());
List<JarClassEntry> cccList = oldM.getMatchingEntries(storageOld, oldBase);
if (!isMappedMethodName(oldEntry.getName())) {
names.computeIfAbsent(oldEntry.getName(), (s) -> new TreeSet<>()).add(getNamesListEntry(storage, cc) + suffix);
} else {
// more involved...
JarMethodEntry oldM = oldClass.getMethod(oldEntry.getName() + oldEntry.getDesc());
List<JarClassEntry> cccList = oldM.getMatchingEntries(storageOld, oldClass);

for (JarClassEntry ccc : cccList) {
findEntry = oldToIntermediary.getMethod(ccc.getName(), oldM.getName(), oldM.getDescriptor());
Expand Down Expand Up @@ -288,7 +291,7 @@ private void addClass(BufferedWriter writer, Classpath storage, List<Classpath>
}
}

if ((c.isInner() || c.isLocal()) ? !isObfuscated(c.getInnerName()) : (!c.isAnonymous() && fullName.indexOf('$') < 0 && !isObfuscated(fullName))) {
if (c.isSerializable(storage) || ((c.isInner() || c.isLocal()) ? !isObfuscated(c.getInnerName()) : (!c.isAnonymous() && fullName.indexOf('$') < 0 && !isObfuscated(fullName)))) {
translatedPrefix = fullName;
} else {
if (!isMappedClass(c)) {
Expand Down Expand Up @@ -365,7 +368,7 @@ private void addClass(BufferedWriter writer, Classpath storage, List<Classpath>
for (JarMethodEntry m : c.getMethods()) {
String mName = getMethodName(storage, storagesOld, c, m);
if (mName == null) {
if (!m.getName().startsWith("<") && m.isSource(storage, c) && !isEnumMethod(storage, c, m)) {
if (m.getName().charAt(0) != '<' && m.isSource(storage, c) && !isEnumMethod(storage, c, m)) {
mName = m.getName();
}
}
Expand Down Expand Up @@ -413,6 +416,9 @@ private Pair<String, String> inheritClassName(String fullName, Classpath stroage
if (!oldEntry.isAnonymous() && c.isAnonymous()) {
cname = cname.substring(cname.indexOf("C_") + 2);
}
if (oldEntry.isSerializable(storageOld)) {
cname = null;
}
}
}
}
Expand Down
Loading

0 comments on commit d55ad17

Please sign in to comment.