Introduced new reified marker needClassReification
It's not parametrised by index
This commit is contained in:
committed by
Andrey Breslav
parent
c19c7d0ec7
commit
0087d861e1
@@ -30,8 +30,9 @@ import org.jetbrains.jet.codegen.intrinsics.IntrinsicMethods
|
|||||||
import kotlin.platform.platformStatic
|
import kotlin.platform.platformStatic
|
||||||
import org.jetbrains.org.objectweb.asm.tree.LdcInsnNode
|
import org.jetbrains.org.objectweb.asm.tree.LdcInsnNode
|
||||||
import java.util.ArrayList
|
import java.util.ArrayList
|
||||||
import org.jetbrains.org.objectweb.asm.signature.SignatureWriter
|
|
||||||
import org.jetbrains.org.objectweb.asm.signature.SignatureReader
|
import org.jetbrains.org.objectweb.asm.signature.SignatureReader
|
||||||
|
import org.jetbrains.org.objectweb.asm.signature.SignatureWriter
|
||||||
|
import org.jetbrains.org.objectweb.asm.MethodVisitor
|
||||||
|
|
||||||
public class ReifiedTypeInliner(private val parametersMapping: ReifiedTypeParameterMappings?) {
|
public class ReifiedTypeInliner(private val parametersMapping: ReifiedTypeParameterMappings?) {
|
||||||
|
|
||||||
@@ -40,12 +41,32 @@ public class ReifiedTypeInliner(private val parametersMapping: ReifiedTypeParame
|
|||||||
public val CHECKCAST_MARKER_METHOD_NAME: String = "reifyCheckcast"
|
public val CHECKCAST_MARKER_METHOD_NAME: String = "reifyCheckcast"
|
||||||
public val INSTANCEOF_MARKER_METHOD_NAME: String = "reifyInstanceof"
|
public val INSTANCEOF_MARKER_METHOD_NAME: String = "reifyInstanceof"
|
||||||
public val JAVA_CLASS_MARKER_METHOD_NAME: String = "reifyJavaClass"
|
public val JAVA_CLASS_MARKER_METHOD_NAME: String = "reifyJavaClass"
|
||||||
|
public val NEED_CLASS_REIFICATION_MARKER_METHOD_NAME: String = "needClassReification"
|
||||||
|
|
||||||
|
private fun isParametrisedReifiedMarker(insn: AbstractInsnNode) =
|
||||||
|
isReifiedMarker(insn) { it.startsWith("reify") }
|
||||||
|
|
||||||
|
private fun isReifiedMarker(insn: AbstractInsnNode, namePredicate: (String) -> Boolean): Boolean {
|
||||||
|
if (insn.getOpcode() != Opcodes.INVOKESTATIC || insn !is MethodInsnNode) return false
|
||||||
|
return insn.owner == IntrinsicMethods.INTRINSICS_CLASS_NAME && namePredicate(insn.name)
|
||||||
|
}
|
||||||
|
|
||||||
|
platformStatic public fun isNeedClassReificationMarker(insn: AbstractInsnNode): Boolean =
|
||||||
|
isReifiedMarker(insn) { s -> s == NEED_CLASS_REIFICATION_MARKER_METHOD_NAME }
|
||||||
|
|
||||||
|
platformStatic public fun putNeedClassReificationMarker(v: MethodVisitor) {
|
||||||
|
v.visitMethodInsn(
|
||||||
|
Opcodes.INVOKESTATIC,
|
||||||
|
IntrinsicMethods.INTRINSICS_CLASS_NAME, NEED_CLASS_REIFICATION_MARKER_METHOD_NAME,
|
||||||
|
Type.getMethodDescriptor(Type.VOID_TYPE), false
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public fun reifyInstructions(instructions: InsnList) {
|
public fun reifyInstructions(instructions: InsnList) {
|
||||||
if (parametersMapping == null) return
|
if (parametersMapping == null) return
|
||||||
for (insn in instructions.toArray()) {
|
for (insn in instructions.toArray()) {
|
||||||
if (isReifiedMarker(insn)) {
|
if (isParametrisedReifiedMarker(insn)) {
|
||||||
processReifyMarker(insn as MethodInsnNode, instructions)
|
processReifyMarker(insn as MethodInsnNode, instructions)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -86,11 +107,6 @@ public class ReifiedTypeInliner(private val parametersMapping: ReifiedTypeParame
|
|||||||
return SignatureReificationResult(signatureRemapper.toString(), signatureRemapper.needFurtherReification)
|
return SignatureReificationResult(signatureRemapper.toString(), signatureRemapper.needFurtherReification)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun isReifiedMarker(insn: AbstractInsnNode): Boolean {
|
|
||||||
if (insn.getOpcode() != Opcodes.INVOKESTATIC || insn !is MethodInsnNode) return false
|
|
||||||
return insn.owner == IntrinsicMethods.INTRINSICS_CLASS_NAME && insn.name.startsWith("reify")
|
|
||||||
}
|
|
||||||
|
|
||||||
data class SignatureReificationResult(val newSignature: String, val needFurtherReification: Boolean)
|
data class SignatureReificationResult(val newSignature: String, val needFurtherReification: Boolean)
|
||||||
|
|
||||||
private fun processReifyMarker(insn: MethodInsnNode, instructions: InsnList) {
|
private fun processReifyMarker(insn: MethodInsnNode, instructions: InsnList) {
|
||||||
|
|||||||
@@ -122,6 +122,10 @@ public class Intrinsics {
|
|||||||
throwUndefinedForReified();
|
throwUndefinedForReified();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void needClassReification() {
|
||||||
|
throwUndefinedForReified();
|
||||||
|
}
|
||||||
|
|
||||||
public static <T extends Throwable> T sanitizeStackTrace(T throwable) {
|
public static <T extends Throwable> T sanitizeStackTrace(T throwable) {
|
||||||
StackTraceElement[] stackTrace = throwable.getStackTrace();
|
StackTraceElement[] stackTrace = throwable.getStackTrace();
|
||||||
ArrayList<StackTraceElement> list = new ArrayList<StackTraceElement>(stackTrace.length);
|
ArrayList<StackTraceElement> list = new ArrayList<StackTraceElement>(stackTrace.length);
|
||||||
|
|||||||
Reference in New Issue
Block a user