Add in some caching of the read field descriptions for efficiency

This commit is contained in:
Christian 2013-04-15 17:30:35 -04:00
parent 03bc9cf00a
commit 1a9cb9e3c9
1 changed files with 31 additions and 18 deletions

View File

@ -39,6 +39,7 @@ import com.google.common.collect.ImmutableBiMap;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
@ -148,30 +149,42 @@ public class FMLDeobfuscatingRemapper extends Remapper {
rawFieldMaps.get(cl).put(oldName + ":null", newName); rawFieldMaps.get(cl).put(oldName + ":null", newName);
} }
@SuppressWarnings("unchecked") /*
private String getFieldType(String owner, String name) * Cache the field descriptions for classes so we don't repeatedly reload the same data again and again
*/
private Map<String,Map<String,String>> fieldDescriptions = Maps.newHashMap();
private String getFieldType(String owner, String name)
{ {
try if (fieldDescriptions.containsKey(owner))
{ {
byte[] classBytes = classLoader.getClassBytes(owner); return fieldDescriptions.get(owner).get(name);
if (classBytes == null) }
synchronized (fieldDescriptions)
{
try
{ {
return null; byte[] classBytes = classLoader.getClassBytes(owner);
} if (classBytes == null)
ClassReader cr = new ClassReader(classBytes); {
ClassNode classNode = new ClassNode(); return null;
cr.accept(classNode, ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
for (FieldNode fieldNode : (List<FieldNode>) classNode.fields) {
if (fieldNode.name.equals(name)) {
return fieldNode.desc;
} }
ClassReader cr = new ClassReader(classBytes);
ClassNode classNode = new ClassNode();
cr.accept(classNode, ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
Map<String,String> resMap = Maps.newHashMap();
for (FieldNode fieldNode : classNode.fields) {
resMap.put(fieldNode.name, fieldNode.desc);
}
fieldDescriptions.put(owner, resMap);
return resMap.get(name);
} }
catch (IOException e)
{
FMLLog.log(Level.SEVERE,e, "A critical exception occured reading a class file %s", owner);
}
return null;
} }
catch (IOException e)
{
e.printStackTrace();
}
return null;
} }
private void parseClass(Builder<String, String> builder, String[] parts) private void parseClass(Builder<String, String> builder, String[] parts)