Use last asm api for visitor construction

This commit is contained in:
Mikhael Bogdanov
2018-12-19 10:23:15 +01:00
parent c2837cf7d9
commit c19c979b7d
44 changed files with 93 additions and 93 deletions
@@ -350,7 +350,7 @@ open class IncrementalJvmCache(
private fun getConstantsMap(bytes: ByteArray): Map<String, Any> { private fun getConstantsMap(bytes: ByteArray): Map<String, Any> {
val result = HashMap<String, Any>() val result = HashMap<String, Any>()
ClassReader(bytes).accept(object : ClassVisitor(Opcodes.ASM5) { ClassReader(bytes).accept(object : ClassVisitor(Opcodes.API_VERSION) {
override fun visitField(access: Int, name: String, desc: String, signature: String?, value: Any?): FieldVisitor? { override fun visitField(access: Int, name: String, desc: String, signature: String?, value: Any?): FieldVisitor? {
val staticFinal = Opcodes.ACC_STATIC or Opcodes.ACC_FINAL or Opcodes.ACC_PRIVATE val staticFinal = Opcodes.ACC_STATIC or Opcodes.ACC_FINAL or Opcodes.ACC_PRIVATE
if (value != null && access and staticFinal == Opcodes.ACC_STATIC or Opcodes.ACC_FINAL) { if (value != null && access and staticFinal == Opcodes.ACC_STATIC or Opcodes.ACC_FINAL) {
@@ -470,7 +470,7 @@ open class IncrementalJvmCache(
val result = HashMap<String, Long>() val result = HashMap<String, Long>()
ClassReader(bytes).accept(object : ClassVisitor(Opcodes.ASM5) { ClassReader(bytes).accept(object : ClassVisitor(Opcodes.API_VERSION) {
override fun visitMethod( override fun visitMethod(
access: Int, access: Int,
name: String, name: String,
@@ -478,9 +478,9 @@ open class IncrementalJvmCache(
signature: String?, signature: String?,
exceptions: Array<out String>? exceptions: Array<out String>?
): MethodVisitor? { ): MethodVisitor? {
val dummyClassWriter = ClassWriter(Opcodes.ASM5) val dummyClassWriter = ClassWriter(Opcodes.API_VERSION)
return object : MethodVisitor(Opcodes.ASM5, dummyClassWriter.visitMethod(0, name, desc, null, exceptions)) { return object : MethodVisitor(Opcodes.API_VERSION, dummyClassWriter.visitMethod(0, name, desc, null, exceptions)) {
override fun visitEnd() { override fun visitEnd() {
val jvmName = name + desc val jvmName = name + desc
if (jvmName !in inlineFunctions) return if (jvmName !in inlineFunctions) return
@@ -31,8 +31,8 @@ import java.util.List;
import static org.jetbrains.kotlin.codegen.inline.InlineCodegenUtilsKt.GENERATE_SMAP; import static org.jetbrains.kotlin.codegen.inline.InlineCodegenUtilsKt.GENERATE_SMAP;
public abstract class AbstractClassBuilder implements ClassBuilder { public abstract class AbstractClassBuilder implements ClassBuilder {
protected static final MethodVisitor EMPTY_METHOD_VISITOR = new MethodVisitor(Opcodes.ASM5) {}; protected static final MethodVisitor EMPTY_METHOD_VISITOR = new MethodVisitor(Opcodes.API_VERSION) {};
protected static final FieldVisitor EMPTY_FIELD_VISITOR = new FieldVisitor(Opcodes.ASM5) {}; protected static final FieldVisitor EMPTY_FIELD_VISITOR = new FieldVisitor(Opcodes.API_VERSION) {};
private String thisName; private String thisName;
@@ -72,7 +72,7 @@ public abstract class AnnotationCodegen {
new JvmFlagAnnotation(JvmAnnotationUtilKt.SYNCHRONIZED_ANNOTATION_FQ_NAME.asString(), Opcodes.ACC_SYNCHRONIZED) new JvmFlagAnnotation(JvmAnnotationUtilKt.SYNCHRONIZED_ANNOTATION_FQ_NAME.asString(), Opcodes.ACC_SYNCHRONIZED)
); );
private static final AnnotationVisitor NO_ANNOTATION_VISITOR = new AnnotationVisitor(Opcodes.ASM5) { private static final AnnotationVisitor NO_ANNOTATION_VISITOR = new AnnotationVisitor(Opcodes.API_VERSION) {
@Override @Override
public AnnotationVisitor visitAnnotation(String name, @NotNull String desc) { public AnnotationVisitor visitAnnotation(String name, @NotNull String desc) {
return safe(super.visitAnnotation(name, desc)); return safe(super.visitAnnotation(name, desc));
@@ -53,7 +53,7 @@ fun createMethodNodeForAlwaysEnabledAssert(
val node = val node =
org.jetbrains.org.objectweb.asm.tree.MethodNode( org.jetbrains.org.objectweb.asm.tree.MethodNode(
Opcodes.ASM5, Opcodes.API_VERSION,
Opcodes.ACC_STATIC, Opcodes.ACC_STATIC,
"fake", "fake",
typeMapper.mapAsmMethod(functionDescriptor).descriptor, null, null typeMapper.mapAsmMethod(functionDescriptor).descriptor, null, null
@@ -34,7 +34,7 @@ abstract class TransformationMethodVisitor(
desc: String, desc: String,
signature: String?, signature: String?,
exceptions: Array<out String>?, exceptions: Array<out String>?,
api: Int = Opcodes.ASM5 api: Int = Opcodes.API_VERSION
) : MethodVisitor(api) { ) : MethodVisitor(api) {
private val methodNode = MethodNode(access, name, desc, signature, exceptions).apply { private val methodNode = MethodNode(access, name, desc, signature, exceptions).apply {
@@ -70,7 +70,7 @@ abstract class TransformationMethodVisitor(
performTransformations(methodNode) performTransformations(methodNode)
} }
methodNode.accept(EndIgnoringMethodVisitorDecorator(Opcodes.ASM5, delegate)) methodNode.accept(EndIgnoringMethodVisitorDecorator(Opcodes.API_VERSION, delegate))
// In case of empty instructions list MethodNode.accept doesn't call visitLocalVariables of delegate // In case of empty instructions list MethodNode.accept doesn't call visitLocalVariables of delegate
@@ -354,8 +354,8 @@ class CoroutineTransformerMethodVisitor(
methodNode.instructions.resetLabels() methodNode.instructions.resetLabels()
methodNode.accept( methodNode.accept(
MaxStackFrameSizeAndLocalsCalculator( MaxStackFrameSizeAndLocalsCalculator(
Opcodes.ASM5, methodNode.access, methodNode.desc, Opcodes.API_VERSION, methodNode.access, methodNode.desc,
object : MethodVisitor(Opcodes.ASM5) { object : MethodVisitor(Opcodes.API_VERSION) {
override fun visitMaxs(maxStack: Int, maxLocals: Int) { override fun visitMaxs(maxStack: Int, maxLocals: Int) {
methodNode.maxStack = maxStack methodNode.maxStack = maxStack
} }
@@ -340,7 +340,7 @@ fun createMethodNodeForIntercepted(
val node = val node =
MethodNode( MethodNode(
Opcodes.ASM5, Opcodes.API_VERSION,
Opcodes.ACC_STATIC, Opcodes.ACC_STATIC,
"fake", "fake",
typeMapper.mapAsmMethod(functionDescriptor).descriptor, null, null typeMapper.mapAsmMethod(functionDescriptor).descriptor, null, null
@@ -366,7 +366,7 @@ fun createMethodNodeForCoroutineContext(
val node = val node =
MethodNode( MethodNode(
Opcodes.ASM5, Opcodes.API_VERSION,
Opcodes.ACC_STATIC, Opcodes.ACC_STATIC,
"fake", "fake",
Type.getMethodDescriptor(languageVersionSettings.coroutineContextAsmType()), Type.getMethodDescriptor(languageVersionSettings.coroutineContextAsmType()),
@@ -395,7 +395,7 @@ fun createMethodNodeForSuspendCoroutineUninterceptedOrReturn(
val node = val node =
MethodNode( MethodNode(
Opcodes.ASM5, Opcodes.API_VERSION,
Opcodes.ACC_STATIC, Opcodes.ACC_STATIC,
"fake", "fake",
typeMapper.mapAsmMethod(functionDescriptor).descriptor, null, null typeMapper.mapAsmMethod(functionDescriptor).descriptor, null, null
@@ -56,7 +56,7 @@ import java.io.PrintWriter
import java.io.StringWriter import java.io.StringWriter
const val GENERATE_SMAP = true const val GENERATE_SMAP = true
const val API = Opcodes.ASM5 const val API = Opcodes.API_VERSION
const val NUMBERED_FUNCTION_PREFIX = "kotlin/jvm/functions/Function" const val NUMBERED_FUNCTION_PREFIX = "kotlin/jvm/functions/Function"
const val INLINE_FUN_VAR_SUFFIX = "\$iv" const val INLINE_FUN_VAR_SUFFIX = "\$iv"
@@ -251,7 +251,7 @@ class RedundantBoxingMethodTransformer(private val generationState: GenerationSt
castWithType: Pair<AbstractInsnNode, Type> castWithType: Pair<AbstractInsnNode, Type>
) { ) {
val castInsn = castWithType.getFirst() val castInsn = castWithType.getFirst()
val castInsnsListener = MethodNode(Opcodes.ASM5) val castInsnsListener = MethodNode(Opcodes.API_VERSION)
InstructionAdapter(castInsnsListener).cast(value.unboxedType, castWithType.getSecond()) InstructionAdapter(castInsnsListener).cast(value.unboxedType, castWithType.getSecond())
for (insn in castInsnsListener.instructions.toArray()) { for (insn in castInsnsListener.instructions.toArray()) {
@@ -34,7 +34,7 @@ import static org.jetbrains.kotlin.codegen.optimization.common.StrictBasicValue.
public class OptimizationBasicInterpreter extends Interpreter<BasicValue> implements Opcodes { public class OptimizationBasicInterpreter extends Interpreter<BasicValue> implements Opcodes {
public OptimizationBasicInterpreter() { public OptimizationBasicInterpreter() {
super(ASM5); super(API_VERSION);
} }
@Override @Override
@@ -27,7 +27,7 @@ import org.jetbrains.org.objectweb.asm.Opcodes.*
import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.Type
import org.jetbrains.org.objectweb.asm.tree.* import org.jetbrains.org.objectweb.asm.tree.*
const val OPTIMIZATION_ASM_API_VERSION = Opcodes.ASM5 const val OPTIMIZATION_ASM_API_VERSION = Opcodes.API_VERSION
val AbstractInsnNode.isMeaningful: Boolean val AbstractInsnNode.isMeaningful: Boolean
get() = get() =
@@ -80,8 +80,8 @@ fun MethodNode.prepareForEmitting() {
maxStack = -1 maxStack = -1
accept( accept(
MaxStackFrameSizeAndLocalsCalculator( MaxStackFrameSizeAndLocalsCalculator(
Opcodes.ASM5, access, desc, Opcodes.API_VERSION, access, desc,
object : MethodVisitor(Opcodes.ASM5) { object : MethodVisitor(Opcodes.API_VERSION) {
override fun visitMaxs(maxStack: Int, maxLocals: Int) { override fun visitMaxs(maxStack: Int, maxLocals: Int) {
this@prepareForEmitting.maxStack = maxStack this@prepareForEmitting.maxStack = maxStack
} }
@@ -34,7 +34,7 @@ import org.jetbrains.org.objectweb.asm.*;
import java.util.*; import java.util.*;
import static org.jetbrains.org.objectweb.asm.ClassReader.*; import static org.jetbrains.org.objectweb.asm.ClassReader.*;
import static org.jetbrains.org.objectweb.asm.Opcodes.ASM5; import static org.jetbrains.org.objectweb.asm.Opcodes.API_VERSION;
public abstract class FileBasedKotlinClass implements KotlinJvmBinaryClass { public abstract class FileBasedKotlinClass implements KotlinJvmBinaryClass {
private final ClassId classId; private final ClassId classId;
@@ -93,7 +93,7 @@ public abstract class FileBasedKotlinClass implements KotlinJvmBinaryClass {
Ref<String> classNameRef = Ref.create(); Ref<String> classNameRef = Ref.create();
Ref<Integer> classVersion = Ref.create(); Ref<Integer> classVersion = Ref.create();
InnerClassesInfo innerClasses = new InnerClassesInfo(); InnerClassesInfo innerClasses = new InnerClassesInfo();
new ClassReader(fileContents).accept(new ClassVisitor(ASM5) { new ClassReader(fileContents).accept(new ClassVisitor(API_VERSION) {
@Override @Override
public void visit(int version, int access, @NotNull String name, String signature, String superName, String[] interfaces) { public void visit(int version, int access, @NotNull String name, String signature, String superName, String[] interfaces) {
classNameRef.set(name); classNameRef.set(name);
@@ -145,7 +145,7 @@ public abstract class FileBasedKotlinClass implements KotlinJvmBinaryClass {
@Override @Override
public void loadClassAnnotations(@NotNull AnnotationVisitor annotationVisitor, @Nullable byte[] cachedContents) { public void loadClassAnnotations(@NotNull AnnotationVisitor annotationVisitor, @Nullable byte[] cachedContents) {
byte[] fileContents = cachedContents != null ? cachedContents : getFileContents(); byte[] fileContents = cachedContents != null ? cachedContents : getFileContents();
new ClassReader(fileContents).accept(new ClassVisitor(ASM5) { new ClassReader(fileContents).accept(new ClassVisitor(API_VERSION) {
@Override @Override
public org.jetbrains.org.objectweb.asm.AnnotationVisitor visitAnnotation(@NotNull String desc, boolean visible) { public org.jetbrains.org.objectweb.asm.AnnotationVisitor visitAnnotation(@NotNull String desc, boolean visible) {
return convertAnnotationVisitor(annotationVisitor, desc, innerClasses); return convertAnnotationVisitor(annotationVisitor, desc, innerClasses);
@@ -170,7 +170,7 @@ public abstract class FileBasedKotlinClass implements KotlinJvmBinaryClass {
private static org.jetbrains.org.objectweb.asm.AnnotationVisitor convertAnnotationVisitor( private static org.jetbrains.org.objectweb.asm.AnnotationVisitor convertAnnotationVisitor(
@NotNull AnnotationArgumentVisitor v, @NotNull InnerClassesInfo innerClasses @NotNull AnnotationArgumentVisitor v, @NotNull InnerClassesInfo innerClasses
) { ) {
return new org.jetbrains.org.objectweb.asm.AnnotationVisitor(ASM5) { return new org.jetbrains.org.objectweb.asm.AnnotationVisitor(API_VERSION) {
@Override @Override
public void visit(String name, @NotNull Object value) { public void visit(String name, @NotNull Object value) {
if (value instanceof Type) { if (value instanceof Type) {
@@ -184,7 +184,7 @@ public abstract class FileBasedKotlinClass implements KotlinJvmBinaryClass {
@Override @Override
public org.jetbrains.org.objectweb.asm.AnnotationVisitor visitArray(String name) { public org.jetbrains.org.objectweb.asm.AnnotationVisitor visitArray(String name) {
AnnotationArrayArgumentVisitor arv = v.visitArray(Name.identifier(name)); AnnotationArrayArgumentVisitor arv = v.visitArray(Name.identifier(name));
return arv == null ? null : new org.jetbrains.org.objectweb.asm.AnnotationVisitor(ASM5) { return arv == null ? null : new org.jetbrains.org.objectweb.asm.AnnotationVisitor(API_VERSION) {
@Override @Override
public void visit(String name, @NotNull Object value) { public void visit(String name, @NotNull Object value) {
if (value instanceof Type) { if (value instanceof Type) {
@@ -228,13 +228,13 @@ public abstract class FileBasedKotlinClass implements KotlinJvmBinaryClass {
@Override @Override
public void visitMembers(@NotNull MemberVisitor memberVisitor, @Nullable byte[] cachedContents) { public void visitMembers(@NotNull MemberVisitor memberVisitor, @Nullable byte[] cachedContents) {
byte[] fileContents = cachedContents != null ? cachedContents : getFileContents(); byte[] fileContents = cachedContents != null ? cachedContents : getFileContents();
new ClassReader(fileContents).accept(new ClassVisitor(ASM5) { new ClassReader(fileContents).accept(new ClassVisitor(API_VERSION) {
@Override @Override
public FieldVisitor visitField(int access, @NotNull String name, @NotNull String desc, String signature, Object value) { public FieldVisitor visitField(int access, @NotNull String name, @NotNull String desc, String signature, Object value) {
AnnotationVisitor v = memberVisitor.visitField(Name.identifier(name), desc, value); AnnotationVisitor v = memberVisitor.visitField(Name.identifier(name), desc, value);
if (v == null) return null; if (v == null) return null;
return new FieldVisitor(ASM5) { return new FieldVisitor(API_VERSION) {
@Override @Override
public org.jetbrains.org.objectweb.asm.AnnotationVisitor visitAnnotation(@NotNull String desc, boolean visible) { public org.jetbrains.org.objectweb.asm.AnnotationVisitor visitAnnotation(@NotNull String desc, boolean visible) {
return convertAnnotationVisitor(v, desc, innerClasses); return convertAnnotationVisitor(v, desc, innerClasses);
@@ -253,7 +253,7 @@ public abstract class FileBasedKotlinClass implements KotlinJvmBinaryClass {
if (v == null) return null; if (v == null) return null;
int methodParamCount = Type.getArgumentTypes(desc).length; int methodParamCount = Type.getArgumentTypes(desc).length;
return new MethodVisitor(ASM5) { return new MethodVisitor(API_VERSION) {
private int visibleAnnotableParameterCount = methodParamCount; private int visibleAnnotableParameterCount = methodParamCount;
private int invisibleAnnotableParameterCount = methodParamCount; private int invisibleAnnotableParameterCount = methodParamCount;
@@ -65,11 +65,11 @@ class JavaModuleInfo(
val exports = arrayListOf<Exports>() val exports = arrayListOf<Exports>()
try { try {
ClassReader(contents).accept(object : ClassVisitor(Opcodes.ASM6) { ClassReader(contents).accept(object : ClassVisitor(Opcodes.API_VERSION) {
override fun visitModule(name: String, access: Int, version: String?): ModuleVisitor { override fun visitModule(name: String, access: Int, version: String?): ModuleVisitor {
moduleName = name moduleName = name
return object : ModuleVisitor(Opcodes.ASM6) { return object : ModuleVisitor(Opcodes.API_VERSION) {
override fun visitRequire(module: String, access: Int, version: String?) { override fun visitRequire(module: String, access: Int, version: String?) {
requires.add(Requires(module, (access and ACC_TRANSITIVE) != 0)) requires.add(Requires(module, (access and ACC_TRANSITIVE) != 0))
} }
@@ -265,7 +265,7 @@ public class InterceptionInstrumenter {
private byte[] instrument(byte[] classData, List<MethodInstrumenter> instrumenters) { private byte[] instrument(byte[] classData, List<MethodInstrumenter> instrumenters) {
ClassReader cr = new ClassReader(classData); ClassReader cr = new ClassReader(classData);
ClassWriter cw = new ClassWriter(cr, 0); ClassWriter cw = new ClassWriter(cr, 0);
cr.accept(new ClassVisitor(ASM5, cw) { cr.accept(new ClassVisitor(API_VERSION, cw) {
private final Map<MethodInstrumenter, String> matchedMethods = new HashMap<>(); private final Map<MethodInstrumenter, String> matchedMethods = new HashMap<>();
@Override @Override
@@ -316,7 +316,7 @@ public class InterceptionInstrumenter {
int maxStackDepth = getMaxStackDepth(name, desc, normalReturnData, enterData, exceptionData); int maxStackDepth = getMaxStackDepth(name, desc, normalReturnData, enterData, exceptionData);
boolean isConstructor = "<init>".equals(name); boolean isConstructor = "<init>".equals(name);
return new MethodVisitor(ASM5, mv) { return new MethodVisitor(API_VERSION, mv) {
private InstructionAdapter ia = null; private InstructionAdapter ia = null;
@@ -421,7 +421,7 @@ public class InterceptionInstrumenter {
} }
private TraceMethodVisitor getDumpingVisitorWrapper(MethodVisitor mv, String methodName, String methodDesc) { private TraceMethodVisitor getDumpingVisitorWrapper(MethodVisitor mv, String methodName, String methodDesc) {
return new TraceMethodVisitor(mv, new Textifier(ASM5) { return new TraceMethodVisitor(mv, new Textifier(API_VERSION) {
@Override @Override
public void visitMethodEnd() { public void visitMethodEnd() {
System.out.println(cr.getClassName() + ":" + methodName + methodDesc); System.out.println(cr.getClassName() + ":" + methodName + methodDesc);
@@ -41,7 +41,7 @@ abstract class AbstractBytecodeListingTest : CodegenTestCase() {
} }
} }
class BytecodeListingTextCollectingVisitor(val filter: Filter, val withSignatures: Boolean, api: Int = ASM5) : ClassVisitor(api) { class BytecodeListingTextCollectingVisitor(val filter: Filter, val withSignatures: Boolean, api: Int = API_VERSION) : ClassVisitor(api) {
companion object { companion object {
@JvmOverloads @JvmOverloads
fun getText( fun getText(
@@ -162,7 +162,7 @@ class BytecodeListingTextCollectingVisitor(val filter: Filter, val withSignature
handleModifiers(access, methodAnnotations) handleModifiers(access, methodAnnotations)
val methodParamCount = Type.getArgumentTypes(desc).size val methodParamCount = Type.getArgumentTypes(desc).size
return object : MethodVisitor(ASM5) { return object : MethodVisitor(API_VERSION) {
private var visibleAnnotableParameterCount = methodParamCount private var visibleAnnotableParameterCount = methodParamCount
private var invisibleAnnotableParameterCount = methodParamCount private var invisibleAnnotableParameterCount = methodParamCount
@@ -215,7 +215,7 @@ class BytecodeListingTextCollectingVisitor(val filter: Filter, val withSignature
handleModifiers(access) handleModifiers(access)
if (access and ACC_VOLATILE != 0) addModifier("volatile", fieldDeclaration.annotations) if (access and ACC_VOLATILE != 0) addModifier("volatile", fieldDeclaration.annotations)
return object : FieldVisitor(ASM5) { return object : FieldVisitor(API_VERSION) {
override fun visitAnnotation(desc: String, visible: Boolean): AnnotationVisitor? { override fun visitAnnotation(desc: String, visible: Boolean): AnnotationVisitor? {
addAnnotation(desc) addAnnotation(desc)
return super.visitAnnotation(desc, visible) return super.visitAnnotation(desc, visible)
@@ -100,14 +100,14 @@ abstract class AbstractCheckLocalVariablesTableTest : CodegenTestCase() {
private fun readLocalVariable(cr: ClassReader, methodName: String): List<LocalVariable> { private fun readLocalVariable(cr: ClassReader, methodName: String): List<LocalVariable> {
class Visitor : ClassVisitor(Opcodes.ASM5) { class Visitor : ClassVisitor(Opcodes.API_VERSION) {
var readVariables: MutableList<LocalVariable> = ArrayList() var readVariables: MutableList<LocalVariable> = ArrayList()
override fun visitMethod( override fun visitMethod(
access: Int, name: String, desc: String, signature: String?, exceptions: Array<String>? access: Int, name: String, desc: String, signature: String?, exceptions: Array<String>?
): MethodVisitor? { ): MethodVisitor? {
return if (methodName == name + desc) { return if (methodName == name + desc) {
object : MethodVisitor(Opcodes.ASM5) { object : MethodVisitor(Opcodes.API_VERSION) {
override fun visitLocalVariable( override fun visitLocalVariable(
name: String, desc: String, signature: String?, start: Label, end: Label, index: Int name: String, desc: String, signature: String?, start: Label, end: Label, index: Int
) { ) {
@@ -72,7 +72,7 @@ abstract class AbstractLineNumberTest : CodegenTestCase() {
val labels = arrayListOf<Label>() val labels = arrayListOf<Label>()
val labels2LineNumbers = HashMap<Label, String>() val labels2LineNumbers = HashMap<Label, String>()
val visitor = object : ClassVisitor(Opcodes.ASM5) { val visitor = object : ClassVisitor(Opcodes.API_VERSION) {
override fun visitMethod( override fun visitMethod(
access: Int, access: Int,
name: String, name: String,
@@ -95,7 +95,7 @@ abstract class AbstractLineNumberTest : CodegenTestCase() {
labels: ArrayList<Label>, labels: ArrayList<Label>,
labels2LineNumbers: HashMap<Label, String> labels2LineNumbers: HashMap<Label, String>
): MethodVisitor { ): MethodVisitor {
return object : MethodVisitor(Opcodes.ASM5) { return object : MethodVisitor(Opcodes.API_VERSION) {
private var lastLabel: Label? = null private var lastLabel: Label? = null
override fun visitMethodInsn(opcode: Int, owner: String, name: String, desc: String, itf: Boolean) { override fun visitMethodInsn(opcode: Int, owner: String, name: String, desc: String, itf: Boolean) {
@@ -119,7 +119,7 @@ abstract class AbstractLineNumberTest : CodegenTestCase() {
val result = ArrayList<String>() val result = ArrayList<String>()
val visitedLabels = HashSet<String>() val visitedLabels = HashSet<String>()
reader.accept(object : ClassVisitor(Opcodes.ASM5) { reader.accept(object : ClassVisitor(Opcodes.API_VERSION) {
override fun visitMethod( override fun visitMethod(
access: Int, access: Int,
name: String, name: String,
@@ -127,7 +127,7 @@ abstract class AbstractLineNumberTest : CodegenTestCase() {
signature: String?, signature: String?,
exceptions: Array<String>? exceptions: Array<String>?
): MethodVisitor { ): MethodVisitor {
return object : MethodVisitor(Opcodes.ASM5) { return object : MethodVisitor(Opcodes.API_VERSION) {
override fun visitLineNumber(line: Int, label: Label) { override fun visitLineNumber(line: Int, label: Label) {
val overrides = !visitedLabels.add(label.toString()) val overrides = !visitedLabels.add(label.toString())
@@ -114,7 +114,7 @@ object InlineTestUtil {
override fun visitAnnotation(desc: String, visible: Boolean): AnnotationVisitor? { override fun visitAnnotation(desc: String, visible: Boolean): AnnotationVisitor? {
if (desc == JvmAnnotationNames.METADATA_DESC) { if (desc == JvmAnnotationNames.METADATA_DESC) {
return object : AnnotationVisitor(Opcodes.ASM5) { return object : AnnotationVisitor(Opcodes.API_VERSION) {
override fun visit(name: String?, value: Any) { override fun visit(name: String?, value: Any) {
if (name == JvmAnnotationNames.KIND_FIELD_NAME && value == KotlinClassHeader.Kind.MULTIFILE_CLASS.id) { if (name == JvmAnnotationNames.KIND_FIELD_NAME && value == KotlinClassHeader.Kind.MULTIFILE_CLASS.id) {
skipMethodsOfThisClass = true skipMethodsOfThisClass = true
@@ -139,7 +139,7 @@ object InlineTestUtil {
return null return null
} }
return object : MethodNode(Opcodes.ASM5, access, name, desc, signature, exceptions) { return object : MethodNode(Opcodes.API_VERSION, access, name, desc, signature, exceptions) {
override fun visitMethodInsn(opcode: Int, owner: String, name: String, desc: String, itf: Boolean) { override fun visitMethodInsn(opcode: Int, owner: String, name: String, desc: String, itf: Boolean) {
val methodCall = MethodInfo(owner, name, desc) val methodCall = MethodInfo(owner, name, desc)
if (inlinedMethods.contains(methodCall)) { if (inlinedMethods.contains(methodCall)) {
@@ -233,7 +233,7 @@ object InlineTestUtil {
private data class MethodInfo(val owner: String, val name: String, val desc: String) private data class MethodInfo(val owner: String, val name: String, val desc: String)
private open class ClassVisitorWithName : ClassVisitor(Opcodes.ASM5) { private open class ClassVisitorWithName : ClassVisitor(Opcodes.API_VERSION) {
lateinit var className: String lateinit var className: String
override fun visit(version: Int, access: Int, name: String, signature: String?, superName: String?, interfaces: Array<String>?) { override fun visit(version: Int, access: Int, name: String, signature: String?, superName: String?, interfaces: Array<String>?) {
@@ -242,7 +242,7 @@ object InlineTestUtil {
} }
} }
private abstract class MethodNodeWithAnonymousObjectCheck(val inlineInfo: InlineInfo, access: Int, name: String, desc: String, signature: String?, exceptions: Array<String>?) : MethodNode(Opcodes.ASM5, access, name, desc, signature, exceptions) { private abstract class MethodNodeWithAnonymousObjectCheck(val inlineInfo: InlineInfo, access: Int, name: String, desc: String, signature: String?, exceptions: Array<String>?) : MethodNode(Opcodes.API_VERSION, access, name, desc, signature, exceptions) {
private fun isInlineParameterLikeOwner(owner: String) = private fun isInlineParameterLikeOwner(owner: String) =
"$" in owner && !isTopLevelOrInnerOrPackageClass(owner, inlineInfo) "$" in owner && !isTopLevelOrInnerOrPackageClass(owner, inlineInfo)
@@ -35,7 +35,7 @@ object SMAPTestUtil {
private fun extractSMAPFromClasses(outputFiles: Iterable<OutputFile>): List<SMAPAndFile> { private fun extractSMAPFromClasses(outputFiles: Iterable<OutputFile>): List<SMAPAndFile> {
return outputFiles.mapNotNull { outputFile -> return outputFiles.mapNotNull { outputFile ->
var debugInfo: String? = null var debugInfo: String? = null
ClassReader(outputFile.asByteArray()).accept(object : ClassVisitor(Opcodes.ASM5) { ClassReader(outputFile.asByteArray()).accept(object : ClassVisitor(Opcodes.API_VERSION) {
override fun visitSource(source: String?, debug: String?) { override fun visitSource(source: String?, debug: String?) {
debugInfo = debug debugInfo = debug
} }
@@ -161,7 +161,7 @@ public abstract class AbstractWriteFlagsTest extends CodegenTestCase {
protected boolean isExists; protected boolean isExists;
public TestClassVisitor() { public TestClassVisitor() {
super(Opcodes.ASM5); super(Opcodes.API_VERSION);
} }
abstract public int getAccess(); abstract public int getAccess();
@@ -47,7 +47,7 @@ abstract class AbstractIrLineNumberTest : AbstractLineNumberTest() {
labels: ArrayList<Label>, labels: ArrayList<Label>,
labels2LineNumbers: java.util.HashMap<Label, String> labels2LineNumbers: java.util.HashMap<Label, String>
): MethodVisitor { ): MethodVisitor {
return object : MethodVisitor(Opcodes.ASM5) { return object : MethodVisitor(Opcodes.API_VERSION) {
private var lastLabel: Label? = null private var lastLabel: Label? = null
private var lastLine = -1 private var lastLine = -1
@@ -118,7 +118,7 @@ abstract class AbstractWriteSignatureTest : CodegenTestCase() {
) )
} }
private inner class Checker : ClassVisitor(Opcodes.ASM5) { private inner class Checker : ClassVisitor(Opcodes.API_VERSION) {
override fun visit( override fun visit(
version: Int, version: Int,
access: Int, access: Int,
@@ -67,11 +67,11 @@ class WrongBytecodeVersionTest : KtUsefulTestCase() {
companion object { companion object {
fun transformMetadataInClassFile(bytes: ByteArray, transform: (fieldName: String, value: Any?) -> Any?): ByteArray { fun transformMetadataInClassFile(bytes: ByteArray, transform: (fieldName: String, value: Any?) -> Any?): ByteArray {
val writer = ClassWriter(0) val writer = ClassWriter(0)
ClassReader(bytes).accept(object : ClassVisitor(Opcodes.ASM5, writer) { ClassReader(bytes).accept(object : ClassVisitor(Opcodes.API_VERSION, writer) {
override fun visitAnnotation(desc: String, visible: Boolean): AnnotationVisitor { override fun visitAnnotation(desc: String, visible: Boolean): AnnotationVisitor {
val superVisitor = super.visitAnnotation(desc, visible) val superVisitor = super.visitAnnotation(desc, visible)
if (desc == JvmAnnotationNames.METADATA_DESC) { if (desc == JvmAnnotationNames.METADATA_DESC) {
return object : AnnotationVisitor(Opcodes.ASM5, superVisitor) { return object : AnnotationVisitor(Opcodes.API_VERSION, superVisitor) {
override fun visit(name: String, value: Any) { override fun visit(name: String, value: Any) {
super.visit(name, transform(name, value) ?: value) super.visit(name, transform(name, value) ?: value)
} }
@@ -79,7 +79,7 @@ class WrongBytecodeVersionTest : KtUsefulTestCase() {
override fun visitArray(name: String): AnnotationVisitor { override fun visitArray(name: String): AnnotationVisitor {
val entries = arrayListOf<String>() val entries = arrayListOf<String>()
val arrayVisitor = { super.visitArray(name) } val arrayVisitor = { super.visitArray(name) }
return object : AnnotationVisitor(Opcodes.ASM5) { return object : AnnotationVisitor(Opcodes.API_VERSION) {
override fun visit(name: String?, value: Any) { override fun visit(name: String?, value: Any) {
entries.add(value as String) entries.add(value as String)
} }
@@ -230,12 +230,12 @@ public class GenerateNotNullAssertionsTest extends CodegenTestCase {
} }
ClassReader reader = new ClassReader(file.asByteArray()); ClassReader reader = new ClassReader(file.asByteArray());
reader.accept(new ClassVisitor(Opcodes.ASM5) { reader.accept(new ClassVisitor(Opcodes.API_VERSION) {
@Override @Override
public MethodVisitor visitMethod( public MethodVisitor visitMethod(
int access, @NotNull String callerName, @NotNull String callerDesc, String signature, String[] exceptions int access, @NotNull String callerName, @NotNull String callerDesc, String signature, String[] exceptions
) { ) {
return new MethodVisitor(Opcodes.ASM5) { return new MethodVisitor(Opcodes.API_VERSION) {
@Override @Override
public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {
assertFalse( assertFalse(
@@ -139,7 +139,7 @@ public class InnerClassInfoGenTest extends CodegenTestCase {
ClassReader reader = new ClassReader(bytes); ClassReader reader = new ClassReader(bytes);
List<InnerClassAttribute> result = new ArrayList<>(); List<InnerClassAttribute> result = new ArrayList<>();
reader.accept(new ClassVisitor(ASM5) { reader.accept(new ClassVisitor(API_VERSION) {
@Override @Override
public void visitInnerClass(@NotNull String name, String outerName, String innerName, int access) { public void visitInnerClass(@NotNull String name, String outerName, String innerName, int access) {
result.add(new InnerClassAttribute(name, outerName, innerName, access)); result.add(new InnerClassAttribute(name, outerName, innerName, access));
@@ -168,7 +168,7 @@ class MethodOrderTest: CodegenTestCase() {
val methodNames = ArrayList<String>() val methodNames = ArrayList<String>()
classReader.accept(object : ClassVisitor(Opcodes.ASM4) { classReader.accept(object : ClassVisitor(Opcodes.API_VERSION) {
override fun visitMethod(access: Int, name: String, desc: String, signature: String?, exceptions: Array<out String>?): MethodVisitor? { override fun visitMethod(access: Int, name: String, desc: String, signature: String?, exceptions: Array<out String>?): MethodVisitor? {
methodNames.add(name + desc) methodNames.add(name + desc)
return null return null
@@ -219,7 +219,7 @@ public class OuterClassGenTest extends CodegenTestCase {
@Nullable @Nullable
private static OuterClassInfo readOuterClassInfo(@NotNull ClassReader reader) { private static OuterClassInfo readOuterClassInfo(@NotNull ClassReader reader) {
Ref<OuterClassInfo> info = Ref.create(); Ref<OuterClassInfo> info = Ref.create();
reader.accept(new ClassVisitor(Opcodes.ASM5) { reader.accept(new ClassVisitor(Opcodes.API_VERSION) {
@Override @Override
public void visitOuterClass(@NotNull String owner, @Nullable String name, @Nullable String desc) { public void visitOuterClass(@NotNull String owner, @Nullable String name, @Nullable String desc) {
info.set(new OuterClassInfo(owner, name, desc)); info.set(new OuterClassInfo(owner, name, desc));
@@ -44,7 +44,7 @@ public class SourceInfoGenTest extends CodegenTestCase {
ClassReader classReader = new ClassReader(file.asByteArray()); ClassReader classReader = new ClassReader(file.asByteArray());
String[] producer = new String[1]; String[] producer = new String[1];
classReader.accept(new ClassVisitor(Opcodes.ASM5) { classReader.accept(new ClassVisitor(Opcodes.API_VERSION) {
@Override @Override
public void visitSource(String source, String debug) { public void visitSource(String source, String debug) {
@@ -358,8 +358,8 @@ class CompileKotlinAgainstCustomBinariesTest : AbstractKotlinCompilerIntegration
compileKotlin("sourceInline.kt", tmpdir) compileKotlin("sourceInline.kt", tmpdir)
val inlineFunClass = File(tmpdir.absolutePath, "test/A.class") val inlineFunClass = File(tmpdir.absolutePath, "test/A.class")
val cw = ClassWriter(Opcodes.ASM5) val cw = ClassWriter(Opcodes.API_VERSION)
ClassReader(inlineFunClass.readBytes()).accept(object : ClassVisitor(Opcodes.ASM5, cw) { ClassReader(inlineFunClass.readBytes()).accept(object : ClassVisitor(Opcodes.API_VERSION, cw) {
override fun visitSource(source: String?, debug: String?) { override fun visitSource(source: String?, debug: String?) {
//skip debug info //skip debug info
} }
@@ -374,7 +374,7 @@ class CompileKotlinAgainstCustomBinariesTest : AbstractKotlinCompilerIntegration
var debugInfo: String? = null var debugInfo: String? = null
val resultFile = File(tmpdir.absolutePath, "test/B.class") val resultFile = File(tmpdir.absolutePath, "test/B.class")
ClassReader(resultFile.readBytes()).accept(object : ClassVisitor(Opcodes.ASM5) { ClassReader(resultFile.readBytes()).accept(object : ClassVisitor(Opcodes.API_VERSION) {
override fun visitSource(source: String?, debug: String?) { override fun visitSource(source: String?, debug: String?) {
debugInfo = debug debugInfo = debug
} }
@@ -574,7 +574,7 @@ class CompileKotlinAgainstCustomBinariesTest : AbstractKotlinCompilerIntegration
private fun stripSuspensionMarksToImitateLegacyCompiler(bytes: ByteArray): Pair<ByteArray, Int> { private fun stripSuspensionMarksToImitateLegacyCompiler(bytes: ByteArray): Pair<ByteArray, Int> {
val writer = ClassWriter(0) val writer = ClassWriter(0)
var removedCounter = 0 var removedCounter = 0
ClassReader(bytes).accept(object : ClassVisitor(Opcodes.ASM5, writer) { ClassReader(bytes).accept(object : ClassVisitor(Opcodes.API_VERSION, writer) {
override fun visitMethod( override fun visitMethod(
access: Int, access: Int,
name: String?, name: String?,
@@ -583,7 +583,7 @@ class CompileKotlinAgainstCustomBinariesTest : AbstractKotlinCompilerIntegration
exceptions: Array<out String>? exceptions: Array<out String>?
): MethodVisitor { ): MethodVisitor {
val superMV = super.visitMethod(access, name, desc, signature, exceptions) val superMV = super.visitMethod(access, name, desc, signature, exceptions)
return object : MethodNode(Opcodes.ASM5, access, name, desc, signature, exceptions) { return object : MethodNode(Opcodes.API_VERSION, access, name, desc, signature, exceptions) {
override fun visitEnd() { override fun visitEnd() {
val removeList = instructions.asSequence() val removeList = instructions.asSequence()
.flatMap { suspendMarkerInsns(it).asSequence() }.toList() .flatMap { suspendMarkerInsns(it).asSequence() }.toList()
@@ -644,11 +644,11 @@ class CompileKotlinAgainstCustomBinariesTest : AbstractKotlinCompilerIntegration
// If there's no "xi" field in the Metadata annotation, it's value is assumed to be 0, i.e. _not_ pre-release // If there's no "xi" field in the Metadata annotation, it's value is assumed to be 0, i.e. _not_ pre-release
var isPreRelease = false var isPreRelease = false
ClassReader(file.readBytes()).accept(object : ClassVisitor(Opcodes.ASM6) { ClassReader(file.readBytes()).accept(object : ClassVisitor(Opcodes.API_VERSION) {
override fun visitAnnotation(desc: String, visible: Boolean): AnnotationVisitor? { override fun visitAnnotation(desc: String, visible: Boolean): AnnotationVisitor? {
if (desc != JvmAnnotationNames.METADATA_DESC) return null if (desc != JvmAnnotationNames.METADATA_DESC) return null
return object : AnnotationVisitor(Opcodes.ASM6) { return object : AnnotationVisitor(Opcodes.API_VERSION) {
override fun visit(name: String, value: Any) { override fun visit(name: String, value: Any) {
if (name != JvmAnnotationNames.METADATA_EXTRA_INT_FIELD_NAME) return if (name != JvmAnnotationNames.METADATA_EXTRA_INT_FIELD_NAME) return
@@ -46,7 +46,7 @@ interface Eval {
fun invokeMethod(instance: Value, methodDesc: MethodDescription, arguments: List<Value>, invokespecial: Boolean = false): Value fun invokeMethod(instance: Value, methodDesc: MethodDescription, arguments: List<Value>, invokespecial: Boolean = false): Value
} }
class SingleInstructionInterpreter(private val eval: Eval) : Interpreter<Value>(ASM5) { class SingleInstructionInterpreter(private val eval: Eval) : Interpreter<Value>(API_VERSION) {
override fun newValue(type: Type?): Value? { override fun newValue(type: Type?): Value? {
if (type == null) { if (type == null) {
return NOT_A_VALUE return NOT_A_VALUE
@@ -25,7 +25,7 @@ import org.jetbrains.eval4j.ValueReturned
import org.jetbrains.org.objectweb.asm.ClassReader import org.jetbrains.org.objectweb.asm.ClassReader
import org.jetbrains.org.objectweb.asm.ClassVisitor import org.jetbrains.org.objectweb.asm.ClassVisitor
import org.jetbrains.org.objectweb.asm.MethodVisitor import org.jetbrains.org.objectweb.asm.MethodVisitor
import org.jetbrains.org.objectweb.asm.Opcodes.ASM5 import org.jetbrains.org.objectweb.asm.Opcodes.API_VERSION
import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.Type
import org.jetbrains.org.objectweb.asm.tree.MethodNode import org.jetbrains.org.objectweb.asm.tree.MethodNode
import java.lang.reflect.Modifier import java.lang.reflect.Modifier
@@ -38,9 +38,9 @@ fun buildTestSuite(
val ownerClass = TestData::class.java val ownerClass = TestData::class.java
ownerClass.classLoader!!.getResourceAsStream(ownerClass.getInternalName() + ".class")!!.use { inputStream -> ownerClass.classLoader!!.getResourceAsStream(ownerClass.getInternalName() + ".class")!!.use { inputStream ->
ClassReader(inputStream).accept(object : ClassVisitor(ASM5) { ClassReader(inputStream).accept(object : ClassVisitor(API_VERSION) {
override fun visitMethod(access: Int, name: String, desc: String, signature: String?, exceptions: Array<out String>?): MethodVisitor? { override fun visitMethod(access: Int, name: String, desc: String, signature: String?, exceptions: Array<out String>?): MethodVisitor? {
return object : MethodNode(ASM5, access, name, desc, signature, exceptions) { return object : MethodNode(API_VERSION, access, name, desc, signature, exceptions) {
override fun visitEnd() { override fun visitEnd() {
val testCase = buildTestCase(ownerClass, this, create) val testCase = buildTestCase(ownerClass, this, create)
if (testCase != null) { if (testCase != null) {
@@ -214,7 +214,7 @@ private fun readLineNumberTableMapping(bytes: ByteArray): Map<BytecodeMethodKey,
val methodLinesMapping = HashMap<String, MutableSet<Int>>() val methodLinesMapping = HashMap<String, MutableSet<Int>>()
lineNumberMapping[methodKey] = methodLinesMapping lineNumberMapping[methodKey] = methodLinesMapping
return object : MethodVisitor(Opcodes.ASM5, null) { return object : MethodVisitor(Opcodes.API_VERSION, null) {
override fun visitLineNumber(line: Int, start: Label?) { override fun visitLineNumber(line: Int, start: Label?) {
if (start != null) { if (start != null) {
methodLinesMapping.getOrPutNullable(start.toString(), { LinkedHashSet<Int>() }).add(line) methodLinesMapping.getOrPutNullable(start.toString(), { LinkedHashSet<Int>() }).add(line)
@@ -87,7 +87,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
import org.jetbrains.kotlin.resolve.isInlineClassType import org.jetbrains.kotlin.resolve.isInlineClassType
import org.jetbrains.kotlin.resolve.jvm.JvmClassName import org.jetbrains.kotlin.resolve.jvm.JvmClassName
import org.jetbrains.org.objectweb.asm.* import org.jetbrains.org.objectweb.asm.*
import org.jetbrains.org.objectweb.asm.Opcodes.ASM5 import org.jetbrains.org.objectweb.asm.Opcodes.API_VERSION
import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.Type
import org.jetbrains.org.objectweb.asm.tree.ClassNode import org.jetbrains.org.objectweb.asm.tree.ClassNode
import org.jetbrains.org.objectweb.asm.tree.MethodNode import org.jetbrains.org.objectweb.asm.tree.MethodNode
@@ -353,14 +353,14 @@ class KotlinEvaluator(val codeFragment: KtCodeFragment, val sourcePosition: Sour
// assert [0] with some context // assert [0] with some context
val mainClassBytecode = compiledData.mainClass.bytes val mainClassBytecode = compiledData.mainClass.bytes
ClassReader(mainClassBytecode).accept(object : ClassVisitor(ASM5) { ClassReader(mainClassBytecode).accept(object : ClassVisitor(API_VERSION) {
override fun visitMethod(access: Int, name: String, desc: String, signature: String?, exceptions: Array<out String>?): MethodVisitor? { override fun visitMethod(access: Int, name: String, desc: String, signature: String?, exceptions: Array<out String>?): MethodVisitor? {
// Maybe just take the single method from the class, as it is done in 'evaluateWithCompilation' // Maybe just take the single method from the class, as it is done in 'evaluateWithCompilation'
if (name == GENERATED_FUNCTION_NAME || name.startsWith(GENERATED_FUNCTION_NAME + "-")) { if (name == GENERATED_FUNCTION_NAME || name.startsWith(GENERATED_FUNCTION_NAME + "-")) {
val argumentTypes = Type.getArgumentTypes(desc) val argumentTypes = Type.getArgumentTypes(desc)
val args = context.getArgumentsForEval4j(compiledData.parameters, argumentTypes) val args = context.getArgumentsForEval4j(compiledData.parameters, argumentTypes)
return object : MethodNode(Opcodes.ASM5, access, name, desc, signature, exceptions) { return object : MethodNode(Opcodes.API_VERSION, access, name, desc, signature, exceptions) {
override fun visitEnd() { override fun visitEnd() {
virtualMachine.executeWithBreakpointsDisabled { virtualMachine.executeWithBreakpointsDisabled {
val eval = JDIEval(virtualMachine, val eval = JDIEval(virtualMachine,
@@ -61,12 +61,12 @@ object KotlinJvmMetadataVersionIndex : KotlinMetadataVersionIndexBase<KotlinJvmM
tryBlock(inputData) { tryBlock(inputData) {
val classReader = ClassReader(inputData.content) val classReader = ClassReader(inputData.content)
classReader.accept(object : ClassVisitor(Opcodes.ASM6) { classReader.accept(object : ClassVisitor(Opcodes.API_VERSION) {
override fun visitAnnotation(desc: String, visible: Boolean): AnnotationVisitor? { override fun visitAnnotation(desc: String, visible: Boolean): AnnotationVisitor? {
if (desc != METADATA_DESC) return null if (desc != METADATA_DESC) return null
annotationPresent = true annotationPresent = true
return object : AnnotationVisitor(Opcodes.ASM6) { return object : AnnotationVisitor(Opcodes.API_VERSION) {
override fun visit(name: String, value: Any) { override fun visit(name: String, value: Any) {
when (name) { when (name) {
METADATA_VERSION_FIELD_NAME -> if (value is IntArray) { METADATA_VERSION_FIELD_NAME -> if (value is IntArray) {
@@ -46,7 +46,7 @@ private fun applyDexLikePatch(file: File) {
} }
private fun ClassVisitor.withRemoveSourceDebugExtensionVisitor(): ClassVisitor { private fun ClassVisitor.withRemoveSourceDebugExtensionVisitor(): ClassVisitor {
return object : ClassVisitor(Opcodes.ASM5, this) { return object : ClassVisitor(Opcodes.API_VERSION, this) {
override fun visitSource(source: String?, debug: String?) { override fun visitSource(source: String?, debug: String?) {
super.visitSource(source, null) super.visitSource(source, null)
} }
@@ -54,11 +54,11 @@ private fun ClassVisitor.withRemoveSourceDebugExtensionVisitor(): ClassVisitor {
} }
private fun ClassVisitor.withRemoveSameLinesInLineTableVisitor(): ClassVisitor { private fun ClassVisitor.withRemoveSameLinesInLineTableVisitor(): ClassVisitor {
return object : ClassVisitor(Opcodes.ASM5, this) { return object : ClassVisitor(Opcodes.API_VERSION, this) {
override fun visitMethod(access: Int, name: String?, desc: String?, signature: String?, exceptions: Array<out String>?): MethodVisitor? { override fun visitMethod(access: Int, name: String?, desc: String?, signature: String?, exceptions: Array<out String>?): MethodVisitor? {
val methodVisitor = super.visitMethod(access, name, desc, signature, exceptions) ?: return null val methodVisitor = super.visitMethod(access, name, desc, signature, exceptions) ?: return null
return object : MethodVisitor(Opcodes.ASM5, methodVisitor) { return object : MethodVisitor(Opcodes.API_VERSION, methodVisitor) {
val labels = HashSet<String>() val labels = HashSet<String>()
override fun visitLineNumber(line: Int, start: Label?) { override fun visitLineNumber(line: Int, start: Label?) {
@@ -99,7 +99,7 @@ open class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() {
private fun getMethodsOfClass(classFile: File): Set<String> { private fun getMethodsOfClass(classFile: File): Set<String> {
val result = TreeSet<String>() val result = TreeSet<String>()
ClassReader(FileUtil.loadFileBytes(classFile)).accept(object : ClassVisitor(Opcodes.ASM5) { ClassReader(FileUtil.loadFileBytes(classFile)).accept(object : ClassVisitor(Opcodes.API_VERSION) {
override fun visitMethod(access: Int, name: String, desc: String, signature: String?, exceptions: Array<String>?): MethodVisitor? { override fun visitMethod(access: Int, name: String, desc: String, signature: String?, exceptions: Array<String>?): MethodVisitor? {
result.add(name) result.add(name)
return null return null
@@ -36,7 +36,7 @@ internal fun loadCompilerVersion(compilerClasspath: List<File>): String {
var result: String? = null var result: String? = null
fun checkVersion(bytes: ByteArray) { fun checkVersion(bytes: ByteArray) {
ClassReader(bytes).accept(object : ClassVisitor(Opcodes.ASM5) { ClassReader(bytes).accept(object : ClassVisitor(Opcodes.API_VERSION) {
override fun visitField(access: Int, name: String, desc: String, signature: String?, value: Any?): FieldVisitor { override fun visitField(access: Int, name: String, desc: String, signature: String?, value: Any?): FieldVisitor {
if (name == KotlinCompilerVersion::VERSION.name && value is String) { if (name == KotlinCompilerVersion::VERSION.name && value is String) {
result = value result = value
@@ -134,7 +134,7 @@ class ParcelableClinitClassBuilderInterceptorExtension : ClassBuilderInterceptor
} }
} }
private class ClinitAwareMethodVisitor(val parcelableName: String, mv: MethodVisitor) : MethodVisitor(Opcodes.ASM5, mv) { private class ClinitAwareMethodVisitor(val parcelableName: String, mv: MethodVisitor) : MethodVisitor(Opcodes.API_VERSION, mv) {
override fun visitInsn(opcode: Int) { override fun visitInsn(opcode: Int) {
if (opcode == Opcodes.RETURN) { if (opcode == Opcodes.RETURN) {
val iv = InstructionAdapter(this) val iv = InstructionAdapter(this)
@@ -101,7 +101,7 @@ abstract class AbstractAndroidOnDestroyClassBuilderInterceptorExtension : ClassB
signature: String?, signature: String?,
exceptions: Array<out String>? exceptions: Array<out String>?
): MethodVisitor { ): MethodVisitor {
return object : MethodVisitor(Opcodes.ASM5, super.newMethod(origin, access, name, desc, signature, exceptions)) { return object : MethodVisitor(Opcodes.API_VERSION, super.newMethod(origin, access, name, desc, signature, exceptions)) {
override fun visitInsn(opcode: Int) { override fun visitInsn(opcode: Int) {
if (opcode == Opcodes.RETURN) { if (opcode == Opcodes.RETURN) {
generateClearCacheMethodCall() generateClearCacheMethodCall()
@@ -7,4 +7,4 @@ package org.jetbrains.kotlin.jvm.abi.asm
import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.Opcodes
internal const val ABI_EXTENSION_ASM_API_VERSION = Opcodes.ASM6 internal const val ABI_EXTENSION_ASM_API_VERSION = Opcodes.API_VERSION
@@ -314,7 +314,7 @@ private fun SignatureNode.split(
} }
} }
private class SignatureParserVisitor : SignatureVisitor(Opcodes.ASM5) { private class SignatureParserVisitor : SignatureVisitor(Opcodes.API_VERSION) {
val root = SignatureNode(Root) val root = SignatureNode(Root)
private val stack = ArrayDeque<SignatureNode>(5).apply { add(root) } private val stack = ArrayDeque<SignatureNode>(5).apply { add(root) }
@@ -18,7 +18,7 @@ package com.android.tools.klint.client.api;
import static com.android.SdkConstants.DOT_CLASS; import static com.android.SdkConstants.DOT_CLASS;
import static com.android.SdkConstants.DOT_JAR; import static com.android.SdkConstants.DOT_JAR;
import static org.jetbrains.org.objectweb.asm.Opcodes.ASM5; import static org.jetbrains.org.objectweb.asm.Opcodes.API_VERSION;
import com.android.annotations.NonNull; import com.android.annotations.NonNull;
import com.android.annotations.Nullable; import com.android.annotations.Nullable;
@@ -319,7 +319,7 @@ class ClassEntry implements Comparable<ClassEntry> {
private final Map<String, String> mMap; private final Map<String, String> mMap;
public SuperclassVisitor(Map<String, String> map) { public SuperclassVisitor(Map<String, String> map) {
super(ASM5); super(API_VERSION);
mMap = map; mMap = map;
} }
@@ -17,13 +17,13 @@ internal class BinAnnData(
val args: ArrayList<BinAnnArgData> = arrayListOf() val args: ArrayList<BinAnnArgData> = arrayListOf()
) )
private class TemplateAnnotationVisitor(val anns: ArrayList<BinAnnData> = arrayListOf()) : AnnotationVisitor(Opcodes.ASM5) { private class TemplateAnnotationVisitor(val anns: ArrayList<BinAnnData> = arrayListOf()) : AnnotationVisitor(Opcodes.API_VERSION) {
override fun visit(name: String?, value: Any?) { override fun visit(name: String?, value: Any?) {
anns.last().args.add(BinAnnArgData(name, value.toString())) anns.last().args.add(BinAnnArgData(name, value.toString()))
} }
} }
private class TemplateClassVisitor(val annVisitor: TemplateAnnotationVisitor) : ClassVisitor(Opcodes.ASM5) { private class TemplateClassVisitor(val annVisitor: TemplateAnnotationVisitor) : ClassVisitor(Opcodes.API_VERSION) {
override fun visitAnnotation(desc: String, visible: Boolean): AnnotationVisitor? { override fun visitAnnotation(desc: String, visible: Boolean): AnnotationVisitor? {
val shortName = Type.getType(desc).internalName.substringAfterLast("/") val shortName = Type.getType(desc).internalName.substringAfterLast("/")
if (shortName.startsWith("KotlinScript") || shortName.startsWith("ScriptTemplate")) { if (shortName.startsWith("KotlinScript") || shortName.startsWith("ScriptTemplate")) {
@@ -70,7 +70,7 @@ class MockApplicationCreationTracingInstrumenter(private val debugInfo: Boolean)
predicate: (name: String, desc: String) -> Boolean, predicate: (name: String, desc: String) -> Boolean,
transform: (original: MethodVisitor) -> MethodVisitor transform: (original: MethodVisitor) -> MethodVisitor
): ClassVisitor { ): ClassVisitor {
return object : ClassVisitor(Opcodes.ASM6, out) { return object : ClassVisitor(Opcodes.API_VERSION, out) {
var visited = false var visited = false
@@ -95,7 +95,7 @@ class MockApplicationCreationTracingInstrumenter(private val debugInfo: Boolean)
private fun transformMockComponentManagerPicoContainer(out: ClassVisitor): ClassVisitor { private fun transformMockComponentManagerPicoContainer(out: ClassVisitor): ClassVisitor {
return createMethodTransformClassVisitor(out, { name, _ -> name == "getComponentInstance" }) { original -> return createMethodTransformClassVisitor(out, { name, _ -> name == "getComponentInstance" }) { original ->
object : MethodVisitor(Opcodes.ASM6, original) { object : MethodVisitor(Opcodes.API_VERSION, original) {
override fun visitCode() { override fun visitCode() {
super.visitCode() super.visitCode()
visitLabel(Label()) visitLabel(Label())
@@ -115,7 +115,7 @@ class MockApplicationCreationTracingInstrumenter(private val debugInfo: Boolean)
private fun transformMockComponentManager(out: ClassVisitor): ClassVisitor { private fun transformMockComponentManager(out: ClassVisitor): ClassVisitor {
return createMethodTransformClassVisitor(out, { name, _ -> name == "<init>" }) { original -> return createMethodTransformClassVisitor(out, { name, _ -> name == "<init>" }) { original ->
object : MethodVisitor(Opcodes.ASM6, original) { object : MethodVisitor(Opcodes.API_VERSION, original) {
override fun visitInsn(opcode: Int) { override fun visitInsn(opcode: Int) {
if (opcode == Opcodes.RETURN) { if (opcode == Opcodes.RETURN) {
visitVarInsn(Opcodes.ALOAD, 0) visitVarInsn(Opcodes.ALOAD, 0)