Minor: Move changeSuperToMagicAccessor() function to its single use site, J2K it

This commit is contained in:
Yan Zhulanow
2018-11-26 16:44:19 +09:00
parent 9498eb8d4d
commit 60d2490c45
2 changed files with 29 additions and 42 deletions
@@ -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();
}
}
@@ -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<String>?
) {
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)
}
}