From e2826a47e11a80fac63f53511d47b68a7e0d261d Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Thu, 20 Nov 2014 17:46:27 +0300 Subject: [PATCH] Remove "operation" method from StackValue.kt; Compilation fix: remove static import to kotlin from AsmUtil --- .../org/jetbrains/jet/codegen/AsmUtil.java | 10 ++----- .../org/jetbrains/jet/codegen/StackValue.kt | 4 --- .../jet/codegen/intrinsics/ArraySize.kt | 4 +-- .../jet/codegen/intrinsics/HashCode.kt | 4 +-- .../jet/codegen/intrinsics/Increment.kt | 9 +----- .../jet/codegen/intrinsics/StringGetChar.kt | 4 +-- .../jet/codegen/intrinsics/StringLength.kt | 4 +-- .../jet/codegen/intrinsics/StringPlus.kt | 4 +-- .../jet/codegen/intrinsics/UnaryMinus.kt | 6 ++-- .../optimizations/noOptimization.kt | 28 +++++++++++++++++++ ...lackBoxWithStdlibCodegenTestGenerated.java | 6 ++++ 11 files changed, 44 insertions(+), 39 deletions(-) create mode 100644 compiler/testData/codegen/boxWithStdlib/lazyCodegen/optimizations/noOptimization.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java index c233b5c9e79..ae84c1aaedb 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java @@ -38,6 +38,7 @@ import org.jetbrains.jet.lang.resolve.annotations.AnnotationsPackage; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; import org.jetbrains.jet.lang.resolve.java.*; import org.jetbrains.jet.lang.resolve.java.descriptor.JavaCallableMemberDescriptor; +import org.jetbrains.jet.lang.resolve.java.diagnostics.JvmDeclarationOrigin; import org.jetbrains.jet.lang.resolve.kotlin.PackagePartClassUtils; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.types.Approximation; @@ -60,7 +61,6 @@ import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.JAVA_STRING_T import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.getType; import static org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames.ABI_VERSION_FIELD_NAME; import static org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames.KotlinSyntheticClass; -import static org.jetbrains.jet.lang.resolve.java.diagnostics.JvmDeclarationOrigin.NO_ORIGIN; import static org.jetbrains.jet.lang.resolve.java.mapping.PrimitiveTypesUtil.asmTypeForPrimitive; import static org.jetbrains.jet.lang.types.TypeUtils.isNullableType; import static org.jetbrains.org.objectweb.asm.Opcodes.*; @@ -400,7 +400,7 @@ public class AsmUtil { //noinspection PointlessBitwiseExpression int access = NO_FLAG_PACKAGE_PRIVATE | ACC_SYNTHETIC | ACC_FINAL; for (Pair field : allFields) { - builder.newField(NO_ORIGIN, access, field.first, field.second.getDescriptor(), null, null); + builder.newField(JvmDeclarationOrigin.NO_ORIGIN, access, field.first, field.second.getDescriptor(), null, null); } } @@ -544,12 +544,6 @@ public class AsmUtil { v.add(expectedType); } - public static Type genNegate(Type expectedType, InstructionAdapter v) { - expectedType = numberFunctionOperandType(expectedType); - v.neg(expectedType); - return expectedType; - } - public static void swap(InstructionAdapter v, Type stackTop, Type afterTop) { if (stackTop.getSize() == 1) { if (afterTop.getSize() == 1) { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.kt b/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.kt index 6a0256a73eb..05dfdbb13b4 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.kt +++ b/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.kt @@ -69,10 +69,6 @@ public class StackValueWithLeaveTask( } } -fun operation(resultType: Type, lambda: (v: InstructionAdapter) -> Unit): StackValue { - return OperationStackValue(resultType, lambda) -} - open class OperationStackValue(val resultType: Type, val lambda: (v: InstructionAdapter) -> Unit) : StackValue(resultType) { override fun putSelector(type: Type, v: InstructionAdapter) { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArraySize.kt b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArraySize.kt index dc4527de696..85cb4a3a5b1 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArraySize.kt +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArraySize.kt @@ -18,11 +18,9 @@ package org.jetbrains.jet.codegen.intrinsics import com.intellij.psi.PsiElement import org.jetbrains.org.objectweb.asm.Type -import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter import org.jetbrains.jet.codegen.ExpressionCodegen import org.jetbrains.jet.codegen.StackValue import org.jetbrains.jet.lang.psi.JetExpression -import org.jetbrains.jet.codegen.operation public class ArraySize : LazyIntrinsicMethod() { override fun generateImpl( @@ -32,7 +30,7 @@ public class ArraySize : LazyIntrinsicMethod() { arguments: List, receiver: StackValue ): StackValue { - return operation(Type.INT_TYPE) { + return StackValue.operation(Type.INT_TYPE) { receiver.put(receiver.type, it) it.arraylength() } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/HashCode.kt b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/HashCode.kt index 30cf40837ec..c803ea30feb 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/HashCode.kt +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/HashCode.kt @@ -19,12 +19,10 @@ package org.jetbrains.jet.codegen.intrinsics import com.intellij.psi.PsiElement import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.Type -import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter import org.jetbrains.jet.codegen.ExpressionCodegen import org.jetbrains.jet.codegen.StackValue import org.jetbrains.jet.lang.psi.JetExpression import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants -import org.jetbrains.jet.codegen.operation public class HashCode : LazyIntrinsicMethod() { override fun generateImpl(codegen: ExpressionCodegen, @@ -33,7 +31,7 @@ public class HashCode : LazyIntrinsicMethod() { arguments: List, receiver: StackValue): StackValue { - return operation(Type.INT_TYPE) { + return StackValue.operation(Type.INT_TYPE) { receiver.put(AsmTypeConstants.OBJECT_TYPE, it) it.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Object", "hashCode", "()I", false) } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/Increment.kt b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/Increment.kt index 565cfbf4776..721ff74de09 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/Increment.kt +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/Increment.kt @@ -20,17 +20,10 @@ import com.intellij.psi.PsiElement import org.jetbrains.jet.codegen.ExpressionCodegen import org.jetbrains.jet.codegen.StackValue import org.jetbrains.jet.lang.psi.JetExpression -import org.jetbrains.jet.lang.psi.JetPsiUtil -import org.jetbrains.jet.lang.psi.JetReferenceExpression -import org.jetbrains.jet.lang.types.JetType -import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns import org.jetbrains.org.objectweb.asm.Type -import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter import org.jetbrains.jet.codegen.AsmUtil.genIncrement import org.jetbrains.jet.codegen.AsmUtil.isPrimitive -import org.jetbrains.jet.lang.resolve.BindingContext.EXPRESSION_TYPE -import org.jetbrains.jet.codegen.operation public class Increment(private val myDelta: Int) : LazyIntrinsicMethod() { @@ -48,7 +41,7 @@ public class Increment(private val myDelta: Int) : LazyIntrinsicMethod() { } } else { - return operation(returnType) { + return StackValue.operation(returnType) { receiver.put(returnType, it) genIncrement(returnType, myDelta, it) } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/StringGetChar.kt b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/StringGetChar.kt index 7e7e34e6f74..39373e1c5f6 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/StringGetChar.kt +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/StringGetChar.kt @@ -18,11 +18,9 @@ package org.jetbrains.jet.codegen.intrinsics import com.intellij.psi.PsiElement import org.jetbrains.org.objectweb.asm.Type -import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter import org.jetbrains.jet.codegen.ExpressionCodegen import org.jetbrains.jet.codegen.StackValue import org.jetbrains.jet.lang.psi.JetExpression -import org.jetbrains.jet.codegen.operation public class StringGetChar : LazyIntrinsicMethod() { override fun generateImpl(codegen: ExpressionCodegen, @@ -31,7 +29,7 @@ public class StringGetChar : LazyIntrinsicMethod() { arguments: List, receiver: StackValue): StackValue { - return operation(Type.CHAR_TYPE) { + return StackValue.operation(Type.CHAR_TYPE) { if (receiver != StackValue.none()) { receiver.put(receiver.type, it) } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/StringLength.kt b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/StringLength.kt index 771cde2bb21..4c389fd5783 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/StringLength.kt +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/StringLength.kt @@ -18,11 +18,9 @@ package org.jetbrains.jet.codegen.intrinsics import com.intellij.psi.PsiElement import org.jetbrains.org.objectweb.asm.Type -import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter import org.jetbrains.jet.codegen.ExpressionCodegen import org.jetbrains.jet.codegen.StackValue import org.jetbrains.jet.lang.psi.JetExpression -import org.jetbrains.jet.codegen.operation public class StringLength : LazyIntrinsicMethod() { override fun generateImpl( @@ -32,7 +30,7 @@ public class StringLength : LazyIntrinsicMethod() { arguments: List, receiver: StackValue ): StackValue { - return operation(Type.INT_TYPE) { + return StackValue.operation(Type.INT_TYPE) { receiver.put(receiver.type, it) it.invokeinterface("java/lang/CharSequence", "length", "()I") } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/StringPlus.kt b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/StringPlus.kt index 553795617f9..3c5b3b9b775 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/StringPlus.kt +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/StringPlus.kt @@ -21,11 +21,9 @@ import org.jetbrains.jet.codegen.ExpressionCodegen import org.jetbrains.jet.codegen.StackValue import org.jetbrains.jet.lang.psi.JetExpression import org.jetbrains.org.objectweb.asm.Type -import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.JAVA_STRING_TYPE import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.OBJECT_TYPE -import org.jetbrains.jet.codegen.operation public class StringPlus : LazyIntrinsicMethod() { override fun generateImpl( @@ -35,7 +33,7 @@ public class StringPlus : LazyIntrinsicMethod() { arguments: List, receiver: StackValue ): StackValue { - return operation(JAVA_STRING_TYPE) { + return StackValue.operation(JAVA_STRING_TYPE) { if (receiver == StackValue.none()) { codegen.gen(arguments.get(0)).put(JAVA_STRING_TYPE, it) codegen.gen(arguments.get(1)).put(OBJECT_TYPE, it) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/UnaryMinus.kt b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/UnaryMinus.kt index d3ec209c39e..de4b541c331 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/UnaryMinus.kt +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/UnaryMinus.kt @@ -18,13 +18,11 @@ package org.jetbrains.jet.codegen.intrinsics import com.intellij.psi.PsiElement import org.jetbrains.org.objectweb.asm.Type -import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter import org.jetbrains.jet.codegen.ExpressionCodegen import org.jetbrains.jet.codegen.StackValue import org.jetbrains.jet.lang.psi.JetExpression import org.jetbrains.jet.codegen.AsmUtil.* -import org.jetbrains.jet.codegen.operation public class UnaryMinus : LazyIntrinsicMethod() { @@ -39,9 +37,9 @@ public class UnaryMinus : LazyIntrinsicMethod() { val newreceiver = if (arguments.size() == 1) codegen.gen(arguments.get(0)) else receiver - return operation(operandType) { + return StackValue.operation(operandType) { newreceiver.put(operandType, it) - genNegate(operandType, it) + it.neg(operandType) } } } diff --git a/compiler/testData/codegen/boxWithStdlib/lazyCodegen/optimizations/noOptimization.kt b/compiler/testData/codegen/boxWithStdlib/lazyCodegen/optimizations/noOptimization.kt new file mode 100644 index 00000000000..d7e523c44bf --- /dev/null +++ b/compiler/testData/codegen/boxWithStdlib/lazyCodegen/optimizations/noOptimization.kt @@ -0,0 +1,28 @@ +class A +class B + +var holder = 0 + +fun A.not(): A { + holder++ + return this; +} + +fun B.not(): Boolean { + holder++ + return false; +} + +fun box(): String { + !!!!!A() + if (holder != 5) return "fail 1" + + holder = 0; + if (!!!B() || holder != 1) return "fail 2" + + if (!B() != false) return "fail 3" + + if (!!B() != true) return "fail 4" + + return "OK" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java index 21ca4eae3b0..c4cc4736f2b 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java @@ -1582,6 +1582,12 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/lazyCodegen/optimizations/negateTrueVar.kt"); doTestWithStdlib(fileName); } + + @TestMetadata("noOptimization.kt") + public void testNoOptimization() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/lazyCodegen/optimizations/noOptimization.kt"); + doTestWithStdlib(fileName); + } } }