From 73ba4b68be2e5eee26064cae5eb835fcfa7b6e3c Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 1 Aug 2012 18:59:45 -0230 Subject: [PATCH] A load of transformer accesses- also a few tweaks to the transformer, and linux support in the fml python --- common/fml_at.cfg | 170 +++++++++++++++++- eclipse/FML-Client/.classpath | 1 + eclipse/FML-Client/.project | 5 + install/fml.py | 13 +- .../asm/transformers/AccessTransformer.java | 48 ++++- 5 files changed, 221 insertions(+), 16 deletions(-) diff --git a/common/fml_at.cfg b/common/fml_at.cfg index 436f311b00..0b71d07ab7 100644 --- a/common/fml_at.cfg +++ b/common/fml_at.cfg @@ -1,2 +1,168 @@ -#Blank FML Access Transformer -public ajh.a(Ljava/lang/Class;Ljava/lang/String;)V \ No newline at end of file +#Main FML Access Transformer configuration file +# TileEntity addMapping +public ajh.a(Ljava/lang/Class;Ljava/lang/String;)V +# EntityList addMappings +public jq.a(Ljava/lang/Class;Ljava/lang/String;I)V +public jq.a(Ljava/lang/Class;Ljava/lang/String;III)V +# EntityList nameToClassMap +public jq.b +# RenderManager renderers +public avx.o +# RenderBlocks - everything +public avf.A +public avf.B +public avf.C +public avf.D +public avf.E +public avf.F +public avf.G +public avf.H +public avf.I +public avf.J +public avf.K +public avf.L +public avf.M +public avf.N +public avf.S +public avf.T +public avf.U +public avf.V +public avf.W +public avf.X +public avf.Y +public avf.Z +public avf.a +public avf.aA +public avf.aB +public avf.aC +public avf.aD +public avf.aE +public avf.aF +public avf.aG +public avf.aH +public avf.aI +public avf.aJ +public avf.aK +public avf.aL +public avf.aM +public avf.aN +public avf.aO +public avf.aa +public avf.ab +public avf.ac +public avf.ad +public avf.ae +public avf.af +public avf.ag +public avf.ah +public avf.ai +public avf.aj +public avf.ak +public avf.al +public avf.am +public avf.an +public avf.ao +public avf.ap +public avf.aq +public avf.ar +public avf.as +public avf.at +public avf.au +public avf.av +public avf.aw +public avf.ax +public avf.ay +public avf.az +public avf.b +public avf.c +public avf.d +public avf.e +public avf.f +public avf.g +public avf.h +public avf.i +public avf.j +public avf.k +public avf.l +public avf.m +public avf.n +public avf.o +public avf.p +public avf.q +public avf.r +public avf.s +public avf.t +public avf.u +public avf.v +public avf.w +public avf.x +public avf.y +public avf.z +public avf.a()V +public avf.a(DDDDDDFD)V +public avf.a(IIII)I +public avf.a(IIILacn;)F +public avf.a(Laex;III)Z +public avf.a(Lafc;III)Z +public avf.a(Lafg;III)Z +public avf.a(Lafq;III)Z +public avf.a(Lafv;III)Z +public avf.a(Lafw;III)Z +public avf.a(Lahg;III)Z +public avf.a(Laie;III)Z +public avf.a(Laif;DDDDD)V +public avf.a(Laif;DDDI)V +public avf.a(Laif;IDDD)V +public avf.a(Laif;IDDDD)V +public avf.a(Laif;IF)V +public avf.a(Laif;IIDDDD)V +public avf.a(Laif;III)V +public avf.a(Laif;IIIFFF)Z +public avf.a(Laif;IIII)V +public avf.a(Laif;IIIZ)V +public avf.a(Laif;Luo;IIII)V +public avf.b(DDDDDDFD)V +public avf.b(I)Z +public avf.b(Laif;DDDI)V +public avf.b(Laif;IDDD)V +public avf.b(Laif;III)Z +public avf.b(Laif;IIIZ)Z +public avf.c(DDDDDDFD)V +public avf.c(Laif;DDDI)V +public avf.c(Laif;III)Z +public avf.c(Laif;IIIFFF)Z +public avf.c(Laif;IIIZ)Z +public avf.d(Laif;DDDI)V +public avf.d(Laif;III)V +public avf.d(Laif;IIIFFF)Z +public avf.e(Laif;DDDI)V +public avf.e(Laif;III)Z +public avf.f(Laif;DDDI)V +public avf.f(Laif;III)Z +public avf.g(Laif;III)Z +public avf.h(Laif;III)Z +public avf.i(Laif;III)Z +public avf.j(Laif;III)Z +public avf.k(Laif;III)Z +public avf.l(Laif;III)Z +public avf.m(Laif;III)Z +public avf.n(Laif;III)Z +public avf.o(Laif;III)Z +public avf.p(Laif;III)Z +public avf.q(Laif;III)Z +public avf.r(Laif;III)Z +public avf.s(Laif;III)Z +public avf.t(Laif;III)Z +public avf.u(Laif;III)Z +public avf.v(Laif;III)Z +public avf.w(Laif;III)Z +public avf.x(Laif;III)Z +#RenderEngine - make TextureFX list public +public ave.h +#RenderPlayer - make armorlist public and not final +public-f awq.j +#StringTranslate - make the current table public +public ak.b +# TileEntityRenderer - make the list of renderers public +public axr.m + diff --git a/eclipse/FML-Client/.classpath b/eclipse/FML-Client/.classpath index dd2c23157b..d6fb27b16e 100644 --- a/eclipse/FML-Client/.classpath +++ b/eclipse/FML-Client/.classpath @@ -4,6 +4,7 @@ + diff --git a/eclipse/FML-Client/.project b/eclipse/FML-Client/.project index 78c6fff4fa..fad25895ae 100644 --- a/eclipse/FML-Client/.project +++ b/eclipse/FML-Client/.project @@ -50,6 +50,11 @@ 2 MCP_LOC/src-work/common + + transformers + 2 + MCP_LOC/FML/transformers + common/fmlversion.properties 1 diff --git a/install/fml.py b/install/fml.py index fa80e4aea1..40fa44935e 100644 --- a/install/fml.py +++ b/install/fml.py @@ -146,19 +146,20 @@ def setup_fml(fml_dir, mcp_dir): def applyrg_shunt(self, side, reobf=False, applyrg_real = Commands.applyrg): jars = {CLIENT: self.jarclient, SERVER: self.jarserver} - #print "==================================SHUNT %s============================" % side - #print "Java: %s" % self.cmdjava - #print "Javac: %s" % self.cmdjavac - #print "Jar: %s" % jars[side] + print "==================================SHUNT %s============================" % side + print "Java: %s" % self.cmdjava + print "Javac: %s" % self.cmdjavac + print "Jar: %s" % jars[side] binDir = os.path.join(fml_dir, 'bin') if not os.path.isdir(binDir): os.makedirs(binDir) #Compile AccessTransformer - forkcmd = ('%s -Xlint:-options -deprecation -g -source 1.6 -target 1.6 -classpath "{classpath};." -sourcepath {sourcepath} -d {outpath} {target}' % self.cmdjavac).format( + forkcmd = ('%s -Xlint:-options -deprecation -g -source 1.6 -target 1.6 -classpath "{classpath}" -sourcepath {sourcepath} -d {outpath} {target}' % self.cmdjavac).format( classpath=os.path.join(mcp_dir, 'lib', '*'), sourcepath=os.path.join(fml_dir, 'common'), outpath=os.path.join(fml_dir, 'bin'), target=os.path.join(fml_dir, 'transformers', 'cpw', 'mods', 'fml', 'common', 'asm', 'transformers', 'AccessTransformer.java')) + print forkcmd self.runcmd(forkcmd) #Run AccessTransformer @@ -427,4 +428,4 @@ def merge_tree(root_src_dir, root_dst_dir): dst_file = os.path.join(dst_dir, file_) if os.path.exists(dst_file): os.remove(dst_file) - shutil.copy(src_file, dst_dir) \ No newline at end of file + shutil.copy(src_file, dst_dir) diff --git a/transformers/cpw/mods/fml/common/asm/transformers/AccessTransformer.java b/transformers/cpw/mods/fml/common/asm/transformers/AccessTransformer.java index 7da4e2c714..dd8c30845a 100644 --- a/transformers/cpw/mods/fml/common/asm/transformers/AccessTransformer.java +++ b/transformers/cpw/mods/fml/common/asm/transformers/AccessTransformer.java @@ -3,6 +3,7 @@ package cpw.mods.fml.common.asm.transformers; import static org.objectweb.asm.Opcodes.ACC_PRIVATE; import static org.objectweb.asm.Opcodes.ACC_PROTECTED; import static org.objectweb.asm.Opcodes.ACC_PUBLIC; +import static org.objectweb.asm.Opcodes.ACC_FINAL; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; @@ -55,12 +56,25 @@ public class AccessTransformer implements IClassTransformer public int oldAccess = 0; public int newAccess = 0; public int targetAccess = 0; + public boolean changeFinal = false; + public boolean markFinal = false; private void setTargetAccess(String name) { - if (name.equalsIgnoreCase("public")) targetAccess = ACC_PUBLIC; - else if (name.equalsIgnoreCase("private")) targetAccess = ACC_PRIVATE; - else if (name.equalsIgnoreCase("protected")) targetAccess = ACC_PROTECTED; + if (name.startsWith("public")) targetAccess = ACC_PUBLIC; + else if (name.startsWith("private")) targetAccess = ACC_PRIVATE; + else if (name.startsWith("protected")) targetAccess = ACC_PROTECTED; + + if (name.endsWith("-f")) + { + changeFinal = true; + markFinal = false; + } + else if (name.endsWith("+f")) + { + changeFinal = true; + markFinal = true; + } } } @@ -68,7 +82,7 @@ public class AccessTransformer implements IClassTransformer public AccessTransformer() throws IOException { - this("/rules.csv"); + this("fml_at.cfg"); } protected AccessTransformer(String rulesFile) throws IOException { @@ -111,12 +125,17 @@ public class AccessTransformer implements IClassTransformer Modifier m = new Modifier(); m.setTargetAccess(parts.get(0)); List descriptor = Lists.newArrayList(Splitter.on(".").trimResults().split(parts.get(1))); - List method = Lists.newArrayList(Splitter.on(CharMatcher.anyOf("()")).omitEmptyStrings().trimResults().split(descriptor.get(1))); - if (method.size()==3) //cpw, cleanthis up plz + String nameReference = descriptor.get(1); + int parenIdx = nameReference.indexOf('('); + if (parenIdx>0) { - m.desc = String.format("(%s)%s", method.get(1), method.get(2)); + m.desc = nameReference.substring(parenIdx); + m.name = nameReference.substring(0,parenIdx-1); + } + else + { + m.name = nameReference; } - m.name = method.get(0); modifiers.put(descriptor.get(0), m); return true; } @@ -196,6 +215,19 @@ public class AccessTransformer implements IClassTransformer default: throw new RuntimeException("The fuck?"); } + + // Clear the "final" marker on fields only if specified in control field + if (target.changeFinal && target.desc == "") + { + if (target.markFinal) + { + ret |= ACC_FINAL; + } + else + { + ret &= ~ACC_FINAL; + } + } target.newAccess = ret; return ret; }