Support generic array creation for reified inlined
This commit is contained in:
committed by
Andrey Breslav
parent
060c30746f
commit
4a66ab3627
@@ -30,9 +30,7 @@ import org.jetbrains.jet.backend.common.CodegenUtil;
|
|||||||
import org.jetbrains.jet.codegen.binding.CalculatedClosure;
|
import org.jetbrains.jet.codegen.binding.CalculatedClosure;
|
||||||
import org.jetbrains.jet.codegen.binding.CodegenBinding;
|
import org.jetbrains.jet.codegen.binding.CodegenBinding;
|
||||||
import org.jetbrains.jet.codegen.context.*;
|
import org.jetbrains.jet.codegen.context.*;
|
||||||
import org.jetbrains.jet.codegen.inline.InlineCodegen;
|
import org.jetbrains.jet.codegen.inline.*;
|
||||||
import org.jetbrains.jet.codegen.inline.InlineCodegenUtil;
|
|
||||||
import org.jetbrains.jet.codegen.inline.NameGenerator;
|
|
||||||
import org.jetbrains.jet.codegen.intrinsics.IntrinsicMethod;
|
import org.jetbrains.jet.codegen.intrinsics.IntrinsicMethod;
|
||||||
import org.jetbrains.jet.codegen.intrinsics.IntrinsicMethods;
|
import org.jetbrains.jet.codegen.intrinsics.IntrinsicMethods;
|
||||||
import org.jetbrains.jet.codegen.state.GenerationState;
|
import org.jetbrains.jet.codegen.state.GenerationState;
|
||||||
@@ -2186,8 +2184,8 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
|||||||
resolvedCall = ((VariableAsFunctionResolvedCall) resolvedCall).getFunctionCall();
|
resolvedCall = ((VariableAsFunctionResolvedCall) resolvedCall).getFunctionCall();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CallGenerator callGenerator = getOrCreateCallGenerator(resolvedCall);
|
||||||
CallableDescriptor descriptor = resolvedCall.getResultingDescriptor();
|
CallableDescriptor descriptor = resolvedCall.getResultingDescriptor();
|
||||||
CallGenerator callGenerator = getOrCreateCallGenerator(descriptor, resolvedCall.getCall().getCallElement());
|
|
||||||
|
|
||||||
assert callGenerator == defaultCallGenerator || !tailRecursionCodegen.isTailRecursion(resolvedCall) :
|
assert callGenerator == defaultCallGenerator || !tailRecursionCodegen.isTailRecursion(resolvedCall) :
|
||||||
"Tail recursive method can't be inlined: " + descriptor;
|
"Tail recursive method can't be inlined: " + descriptor;
|
||||||
@@ -2230,7 +2228,11 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
protected CallGenerator getOrCreateCallGenerator(@NotNull CallableDescriptor descriptor, @Nullable JetElement callElement) {
|
protected CallGenerator getOrCreateCallGenerator(
|
||||||
|
@NotNull CallableDescriptor descriptor,
|
||||||
|
@Nullable JetElement callElement,
|
||||||
|
@Nullable ReifiedTypeParameterMappings reifierTypeParameterMappings
|
||||||
|
) {
|
||||||
if (callElement == null) return defaultCallGenerator;
|
if (callElement == null) return defaultCallGenerator;
|
||||||
|
|
||||||
boolean isInline = state.isInlineEnabled() &&
|
boolean isInline = state.isInlineEnabled() &&
|
||||||
@@ -2240,7 +2242,43 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
|||||||
if (!isInline) return defaultCallGenerator;
|
if (!isInline) return defaultCallGenerator;
|
||||||
|
|
||||||
SimpleFunctionDescriptor original = DescriptorUtils.unwrapFakeOverride((SimpleFunctionDescriptor) descriptor.getOriginal());
|
SimpleFunctionDescriptor original = DescriptorUtils.unwrapFakeOverride((SimpleFunctionDescriptor) descriptor.getOriginal());
|
||||||
return new InlineCodegen(this, state, original, callElement);
|
return new InlineCodegen(this, state, original, callElement, reifierTypeParameterMappings);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public CallGenerator getOrCreateCallGenerator(@NotNull FunctionDescriptor descriptor, @Nullable JetNamedFunction function) {
|
||||||
|
return getOrCreateCallGenerator(descriptor, function, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private CallGenerator getOrCreateCallGenerator(@NotNull ResolvedCall<?> resolvedCall) {
|
||||||
|
Map<TypeParameterDescriptor, JetType> typeArguments = resolvedCall.getTypeArguments();
|
||||||
|
ReifiedTypeParameterMappings mappings = new ReifiedTypeParameterMappings(typeArguments.size());
|
||||||
|
for (Map.Entry<TypeParameterDescriptor, JetType> entry : typeArguments.entrySet()) {
|
||||||
|
TypeParameterDescriptor key = entry.getKey();
|
||||||
|
if (!key.isReified()) continue;
|
||||||
|
|
||||||
|
TypeParameterDescriptor parameterDescriptor = TypeUtils.getTypeParameterDescriptorOrNull(entry.getValue());
|
||||||
|
if (parameterDescriptor == null) {
|
||||||
|
// type is not generic
|
||||||
|
// boxType call needed because inlined method is compiled for T as java/lang/Object
|
||||||
|
mappings.addParameterMappingToType(
|
||||||
|
key.getIndex(),
|
||||||
|
key.getName().getIdentifier(),
|
||||||
|
boxType(asmType(entry.getValue()))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
mappings.addParameterMappingToNewParameter(
|
||||||
|
key.getIndex(),
|
||||||
|
key.getName().getIdentifier(),
|
||||||
|
parameterDescriptor.getIndex()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return getOrCreateCallGenerator(
|
||||||
|
resolvedCall.getResultingDescriptor(), resolvedCall.getCall().getCallElement(), mappings
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void generateReceiverValue(@NotNull ReceiverValue receiverValue, @NotNull Type type) {
|
public void generateReceiverValue(@NotNull ReceiverValue receiverValue, @NotNull Type type) {
|
||||||
@@ -3373,6 +3411,16 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
|||||||
|
|
||||||
if (isArray) {
|
if (isArray) {
|
||||||
gen(args.get(0), Type.INT_TYPE);
|
gen(args.get(0), Type.INT_TYPE);
|
||||||
|
TypeParameterDescriptor parameterDescriptor = TypeUtils.getTypeParameterDescriptorOrNull(
|
||||||
|
arrayType.getArguments().get(0).getType()
|
||||||
|
);
|
||||||
|
if (parameterDescriptor != null && parameterDescriptor.isReified()) {
|
||||||
|
v.iconst(parameterDescriptor.getIndex());
|
||||||
|
v.invokestatic(
|
||||||
|
IntrinsicMethods.INTRINSICS_CLASS_NAME, ReifiedTypeInliner.NEW_ARRAY_MARKER_METHOD_NAME,
|
||||||
|
Type.getMethodDescriptor(Type.VOID_TYPE, Type.INT_TYPE), false
|
||||||
|
);
|
||||||
|
}
|
||||||
v.newarray(boxType(asmType(arrayType.getArguments().get(0).getType())));
|
v.newarray(boxType(asmType(arrayType.getArguments().get(0).getType())));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
@@ -76,13 +76,16 @@ public class InlineCodegen implements CallGenerator {
|
|||||||
protected final ParametersBuilder invocationParamBuilder = ParametersBuilder.newBuilder();
|
protected final ParametersBuilder invocationParamBuilder = ParametersBuilder.newBuilder();
|
||||||
protected final Map<Integer, LambdaInfo> expressionMap = new HashMap<Integer, LambdaInfo>();
|
protected final Map<Integer, LambdaInfo> expressionMap = new HashMap<Integer, LambdaInfo>();
|
||||||
|
|
||||||
|
private final ReifiedTypeInliner reifiedTypeInliner;
|
||||||
|
|
||||||
private LambdaInfo activeLambda;
|
private LambdaInfo activeLambda;
|
||||||
|
|
||||||
public InlineCodegen(
|
public InlineCodegen(
|
||||||
@NotNull ExpressionCodegen codegen,
|
@NotNull ExpressionCodegen codegen,
|
||||||
@NotNull GenerationState state,
|
@NotNull GenerationState state,
|
||||||
@NotNull SimpleFunctionDescriptor functionDescriptor,
|
@NotNull SimpleFunctionDescriptor functionDescriptor,
|
||||||
@NotNull JetElement callElement
|
@NotNull JetElement callElement,
|
||||||
|
@Nullable ReifiedTypeParameterMappings typeParameterMappings
|
||||||
) {
|
) {
|
||||||
assert functionDescriptor.getInlineStrategy().isInline() : "InlineCodegen could inline only inline function but " + functionDescriptor;
|
assert functionDescriptor.getInlineStrategy().isInline() : "InlineCodegen could inline only inline function but " + functionDescriptor;
|
||||||
|
|
||||||
@@ -91,6 +94,9 @@ public class InlineCodegen implements CallGenerator {
|
|||||||
this.codegen = codegen;
|
this.codegen = codegen;
|
||||||
this.callElement = callElement;
|
this.callElement = callElement;
|
||||||
this.functionDescriptor = functionDescriptor.getOriginal();
|
this.functionDescriptor = functionDescriptor.getOriginal();
|
||||||
|
|
||||||
|
reifiedTypeInliner = new ReifiedTypeInliner(typeParameterMappings);
|
||||||
|
|
||||||
initialFrameSize = codegen.getFrameMap().getCurrentSize();
|
initialFrameSize = codegen.getFrameMap().getCurrentSize();
|
||||||
|
|
||||||
context = (MethodContext) getContext(functionDescriptor, state);
|
context = (MethodContext) getContext(functionDescriptor, state);
|
||||||
@@ -200,6 +206,7 @@ public class InlineCodegen implements CallGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private InlineResult inlineCall(MethodNode node) {
|
private InlineResult inlineCall(MethodNode node) {
|
||||||
|
reifiedTypeInliner.reifyInstructions(node.instructions);
|
||||||
generateClosuresBodies();
|
generateClosuresBodies();
|
||||||
|
|
||||||
//through generation captured parameters will be added to invocationParamBuilder
|
//through generation captured parameters will be added to invocationParamBuilder
|
||||||
|
|||||||
@@ -0,0 +1,125 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2014 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.jet.codegen.inline
|
||||||
|
|
||||||
|
import org.jetbrains.org.objectweb.asm.Type
|
||||||
|
import org.jetbrains.org.objectweb.asm.tree.InsnList
|
||||||
|
import org.jetbrains.org.objectweb.asm.tree.MethodInsnNode
|
||||||
|
import org.jetbrains.org.objectweb.asm.tree.AbstractInsnNode
|
||||||
|
import org.jetbrains.org.objectweb.asm.Opcodes
|
||||||
|
import org.jetbrains.org.objectweb.asm.tree.IntInsnNode
|
||||||
|
import org.jetbrains.org.objectweb.asm.tree.TypeInsnNode
|
||||||
|
import org.jetbrains.org.objectweb.asm.tree.InsnNode
|
||||||
|
import org.jetbrains.org.objectweb.asm.tree.MethodNode
|
||||||
|
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
|
||||||
|
import org.jetbrains.jet.codegen.intrinsics.IntrinsicMethods
|
||||||
|
import kotlin.platform.platformStatic
|
||||||
|
import org.jetbrains.org.objectweb.asm.tree.LdcInsnNode
|
||||||
|
import java.util.ArrayList
|
||||||
|
|
||||||
|
public class ReifiedTypeInliner(private val parametersMapping: ReifiedTypeParameterMappings?) {
|
||||||
|
|
||||||
|
class object {
|
||||||
|
public val NEW_ARRAY_MARKER_METHOD_NAME: String = "reifyNewArray"
|
||||||
|
}
|
||||||
|
|
||||||
|
public fun reifyInstructions(instructions: InsnList) {
|
||||||
|
if (parametersMapping == null) return
|
||||||
|
for (insn in instructions.toArray()) {
|
||||||
|
if (isReifiedMarker(insn)) {
|
||||||
|
processReifyMarker(insn as MethodInsnNode, instructions)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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")
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun processReifyMarker(insn: MethodInsnNode, instructions: InsnList) {
|
||||||
|
val mapping = getTypeParameterMapping(insn) ?: return
|
||||||
|
|
||||||
|
if (mapping.asmType != null) {
|
||||||
|
if (!when (insn.name) {
|
||||||
|
NEW_ARRAY_MARKER_METHOD_NAME -> processNewArray(insn, mapping.asmType)
|
||||||
|
else -> false
|
||||||
|
}) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
instructions.remove(insn.getPrevious()!!)
|
||||||
|
instructions.remove(insn)
|
||||||
|
} else {
|
||||||
|
instructions.set(insn.getPrevious()!!, iconstInsn(mapping.newIndex!!))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun processNewArray(insn: MethodInsnNode, parameter: Type): Boolean {
|
||||||
|
if (insn.getNext()?.getOpcode() != Opcodes.ANEWARRAY) return false
|
||||||
|
val next = insn.getNext() as TypeInsnNode
|
||||||
|
next.desc = parameter.getInternalName()
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getParameterIndex(insn: MethodInsnNode): Int? {
|
||||||
|
val prev = insn.getPrevious()!!
|
||||||
|
|
||||||
|
return when (prev.getOpcode()) {
|
||||||
|
Opcodes.ICONST_0 -> 0
|
||||||
|
Opcodes.ICONST_1 -> 1
|
||||||
|
Opcodes.ICONST_2 -> 2
|
||||||
|
Opcodes.ICONST_3 -> 3
|
||||||
|
Opcodes.ICONST_4 -> 4
|
||||||
|
Opcodes.ICONST_5 -> 5
|
||||||
|
Opcodes.BIPUSH, Opcodes.SIPUSH -> (prev as IntInsnNode).operand
|
||||||
|
Opcodes.LDC -> (prev as LdcInsnNode).cst as Int
|
||||||
|
else -> throw AssertionError("Unexpected opcode ${prev.getOpcode()}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getTypeParameterMapping(insn: MethodInsnNode): ReifiedTypeParameterMapping? {
|
||||||
|
return parametersMapping?.get(getParameterIndex(insn) ?: return null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ReifiedTypeParameterMappings(private val size: Int) {
|
||||||
|
private val mappingsByIndex = arrayOfNulls<ReifiedTypeParameterMapping>(size)
|
||||||
|
private val indexByParameterName = hashMapOf<String, Int>()
|
||||||
|
|
||||||
|
public fun addParameterMappingToType(index: Int, name: String, asmType: Type) {
|
||||||
|
mappingsByIndex[index] = ReifiedTypeParameterMapping(name, asmType, null)
|
||||||
|
indexByParameterName[name] = index
|
||||||
|
}
|
||||||
|
|
||||||
|
public fun addParameterMappingToNewParameter(index: Int, name: String, newIndex: Int) {
|
||||||
|
mappingsByIndex[index] = ReifiedTypeParameterMapping(name, null, newIndex)
|
||||||
|
indexByParameterName[name] = index
|
||||||
|
}
|
||||||
|
|
||||||
|
fun get(index: Int) = mappingsByIndex[index]
|
||||||
|
fun get(name: String): ReifiedTypeParameterMapping? {
|
||||||
|
return this[indexByParameterName[name] ?: return null]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ReifiedTypeParameterMapping(val name: String, val asmType: Type?, val newIndex: Int?)
|
||||||
|
|
||||||
|
private fun iconstInsn(n: Int): AbstractInsnNode {
|
||||||
|
val node = MethodNode()
|
||||||
|
InstructionAdapter(node).iconst(n)
|
||||||
|
return node.instructions.getFirst()!!
|
||||||
|
}
|
||||||
+5
-1
@@ -19,6 +19,7 @@ package org.jetbrains.jet.lang.resolve.calls;
|
|||||||
import com.intellij.psi.PsiElement;
|
import com.intellij.psi.PsiElement;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
|
import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
|
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
|
||||||
import org.jetbrains.jet.lang.diagnostics.Errors;
|
import org.jetbrains.jet.lang.diagnostics.Errors;
|
||||||
import org.jetbrains.jet.lang.psi.JetExpression;
|
import org.jetbrains.jet.lang.psi.JetExpression;
|
||||||
@@ -38,7 +39,10 @@ public class TypeParameterAsReifiedCheck implements CallResolverExtension {
|
|||||||
for (Map.Entry<TypeParameterDescriptor, JetType> entry : typeArguments.entrySet()) {
|
for (Map.Entry<TypeParameterDescriptor, JetType> entry : typeArguments.entrySet()) {
|
||||||
TypeParameterDescriptor parameter = entry.getKey();
|
TypeParameterDescriptor parameter = entry.getKey();
|
||||||
JetType argument = entry.getValue();
|
JetType argument = entry.getValue();
|
||||||
if (parameter.isReified() && argument.getConstructor().getDeclarationDescriptor() instanceof TypeParameterDescriptor) {
|
ClassifierDescriptor argumentDeclarationDescription = argument.getConstructor().getDeclarationDescriptor();
|
||||||
|
if (parameter.isReified() && argumentDeclarationDescription instanceof TypeParameterDescriptor &&
|
||||||
|
!((TypeParameterDescriptor) argumentDeclarationDescription).isReified()
|
||||||
|
) {
|
||||||
JetExpression callee = context.call.getCalleeExpression();
|
JetExpression callee = context.call.getCalleeExpression();
|
||||||
PsiElement element = callee != null ? callee : context.call.getCallElement();
|
PsiElement element = callee != null ? callee : context.call.getCallElement();
|
||||||
context.trace.report(Errors.TYPE_PARAMETER_AS_REIFIED.on(element, typeArguments.keySet().iterator().next()));
|
context.trace.report(Errors.TYPE_PARAMETER_AS_REIFIED.on(element, typeArguments.keySet().iterator().next()));
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
import kotlin.InlineOption.*
|
||||||
|
|
||||||
|
inline fun<reified T> createArray(n: Int, inlineOptions(ONLY_LOCAL_RETURN) block: () -> T): Array<T> {
|
||||||
|
return Array<T>(n) { block() }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
|
||||||
|
val x = createArray<Int>(5) { 3 }
|
||||||
|
|
||||||
|
assert(x.all { it == 3 })
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
import kotlin.InlineOption.*
|
||||||
|
|
||||||
|
inline fun<reified T> createArray(n: Int, inlineOptions(ONLY_LOCAL_RETURN) block: () -> T): Array<T> {
|
||||||
|
return Array<T>(n) { block() }
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun<T1, T2, T3, T4, T5, T6, reified R> recursive(
|
||||||
|
inlineOptions(ONLY_LOCAL_RETURN) block: () -> R
|
||||||
|
): Array<R> {
|
||||||
|
return createArray(5) { block() }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val x = recursive<Int, Int, Int, Int, Int, Int, String>(){ "abc" }
|
||||||
|
|
||||||
|
assert(x.all { it == "abc" })
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
import kotlin.InlineOption.*
|
||||||
|
|
||||||
|
inline fun<reified T1, reified T2> createArray(n: Int, inlineOptions(ONLY_LOCAL_RETURN) block: () -> Pair<T1, T2>): Pair<Array<T1>, Array<T2>> {
|
||||||
|
return Pair(Array(n) { block().first }, Array(n) { block().second })
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun<T1, T2, T3, T4, T5, T6, reified R> recursive(
|
||||||
|
inlineOptions(ONLY_LOCAL_RETURN) block: () -> R
|
||||||
|
): Pair<Array<R>, Array<R>> {
|
||||||
|
return createArray(5) { Pair(block(), block()) }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val y = createArray(5) { Pair(1, "test") }
|
||||||
|
val x = recursive<Int, Int, Int, Int, Int, Int, String>(){ "abc" }
|
||||||
|
|
||||||
|
assert(y.first.all { it == 1 } )
|
||||||
|
assert(y.second.all { it == "test" })
|
||||||
|
assert(x.first.all { it == "abc" })
|
||||||
|
assert(x.second.all { it == "abc" })
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+28
-1
@@ -30,7 +30,7 @@ import java.util.regex.Pattern;
|
|||||||
@SuppressWarnings("all")
|
@SuppressWarnings("all")
|
||||||
@TestMetadata("compiler/testData/codegen/boxWithStdlib")
|
@TestMetadata("compiler/testData/codegen/boxWithStdlib")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@InnerTestClasses({BlackBoxWithStdlibCodegenTestGenerated.Annotations.class, BlackBoxWithStdlibCodegenTestGenerated.Arrays.class, BlackBoxWithStdlibCodegenTestGenerated.BoxingOptimization.class, BlackBoxWithStdlibCodegenTestGenerated.CallableReference.class, BlackBoxWithStdlibCodegenTestGenerated.Casts.class, BlackBoxWithStdlibCodegenTestGenerated.DataClasses.class, BlackBoxWithStdlibCodegenTestGenerated.DefaultArguments.class, BlackBoxWithStdlibCodegenTestGenerated.Enum.class, BlackBoxWithStdlibCodegenTestGenerated.Evaluate.class, BlackBoxWithStdlibCodegenTestGenerated.FullJdk.class, BlackBoxWithStdlibCodegenTestGenerated.HashPMap.class, BlackBoxWithStdlibCodegenTestGenerated.Intrinsics.class, BlackBoxWithStdlibCodegenTestGenerated.JdkAnnotations.class, BlackBoxWithStdlibCodegenTestGenerated.NonLocalReturns.class, BlackBoxWithStdlibCodegenTestGenerated.PlatformNames.class, BlackBoxWithStdlibCodegenTestGenerated.PlatformStatic.class, BlackBoxWithStdlibCodegenTestGenerated.PlatformTypes.class, BlackBoxWithStdlibCodegenTestGenerated.Ranges.class, BlackBoxWithStdlibCodegenTestGenerated.Reflection.class, BlackBoxWithStdlibCodegenTestGenerated.Regressions.class, BlackBoxWithStdlibCodegenTestGenerated.StoreStackBeforeInline.class, BlackBoxWithStdlibCodegenTestGenerated.Strings.class, BlackBoxWithStdlibCodegenTestGenerated.ToArray.class, BlackBoxWithStdlibCodegenTestGenerated.Vararg.class, BlackBoxWithStdlibCodegenTestGenerated.When.class, BlackBoxWithStdlibCodegenTestGenerated.WhenEnumOptimization.class, BlackBoxWithStdlibCodegenTestGenerated.WhenStringOptimization.class})
|
@InnerTestClasses({BlackBoxWithStdlibCodegenTestGenerated.Annotations.class, BlackBoxWithStdlibCodegenTestGenerated.Arrays.class, BlackBoxWithStdlibCodegenTestGenerated.BoxingOptimization.class, BlackBoxWithStdlibCodegenTestGenerated.CallableReference.class, BlackBoxWithStdlibCodegenTestGenerated.Casts.class, BlackBoxWithStdlibCodegenTestGenerated.DataClasses.class, BlackBoxWithStdlibCodegenTestGenerated.DefaultArguments.class, BlackBoxWithStdlibCodegenTestGenerated.Enum.class, BlackBoxWithStdlibCodegenTestGenerated.Evaluate.class, BlackBoxWithStdlibCodegenTestGenerated.FullJdk.class, BlackBoxWithStdlibCodegenTestGenerated.HashPMap.class, BlackBoxWithStdlibCodegenTestGenerated.Intrinsics.class, BlackBoxWithStdlibCodegenTestGenerated.JdkAnnotations.class, BlackBoxWithStdlibCodegenTestGenerated.NonLocalReturns.class, BlackBoxWithStdlibCodegenTestGenerated.PlatformNames.class, BlackBoxWithStdlibCodegenTestGenerated.PlatformStatic.class, BlackBoxWithStdlibCodegenTestGenerated.PlatformTypes.class, BlackBoxWithStdlibCodegenTestGenerated.Ranges.class, BlackBoxWithStdlibCodegenTestGenerated.Reflection.class, BlackBoxWithStdlibCodegenTestGenerated.Regressions.class, BlackBoxWithStdlibCodegenTestGenerated.Reified.class, BlackBoxWithStdlibCodegenTestGenerated.StoreStackBeforeInline.class, BlackBoxWithStdlibCodegenTestGenerated.Strings.class, BlackBoxWithStdlibCodegenTestGenerated.ToArray.class, BlackBoxWithStdlibCodegenTestGenerated.Vararg.class, BlackBoxWithStdlibCodegenTestGenerated.When.class, BlackBoxWithStdlibCodegenTestGenerated.WhenEnumOptimization.class, BlackBoxWithStdlibCodegenTestGenerated.WhenStringOptimization.class})
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
||||||
public void testAllFilesPresentInBoxWithStdlib() throws Exception {
|
public void testAllFilesPresentInBoxWithStdlib() throws Exception {
|
||||||
@@ -2412,6 +2412,33 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("compiler/testData/codegen/boxWithStdlib/reified")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public static class Reified extends AbstractBlackBoxCodegenTest {
|
||||||
|
public void testAllFilesPresentInReified() throws Exception {
|
||||||
|
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxWithStdlib/reified"), Pattern.compile("^(.+)\\.kt$"), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("newArrayInt.kt")
|
||||||
|
public void testNewArrayInt() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reified/newArrayInt.kt");
|
||||||
|
doTestWithStdlib(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("recursiveNewArray.kt")
|
||||||
|
public void testRecursiveNewArray() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reified/recursiveNewArray.kt");
|
||||||
|
doTestWithStdlib(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("sameIndexRecursive.kt")
|
||||||
|
public void testSameIndexRecursive() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reified/sameIndexRecursive.kt");
|
||||||
|
doTestWithStdlib(fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("compiler/testData/codegen/boxWithStdlib/storeStackBeforeInline")
|
@TestMetadata("compiler/testData/codegen/boxWithStdlib/storeStackBeforeInline")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
|||||||
@@ -102,6 +102,14 @@ public class Intrinsics {
|
|||||||
"throwParameterIsNullException"
|
"throwParameterIsNullException"
|
||||||
));
|
));
|
||||||
|
|
||||||
|
private static void throwUndefinedForReified() {
|
||||||
|
throw new UnsupportedOperationException("You should not use functions with reified parameter without inline");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void reifyNewArray(int parameterTypeIndex) {
|
||||||
|
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