diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/CompilingEvaluatorUtils.java b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/CompilingEvaluatorUtils.java deleted file mode 100644 index b1a58d3a2d3..00000000000 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/CompilingEvaluatorUtils.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2000-2014 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jetbrains.kotlin.idea.debugger.evaluate; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.org.objectweb.asm.ClassReader; -import org.jetbrains.org.objectweb.asm.ClassVisitor; -import org.jetbrains.org.objectweb.asm.ClassWriter; -import org.jetbrains.org.objectweb.asm.Opcodes; - -public class CompilingEvaluatorUtils { - // Copied from com.intellij.debugger.ui.impl.watch.CompilingEvaluator.changeSuperToMagicAccessor - public static byte[] changeSuperToMagicAccessor(byte[] bytes) { - ClassWriter classWriter = new ClassWriter(0); - ClassVisitor classVisitor = new ClassVisitor(Opcodes.API_VERSION, classWriter) { - @Override - public void visit(int version, int access, @NotNull String name, String signature, String superName, String[] interfaces) { - if ("java/lang/Object".equals(superName)) { - superName = "sun/reflect/MagicAccessorImpl"; - } - super.visit(version, access, name, signature, superName, interfaces); - } - }; - new ClassReader(bytes).accept(classVisitor, 0); - return classWriter.toByteArray(); - } -} diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/classLoading/OrdinaryClassLoadingAdapter.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/classLoading/OrdinaryClassLoadingAdapter.kt index be187ee2524..4e6dd606cc1 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/classLoading/OrdinaryClassLoadingAdapter.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/classLoading/OrdinaryClassLoadingAdapter.kt @@ -25,8 +25,11 @@ import com.intellij.openapi.projectRoots.JavaSdkVersion import com.intellij.openapi.util.SystemInfo import com.sun.jdi.ClassLoaderReference import com.sun.jdi.ClassType -import org.jetbrains.kotlin.idea.debugger.evaluate.CompilingEvaluatorUtils import org.jetbrains.kotlin.idea.debugger.isDexDebug +import org.jetbrains.org.objectweb.asm.ClassReader +import org.jetbrains.org.objectweb.asm.ClassVisitor +import org.jetbrains.org.objectweb.asm.ClassWriter +import org.jetbrains.org.objectweb.asm.Opcodes class OrdinaryClassLoadingAdapter : ClassLoadingAdapter { private companion object { @@ -35,6 +38,30 @@ class OrdinaryClassLoadingAdapter : ClassLoadingAdapter { // to load its superclass. It will succeed, probably with the help of some parent class loader, and the subsequent attempt to define // the patched version of that superclass will fail with LinkageError (cannot redefine class) private val LAMBDA_SUPERCLASSES = listOf(ClassBytes("kotlin.jvm.internal.Lambda")) + + // Copied from com.intellij.debugger.ui.impl.watch.CompilingEvaluator.changeSuperToMagicAccessor + fun changeSuperToMagicAccessor(bytes: ByteArray): ByteArray { + val classWriter = ClassWriter(0) + val classVisitor = object : ClassVisitor(Opcodes.API_VERSION, classWriter) { + override fun visit( + version: Int, + access: Int, + name: String, + signature: String?, + superName: String?, + interfaces: Array? + ) { + var newSuperName = superName + if ("java/lang/Object" == newSuperName) { + newSuperName = "sun/reflect/MagicAccessorImpl" + } + + super.visit(version, access, name, signature, newSuperName, interfaces) + } + } + ClassReader(bytes).accept(classVisitor, 0) + return classWriter.toByteArray() + } } override fun isApplicable(context: EvaluationContextImpl, info: ClassLoadingAdapter.Companion.ClassInfoForEvaluator) = with(info) { @@ -93,7 +120,7 @@ class OrdinaryClassLoadingAdapter : ClassLoadingAdapter { } for ((className, _, bytes) in classesToLoad) { - val patchedBytes = CompilingEvaluatorUtils.changeSuperToMagicAccessor(bytes) + val patchedBytes = changeSuperToMagicAccessor(bytes) defineClass(className, patchedBytes, context, process, classLoader) } }