From 787b3993b5692f8aee15d10681040d52702c2a79 Mon Sep 17 00:00:00 2001 From: octarine-noise Date: Thu, 25 Oct 2018 13:58:32 +0200 Subject: [PATCH] allow access to ClassWriter flags in class transformer context --- .../betterfoliage/loader/BetterFoliageCore.kt | 2 -- .../octarinecore/metaprog/Transformation.kt | 21 ++++++------------- 2 files changed, 6 insertions(+), 17 deletions(-) diff --git a/src/main/kotlin/mods/betterfoliage/loader/BetterFoliageCore.kt b/src/main/kotlin/mods/betterfoliage/loader/BetterFoliageCore.kt index 1f3df37..9c5f871 100644 --- a/src/main/kotlin/mods/betterfoliage/loader/BetterFoliageCore.kt +++ b/src/main/kotlin/mods/betterfoliage/loader/BetterFoliageCore.kt @@ -1,10 +1,8 @@ package mods.betterfoliage.loader -import mods.octarinecore.metaprog.ASMPlugin import mods.octarinecore.metaprog.Transformer import mods.octarinecore.metaprog.allAvailable import net.minecraftforge.fml.relauncher.FMLLaunchHandler -import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin import org.objectweb.asm.Opcodes.* class BetterFoliageTransformer : Transformer() { diff --git a/src/main/kotlin/mods/octarinecore/metaprog/Transformation.kt b/src/main/kotlin/mods/octarinecore/metaprog/Transformation.kt index e67fc81..3d4bc30 100644 --- a/src/main/kotlin/mods/octarinecore/metaprog/Transformation.kt +++ b/src/main/kotlin/mods/octarinecore/metaprog/Transformation.kt @@ -11,18 +11,6 @@ import org.objectweb.asm.tree.* import java.io.File import java.io.FileOutputStream -@IFMLLoadingPlugin.TransformerExclusions( - "mods.octarinecore.metaprog", - "kotlin" -) -open class ASMPlugin(vararg val classes: Class<*>) : IFMLLoadingPlugin { - override fun getASMTransformerClass() = classes.map { it.canonicalName }.toTypedArray() - override fun getAccessTransformerClass() = null - override fun getModContainerClass() = null - override fun getSetupClass() = null - override fun injectData(data: Map) {} -} - /** * Base class for convenient bytecode transformers. */ @@ -44,6 +32,7 @@ open class Transformer : IClassTransformer { if (classData == null) return null val classNode = ClassNode().apply { val reader = ClassReader(classData); reader.accept(this, 0) } var workDone = false + var writerFlags = 0 synchronized(this) { methodTransformers.forEach { (targetMethod, transform) -> @@ -66,13 +55,13 @@ open class Transformer : IClassTransformer { //} // transform - MethodTransformContext(method, namespace).transform() + writerFlags = MethodTransformContext(method, namespace, writerFlags).apply(transform).writerFlags workDone = true } } } - return if (!workDone) classData else ClassWriter(0).apply { classNode.accept(this) }.toByteArray() + return if (!workDone) classData else ClassWriter(writerFlags).apply { classNode.accept(this) }.toByteArray() } } @@ -83,7 +72,9 @@ open class Transformer : IClassTransformer { * @param[method] the [MethodNode] currently being transformed * @param[environment] the type of environment we are in */ -class MethodTransformContext(val method: MethodNode, val environment: Namespace) { +class MethodTransformContext(val method: MethodNode, val environment: Namespace, var writerFlags: Int) { + + fun applyWriterFlags(vararg flagValue: Int) { flagValue.forEach { writerFlags = writerFlags or it } } fun makePublic() { method.access = (method.access or Opcodes.ACC_PUBLIC) and (Opcodes.ACC_PRIVATE or Opcodes.ACC_PROTECTED).inv()