From e6c98078b3131b8f352c3369a0511b8e6e9e628b Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Mon, 6 Oct 2014 13:47:11 +0400 Subject: [PATCH] Fixes for KT-4733 UnsupportedOperationException: don't know how to move type J to top of stack; KT-3430 VerifyError on a safe call to a primitive value #KT-4733 Fixed #KT-3430 Fixed --- .../org/jetbrains/jet/codegen/StackValue.java | 3 ++- .../testData/codegen/box/safeCall/kt3430.kt | 6 +++++ .../testData/codegen/box/safeCall/kt4733.kt | 27 +++++++++++++++++++ .../BlackBoxCodegenTestGenerated.java | 12 +++++++++ 4 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/safeCall/kt3430.kt create mode 100644 compiler/testData/codegen/box/safeCall/kt4733.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java b/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java index 664217697f0..f21eeeaf4b8 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java @@ -413,10 +413,11 @@ public abstract class StackValue { put(type, v); } else if (depth == 1) { - if (type.getSize() != 1) { + if (this.type.getSize() != 1) { throw new UnsupportedOperationException("don't know how to move type " + type + " to top of stack"); } v.swap(); + coerceTo(type, v); } else { throw new UnsupportedOperationException("unsupported move-to-top depth " + depth); diff --git a/compiler/testData/codegen/box/safeCall/kt3430.kt b/compiler/testData/codegen/box/safeCall/kt3430.kt new file mode 100644 index 00000000000..19620029283 --- /dev/null +++ b/compiler/testData/codegen/box/safeCall/kt3430.kt @@ -0,0 +1,6 @@ +fun f(b : Int.(Int)->Int) = 1?.b(1) + +fun box(): String { + val x = f { this + it } + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/codegen/box/safeCall/kt4733.kt b/compiler/testData/codegen/box/safeCall/kt4733.kt new file mode 100644 index 00000000000..dde6d4af7cb --- /dev/null +++ b/compiler/testData/codegen/box/safeCall/kt4733.kt @@ -0,0 +1,27 @@ +class Test { + val Long.foo: Long + get() = this + 1 + + val Int.foo: Int + get() = this + 1 + + fun testLong(): Long? { + var s: Long? = 10; + return s?.foo + } + + fun testInt(): Int? { + var s: Int? = 11; + return s?.foo + } +} + +fun box(): String { + val s = Test() + + if (s.testLong() != 11.toLong()) return "fail 1" + + if (s.testInt() != 12) return "fail 1" + + return "OK" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java index 62bc8be46ac..9f10abe65cd 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -5790,6 +5790,18 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("kt3430.kt") + public void testKt3430() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/safeCall/kt3430.kt"); + doTest(fileName); + } + + @TestMetadata("kt4733.kt") + public void testKt4733() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/safeCall/kt4733.kt"); + doTest(fileName); + } + @TestMetadata("primitive.kt") public void testPrimitive() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/safeCall/primitive.kt");