From 0087d861e1f984276e25f3325f80d197cf39667d Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Mon, 13 Oct 2014 18:57:53 +0400 Subject: [PATCH] Introduced new reified marker needClassReification It's not parametrised by index --- .../jet/codegen/inline/ReifiedTypeInliner.kt | 30 ++++++++++++++----- .../src/kotlin/jvm/internal/Intrinsics.java | 4 +++ 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/inline/ReifiedTypeInliner.kt b/compiler/backend/src/org/jetbrains/jet/codegen/inline/ReifiedTypeInliner.kt index 23bd33ba03a..fa3acc46f6a 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/inline/ReifiedTypeInliner.kt +++ b/compiler/backend/src/org/jetbrains/jet/codegen/inline/ReifiedTypeInliner.kt @@ -30,8 +30,9 @@ import org.jetbrains.jet.codegen.intrinsics.IntrinsicMethods import kotlin.platform.platformStatic import org.jetbrains.org.objectweb.asm.tree.LdcInsnNode 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.SignatureWriter +import org.jetbrains.org.objectweb.asm.MethodVisitor 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 INSTANCEOF_MARKER_METHOD_NAME: String = "reifyInstanceof" 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) { if (parametersMapping == null) return for (insn in instructions.toArray()) { - if (isReifiedMarker(insn)) { + if (isParametrisedReifiedMarker(insn)) { processReifyMarker(insn as MethodInsnNode, instructions) } } @@ -86,11 +107,6 @@ public class ReifiedTypeInliner(private val parametersMapping: ReifiedTypeParame 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) private fun processReifyMarker(insn: MethodInsnNode, instructions: InsnList) { diff --git a/core/runtime.jvm/src/kotlin/jvm/internal/Intrinsics.java b/core/runtime.jvm/src/kotlin/jvm/internal/Intrinsics.java index 2cf6cb7883a..bc1287287f1 100644 --- a/core/runtime.jvm/src/kotlin/jvm/internal/Intrinsics.java +++ b/core/runtime.jvm/src/kotlin/jvm/internal/Intrinsics.java @@ -122,6 +122,10 @@ public class Intrinsics { throwUndefinedForReified(); } + public static void needClassReification() { + throwUndefinedForReified(); + } + public static T sanitizeStackTrace(T throwable) { StackTraceElement[] stackTrace = throwable.getStackTrace(); ArrayList list = new ArrayList(stackTrace.length);