From bbb2b367942937c775dff1181d882bbc479aef0e Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Mon, 12 Jun 2017 10:22:46 +0200 Subject: [PATCH] Merge InlineCodegeUtil and InlineCodegeUtils --- .../codegen/inline/InlineCodegenUtil.kt | 59 +++++++++++++ .../codegen/inline/inlineCodegenUtils.kt | 82 ------------------- ...ntConditionEliminationMethodTransformer.kt | 1 + 3 files changed, 60 insertions(+), 82 deletions(-) delete mode 100644 compiler/backend/src/org/jetbrains/kotlin/codegen/inline/inlineCodegenUtils.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.kt index ee86fb4b388..47c1d7529c6 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.kt @@ -20,6 +20,7 @@ import com.intellij.openapi.vfs.VirtualFile import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.codegen.ExpressionCodegen +import org.jetbrains.kotlin.codegen.JvmCodegenUtil import org.jetbrains.kotlin.codegen.MemberCodegen import org.jetbrains.kotlin.codegen.binding.CodegenBinding 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.JvmFileClassesProvider 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.VirtualFileKotlinClass +import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name 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.JAVA_CLASS_TYPE +import org.jetbrains.kotlin.resolve.source.PsiSourceElement +import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor const val GENERATE_SMAP = true @@ -545,4 +552,56 @@ fun createSpecialEnumMethodBody( fun getSpecialEnumFunDescriptor(type: Type, isValueOf: Boolean): String { 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) + } + } } \ No newline at end of file diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/inlineCodegenUtils.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/inlineCodegenUtils.kt deleted file mode 100644 index 17eb406b45d..00000000000 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/inlineCodegenUtils.kt +++ /dev/null @@ -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) - } - } -} \ No newline at end of file diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/ConstantConditionEliminationMethodTransformer.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/ConstantConditionEliminationMethodTransformer.kt index 75331cc811a..d1c145c060a 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/ConstantConditionEliminationMethodTransformer.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/ConstantConditionEliminationMethodTransformer.kt @@ -113,6 +113,7 @@ class ConstantConditionEliminationMethodTransformer : MethodTransformer() { actions.add { methodNode.instructions.run { insertBefore(insn, InsnNode(Opcodes.POP)) + insertBefore(insn, InsnNode(Opcodes.POP)) if (constCondition) set(insn, JumpInsnNode(Opcodes.GOTO, insn.label))