diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index bbe52384d2e..e2a3198802d 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1881,9 +1881,18 @@ public class ExpressionCodegen extends JetVisitor { StackValue leftValue = gen(expr); FunctionDescriptor op = (FunctionDescriptor) bindingContext.get(BindingContext.REFERENCE_TARGET, expression.getOperationReference()); assert op != null; - leftValue.put(asmType(op.getValueParameters().get(0).getType()), v); - genToJVMStack(expression.getRight()); - v.swap(); + Type type = asmType(op.getValueParameters().get(0).getType()); + if(type.getSize() == 1) { + leftValue.put(type, v); + genToJVMStack(expression.getRight()); + v.swap(); + } + else { + leftValue.put(type, v); + genToJVMStack(expression.getRight()); + v.dupX2(); + v.pop(); + } invokeFunctionNoParams(op, Type.BOOLEAN_TYPE, v); } return StackValue.onStack(Type.BOOLEAN_TYPE); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java index 3deff66d90c..6261c2c9828 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java @@ -71,6 +71,20 @@ public class JetTypeMapper { public static final Type ARRAY_GENERIC_TYPE = Type.getType(Object[].class); public static final Type TUPLE0_TYPE = Type.getObjectType("jet/Tuple0"); + public static final Type TYPE_ITERATOR = Type.getObjectType("jet/Iterator"); + public static final Type TYPE_INT_RANGE = Type.getObjectType("jet/IntRange"); + public static final Type TYPE_SHARED_VAR = Type.getObjectType("jet/runtime/SharedVar$Object"); + public static final Type TYPE_SHARED_INT = Type.getObjectType("jet/runtime/SharedVar$Int"); + public static final Type TYPE_SHARED_DOUBLE = Type.getObjectType("jet/runtime/SharedVar$Double"); + public static final Type TYPE_SHARED_FLOAT = Type.getObjectType("jet/runtime/SharedVar$Float"); + public static final Type TYPE_SHARED_BYTE = Type.getObjectType("jet/runtime/SharedVar$Byte"); + public static final Type TYPE_SHARED_SHORT = Type.getObjectType("jet/runtime/SharedVar$Short"); + public static final Type TYPE_SHARED_CHAR = Type.getObjectType("jet/runtime/SharedVar$Char"); + public static final Type TYPE_SHARED_LONG = Type.getObjectType("jet/runtime/SharedVar$Long"); + public static final Type TYPE_SHARED_BOOLEAN = Type.getObjectType("jet/runtime/SharedVar$Boolean"); + public static final Type TYPE_FUNCTION0 = Type.getObjectType("jet/Function0"); + public static final Type TYPE_FUNCTION1 = Type.getObjectType("jet/Function1"); + private JetStandardLibrary standardLibrary1; public BindingContext bindingContext; private ClosureAnnotator closureAnnotator; @@ -148,20 +162,6 @@ public class JetTypeMapper { private final HashMap knowTypes = Maps.newHashMap(); - public static final Type TYPE_ITERATOR = Type.getObjectType("jet/Iterator"); - public static final Type TYPE_INT_RANGE = Type.getObjectType("jet/IntRange"); - public static final Type TYPE_SHARED_VAR = Type.getObjectType("jet/runtime/SharedVar$Object"); - public static final Type TYPE_SHARED_INT = Type.getObjectType("jet/runtime/SharedVar$Int"); - public static final Type TYPE_SHARED_DOUBLE = Type.getObjectType("jet/runtime/SharedVar$Double"); - public static final Type TYPE_SHARED_FLOAT = Type.getObjectType("jet/runtime/SharedVar$Float"); - public static final Type TYPE_SHARED_BYTE = Type.getObjectType("jet/runtime/SharedVar$Byte"); - public static final Type TYPE_SHARED_SHORT = Type.getObjectType("jet/runtime/SharedVar$Short"); - public static final Type TYPE_SHARED_CHAR = Type.getObjectType("jet/runtime/SharedVar$Char"); - public static final Type TYPE_SHARED_LONG = Type.getObjectType("jet/runtime/SharedVar$Long"); - public static final Type TYPE_SHARED_BOOLEAN = Type.getObjectType("jet/runtime/SharedVar$Boolean"); - public static final Type TYPE_FUNCTION0 = Type.getObjectType("jet/Function0"); - public static final Type TYPE_FUNCTION1 = Type.getObjectType("jet/Function1"); - public static boolean isIntPrimitive(Type type) { return type == Type.INT_TYPE || type == Type.SHORT_TYPE || type == Type.BYTE_TYPE || type == Type.CHAR_TYPE; } diff --git a/compiler/testData/codegen/regressions/kt2416.kt b/compiler/testData/codegen/regressions/kt2416.kt new file mode 100644 index 00000000000..81c2fb4c6ac --- /dev/null +++ b/compiler/testData/codegen/regressions/kt2416.kt @@ -0,0 +1,13 @@ +fun main(args: Array) { + 9 in 0..9 + val intRange = 0..9 + 9 in intRange + val charRange = '0'..'9' + '9' in charRange + val byteRange = 0.toByte()..9.toByte() + 9.toByte() in byteRange + val longRange = 0.toLong()..9.toLong() + 9.toLong() in longRange + val shortRange = 0.toShort()..9.toShort() + 9.toShort() in shortRange +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java b/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java index 83c2aca2a40..a0a13a468b8 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java @@ -366,4 +366,9 @@ public class ControlStructuresTest extends CodegenTestCase { createEnvironmentWithFullJdk(); blackBoxFile("regressions/kt2423.kt"); } + + public void testKt2416() { + createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); + blackBoxFile("regressions/kt2416.kt"); + } } diff --git a/runtime/src/jet/ByteRange.java b/runtime/src/jet/ByteRange.java index 716cb17890a..881e62758f9 100644 --- a/runtime/src/jet/ByteRange.java +++ b/runtime/src/jet/ByteRange.java @@ -39,6 +39,13 @@ public final class ByteRange implements Range, ByteIterable { return item <= start && item > start + count; } + public boolean contains(byte item) { + if (count >= 0) { + return item >= start && item < start + count; + } + return item <= start && item > start + count; + } + @Override public boolean equals(Object o) { if (this == o) { diff --git a/runtime/src/jet/CharRange.java b/runtime/src/jet/CharRange.java index c6bc191e179..1f41d6fe26b 100644 --- a/runtime/src/jet/CharRange.java +++ b/runtime/src/jet/CharRange.java @@ -39,6 +39,13 @@ public final class CharRange implements Range, CharIterable { return item <= start && item > start + count; } + public boolean contains(char item) { + if (count >= 0) { + return item >= start && item < start + count; + } + return item <= start && item > start + count; + } + @Override public boolean equals(Object o) { if (this == o) { diff --git a/runtime/src/jet/IntRange.java b/runtime/src/jet/IntRange.java index 16ed6d57e2c..913bc287717 100644 --- a/runtime/src/jet/IntRange.java +++ b/runtime/src/jet/IntRange.java @@ -48,6 +48,13 @@ public final class IntRange implements Range, IntIterable { return item <= start && item > start + count; } + public boolean contains(int item) { + if (count >= 0) { + return item >= start && item < start + count; + } + return item <= start && item > start + count; + } + @Override public boolean equals(Object o) { if (this == o) { diff --git a/runtime/src/jet/LongRange.java b/runtime/src/jet/LongRange.java index 4b544faa7f3..f091be8de81 100644 --- a/runtime/src/jet/LongRange.java +++ b/runtime/src/jet/LongRange.java @@ -46,6 +46,13 @@ public final class LongRange implements Range, LongIterable { return item <= start && item > start + count; } + public boolean contains(long item) { + if (count >= 0) { + return item >= start && item < start + count; + } + return item <= start && item > start + count; + } + @Override public boolean equals(Object o) { if (this == o) { diff --git a/runtime/src/jet/ShortRange.java b/runtime/src/jet/ShortRange.java index ff5423d0b91..6cddf3bba53 100644 --- a/runtime/src/jet/ShortRange.java +++ b/runtime/src/jet/ShortRange.java @@ -46,6 +46,13 @@ public final class ShortRange implements Range, ShortIterable { return item <= start && item > start + count; } + public boolean contains(short item) { + if (count >= 0) { + return item >= start && item < start + count; + } + return item <= start && item > start + count; + } + @Override public boolean equals(Object o) { if (this == o) {