allow access to ClassWriter flags in class transformer context
This commit is contained in:
@@ -1,10 +1,8 @@
|
|||||||
package mods.betterfoliage.loader
|
package mods.betterfoliage.loader
|
||||||
|
|
||||||
import mods.octarinecore.metaprog.ASMPlugin
|
|
||||||
import mods.octarinecore.metaprog.Transformer
|
import mods.octarinecore.metaprog.Transformer
|
||||||
import mods.octarinecore.metaprog.allAvailable
|
import mods.octarinecore.metaprog.allAvailable
|
||||||
import net.minecraftforge.fml.relauncher.FMLLaunchHandler
|
import net.minecraftforge.fml.relauncher.FMLLaunchHandler
|
||||||
import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin
|
|
||||||
import org.objectweb.asm.Opcodes.*
|
import org.objectweb.asm.Opcodes.*
|
||||||
|
|
||||||
class BetterFoliageTransformer : Transformer() {
|
class BetterFoliageTransformer : Transformer() {
|
||||||
|
|||||||
@@ -11,18 +11,6 @@ import org.objectweb.asm.tree.*
|
|||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.FileOutputStream
|
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<String, Any>) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for convenient bytecode transformers.
|
* Base class for convenient bytecode transformers.
|
||||||
*/
|
*/
|
||||||
@@ -44,6 +32,7 @@ open class Transformer : IClassTransformer {
|
|||||||
if (classData == null) return null
|
if (classData == null) return null
|
||||||
val classNode = ClassNode().apply { val reader = ClassReader(classData); reader.accept(this, 0) }
|
val classNode = ClassNode().apply { val reader = ClassReader(classData); reader.accept(this, 0) }
|
||||||
var workDone = false
|
var workDone = false
|
||||||
|
var writerFlags = 0
|
||||||
|
|
||||||
synchronized(this) {
|
synchronized(this) {
|
||||||
methodTransformers.forEach { (targetMethod, transform) ->
|
methodTransformers.forEach { (targetMethod, transform) ->
|
||||||
@@ -66,13 +55,13 @@ open class Transformer : IClassTransformer {
|
|||||||
//}
|
//}
|
||||||
|
|
||||||
// transform
|
// transform
|
||||||
MethodTransformContext(method, namespace).transform()
|
writerFlags = MethodTransformContext(method, namespace, writerFlags).apply(transform).writerFlags
|
||||||
workDone = true
|
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[method] the [MethodNode] currently being transformed
|
||||||
* @param[environment] the type of environment we are in
|
* @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() {
|
fun makePublic() {
|
||||||
method.access = (method.access or Opcodes.ACC_PUBLIC) and (Opcodes.ACC_PRIVATE or Opcodes.ACC_PROTECTED).inv()
|
method.access = (method.access or Opcodes.ACC_PUBLIC) and (Opcodes.ACC_PRIVATE or Opcodes.ACC_PROTECTED).inv()
|
||||||
|
|||||||
Reference in New Issue
Block a user