Merge InlineCodegeUtil and InlineCodegeUtils
This commit is contained in:
@@ -20,6 +20,7 @@ import com.intellij.openapi.vfs.VirtualFile
|
|||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil
|
import org.jetbrains.kotlin.codegen.AsmUtil
|
||||||
import org.jetbrains.kotlin.codegen.ExpressionCodegen
|
import org.jetbrains.kotlin.codegen.ExpressionCodegen
|
||||||
|
import org.jetbrains.kotlin.codegen.JvmCodegenUtil
|
||||||
import org.jetbrains.kotlin.codegen.MemberCodegen
|
import org.jetbrains.kotlin.codegen.MemberCodegen
|
||||||
import org.jetbrains.kotlin.codegen.binding.CodegenBinding
|
import org.jetbrains.kotlin.codegen.binding.CodegenBinding
|
||||||
import org.jetbrains.kotlin.codegen.context.CodegenContext
|
import org.jetbrains.kotlin.codegen.context.CodegenContext
|
||||||
@@ -34,7 +35,11 @@ import org.jetbrains.kotlin.descriptors.*
|
|||||||
import org.jetbrains.kotlin.fileClasses.*
|
import org.jetbrains.kotlin.fileClasses.*
|
||||||
import org.jetbrains.kotlin.fileClasses.JvmFileClassesProvider
|
import org.jetbrains.kotlin.fileClasses.JvmFileClassesProvider
|
||||||
import org.jetbrains.kotlin.load.java.JvmAbi
|
import org.jetbrains.kotlin.load.java.JvmAbi
|
||||||
|
import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryPackageSourceElement
|
||||||
|
import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinarySourceElement
|
||||||
import org.jetbrains.kotlin.load.kotlin.VirtualFileFinder
|
import org.jetbrains.kotlin.load.kotlin.VirtualFileFinder
|
||||||
|
import org.jetbrains.kotlin.load.kotlin.VirtualFileKotlinClass
|
||||||
|
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
|
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
|
||||||
@@ -55,6 +60,8 @@ import java.io.StringWriter
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.resolve.jvm.AsmTypes.ENUM_TYPE
|
import org.jetbrains.kotlin.resolve.jvm.AsmTypes.ENUM_TYPE
|
||||||
import org.jetbrains.kotlin.resolve.jvm.AsmTypes.JAVA_CLASS_TYPE
|
import org.jetbrains.kotlin.resolve.jvm.AsmTypes.JAVA_CLASS_TYPE
|
||||||
|
import org.jetbrains.kotlin.resolve.source.PsiSourceElement
|
||||||
|
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor
|
||||||
|
|
||||||
|
|
||||||
const val GENERATE_SMAP = true
|
const val GENERATE_SMAP = true
|
||||||
@@ -545,4 +552,56 @@ fun createSpecialEnumMethodBody(
|
|||||||
|
|
||||||
fun getSpecialEnumFunDescriptor(type: Type, isValueOf: Boolean): String {
|
fun getSpecialEnumFunDescriptor(type: Type, isValueOf: Boolean): String {
|
||||||
return if (isValueOf) Type.getMethodDescriptor(type, AsmTypes.JAVA_STRING_TYPE) else Type.getMethodDescriptor(AsmUtil.getArrayType(type))
|
return if (isValueOf) Type.getMethodDescriptor(type, AsmTypes.JAVA_STRING_TYPE) else Type.getMethodDescriptor(AsmUtil.getArrayType(type))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
val FunctionDescriptor.sourceFilePath: String
|
||||||
|
get() {
|
||||||
|
val source = source as PsiSourceElement
|
||||||
|
val containingFile = source.psi?.containingFile
|
||||||
|
return containingFile?.virtualFile?.canonicalPath!!
|
||||||
|
}
|
||||||
|
|
||||||
|
fun FunctionDescriptor.getClassFilePath(typeMapper: KotlinTypeMapper, cache: IncrementalCache): String {
|
||||||
|
val container = containingDeclaration as? DeclarationDescriptorWithSource
|
||||||
|
val source = container?.source
|
||||||
|
|
||||||
|
return when (source) {
|
||||||
|
is KotlinJvmBinaryPackageSourceElement -> {
|
||||||
|
val directMember = JvmCodegenUtil.getDirectMember(this)
|
||||||
|
if (directMember !is DeserializedCallableMemberDescriptor) {
|
||||||
|
throw AssertionError("Expected DeserializedCallableMemberDescriptor, got: $this")
|
||||||
|
}
|
||||||
|
val kotlinClass = source.getContainingBinaryClass(directMember) ?:
|
||||||
|
throw AssertionError("Descriptor $this is not found, in: $source")
|
||||||
|
if (kotlinClass !is VirtualFileKotlinClass) {
|
||||||
|
throw AssertionError("Expected VirtualFileKotlinClass, got $kotlinClass")
|
||||||
|
}
|
||||||
|
kotlinClass.file.canonicalPath!!
|
||||||
|
}
|
||||||
|
is KotlinJvmBinarySourceElement -> {
|
||||||
|
val directMember = JvmCodegenUtil.getDirectMember(this)
|
||||||
|
assert(directMember is DeserializedCallableMemberDescriptor) { "Expected DeserializedSimpleFunctionDescriptor, got: $this" }
|
||||||
|
val kotlinClass = source.binaryClass as VirtualFileKotlinClass
|
||||||
|
kotlinClass.file.canonicalPath!!
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
val implementationOwnerType = typeMapper.mapImplementationOwner(this)
|
||||||
|
val className = implementationOwnerType.internalName
|
||||||
|
cache.getClassFilePath(className)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class InlineOnlySmapSkipper(codegen: ExpressionCodegen) {
|
||||||
|
|
||||||
|
val callLineNumber = codegen.lastLineNumber
|
||||||
|
|
||||||
|
fun markCallSiteLineNumber(mv: MethodVisitor) {
|
||||||
|
if (callLineNumber >= 0) {
|
||||||
|
val label = Label()
|
||||||
|
mv.visitLabel(label)
|
||||||
|
mv.visitLineNumber(callLineNumber, label)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,82 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2015 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.codegen.inline
|
|
||||||
|
|
||||||
import org.jetbrains.kotlin.codegen.ExpressionCodegen
|
|
||||||
import org.jetbrains.kotlin.codegen.JvmCodegenUtil
|
|
||||||
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
|
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithSource
|
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
|
||||||
import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryPackageSourceElement
|
|
||||||
import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinarySourceElement
|
|
||||||
import org.jetbrains.kotlin.load.kotlin.VirtualFileKotlinClass
|
|
||||||
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache
|
|
||||||
import org.jetbrains.kotlin.resolve.source.PsiSourceElement
|
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor
|
|
||||||
import org.jetbrains.org.objectweb.asm.Label
|
|
||||||
import org.jetbrains.org.objectweb.asm.MethodVisitor
|
|
||||||
|
|
||||||
val FunctionDescriptor.sourceFilePath: String
|
|
||||||
get() {
|
|
||||||
val source = source as PsiSourceElement
|
|
||||||
val containingFile = source.psi?.containingFile
|
|
||||||
return containingFile?.virtualFile?.canonicalPath!!
|
|
||||||
}
|
|
||||||
|
|
||||||
fun FunctionDescriptor.getClassFilePath(typeMapper: KotlinTypeMapper, cache: IncrementalCache): String {
|
|
||||||
val container = containingDeclaration as? DeclarationDescriptorWithSource
|
|
||||||
val source = container?.source
|
|
||||||
|
|
||||||
return when (source) {
|
|
||||||
is KotlinJvmBinaryPackageSourceElement -> {
|
|
||||||
val directMember = JvmCodegenUtil.getDirectMember(this)
|
|
||||||
if (directMember !is DeserializedCallableMemberDescriptor) {
|
|
||||||
throw AssertionError("Expected DeserializedCallableMemberDescriptor, got: $this")
|
|
||||||
}
|
|
||||||
val kotlinClass = source.getContainingBinaryClass(directMember) ?:
|
|
||||||
throw AssertionError("Descriptor $this is not found, in: $source")
|
|
||||||
if (kotlinClass !is VirtualFileKotlinClass) {
|
|
||||||
throw AssertionError("Expected VirtualFileKotlinClass, got $kotlinClass")
|
|
||||||
}
|
|
||||||
kotlinClass.file.canonicalPath!!
|
|
||||||
}
|
|
||||||
is KotlinJvmBinarySourceElement -> {
|
|
||||||
val directMember = JvmCodegenUtil.getDirectMember(this)
|
|
||||||
assert(directMember is DeserializedCallableMemberDescriptor) { "Expected DeserializedSimpleFunctionDescriptor, got: $this" }
|
|
||||||
val kotlinClass = source.binaryClass as VirtualFileKotlinClass
|
|
||||||
kotlinClass.file.canonicalPath!!
|
|
||||||
}
|
|
||||||
else -> {
|
|
||||||
val implementationOwnerType = typeMapper.mapImplementationOwner(this)
|
|
||||||
val className = implementationOwnerType.internalName
|
|
||||||
cache.getClassFilePath(className)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class InlineOnlySmapSkipper(codegen: ExpressionCodegen) {
|
|
||||||
|
|
||||||
val callLineNumber = codegen.lastLineNumber
|
|
||||||
|
|
||||||
fun markCallSiteLineNumber(mv: MethodVisitor) {
|
|
||||||
if (callLineNumber >= 0) {
|
|
||||||
val label = Label()
|
|
||||||
mv.visitLabel(label)
|
|
||||||
mv.visitLineNumber(callLineNumber, label)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+1
@@ -113,6 +113,7 @@ class ConstantConditionEliminationMethodTransformer : MethodTransformer() {
|
|||||||
actions.add {
|
actions.add {
|
||||||
methodNode.instructions.run {
|
methodNode.instructions.run {
|
||||||
insertBefore(insn, InsnNode(Opcodes.POP))
|
insertBefore(insn, InsnNode(Opcodes.POP))
|
||||||
|
|
||||||
insertBefore(insn, InsnNode(Opcodes.POP))
|
insertBefore(insn, InsnNode(Opcodes.POP))
|
||||||
if (constCondition)
|
if (constCondition)
|
||||||
set(insn, JumpInsnNode(Opcodes.GOTO, insn.label))
|
set(insn, JumpInsnNode(Opcodes.GOTO, insn.label))
|
||||||
|
|||||||
Reference in New Issue
Block a user