From 54a615fcd34d08398ea9665853179c63774ea451 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Sat, 5 Mar 2016 18:20:38 +0300 Subject: [PATCH] Support inlining 'arrayOf' and 'emptyArray' with no stdlib in classpath Previously an exception was thrown on trying to inline arrayOf/emptyArray when compiling with "-no-stdlib" (or in tests without a dependency on the stdlib), because these functions were found in a built-in package fragment which does not have the bytecode associated with it --- .../jetbrains/kotlin/codegen/inline/InlineCodegen.java | 10 +++++++++- .../codegen/intrinsics/IntrinsicArrayConstructors.kt | 6 +++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegen.java index 83d32915c3f..ae05241243d 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegen.java @@ -22,6 +22,7 @@ import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.backend.common.CodegenUtil; +import org.jetbrains.kotlin.builtins.BuiltinsPackageFragment; import org.jetbrains.kotlin.codegen.*; import org.jetbrains.kotlin.codegen.context.*; import org.jetbrains.kotlin.codegen.intrinsics.IntrinsicArrayConstructorsKt; @@ -195,7 +196,7 @@ public class InlineCodegen extends CallGenerator { : jvmSignature.getAsmMethod(); SMAPAndMethodNode nodeAndSMAP; - if (functionDescriptor instanceof FictitiousArrayConstructor) { + if (isBuiltInArrayIntrinsic(functionDescriptor)) { nodeAndSMAP = InlineCodegenUtil.getMethodNode( IntrinsicArrayConstructorsKt.getBytecode(), asmMethod.getName(), @@ -267,6 +268,13 @@ public class InlineCodegen extends CallGenerator { return nodeAndSMAP; } + private static boolean isBuiltInArrayIntrinsic(@NotNull FunctionDescriptor functionDescriptor) { + if (functionDescriptor instanceof FictitiousArrayConstructor) return true; + String name = functionDescriptor.getName().asString(); + return (name.equals("arrayOf") || name.equals("emptyArray")) && + functionDescriptor.getContainingDeclaration() instanceof BuiltinsPackageFragment; + } + private InlineResult inlineCall(SMAPAndMethodNode nodeAndSmap) { MethodNode node = nodeAndSmap.getNode(); ReifiedTypeParametersUsages reificationResult = reifiedTypeInliner.reifyInstructions(node); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/IntrinsicArrayConstructors.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/IntrinsicArrayConstructors.kt index cab7796d484..7ecaf19fa00 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/IntrinsicArrayConstructors.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/IntrinsicArrayConstructors.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -@file:Suppress("unused") +@file:Suppress("unused", "UNCHECKED_CAST", "CAST_NEVER_SUCCEEDS") package org.jetbrains.kotlin.codegen.intrinsics @@ -34,6 +34,10 @@ internal val bytecode: ByteArray by lazy { } } +private inline fun emptyArray(): Array = arrayOfNulls(0) as Array + +private inline fun arrayOf(vararg elements: T): Array = elements as Array + private inline fun Array(size: Int, init: (Int) -> T): Array { val result = arrayOfNulls(size) for (i in 0..size - 1) {