diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index cc7c71f7948..e93ca54df92 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1621,13 +1621,13 @@ public class ExpressionCodegen extends JetVisitor implem descriptor = descriptor.getOriginal(); if (descriptor instanceof CallableMemberDescriptor) { - CallableMemberDescriptor memberDescriptor = (CallableMemberDescriptor) descriptor; - memberDescriptor = unwrapFakeOverride(memberDescriptor); + CallableMemberDescriptor memberDescriptor = unwrapFakeOverride((CallableMemberDescriptor) descriptor); IntrinsicMethod intrinsic = state.getIntrinsics().getIntrinsic(memberDescriptor); if (intrinsic != null) { Type returnType = typeMapper.mapType(memberDescriptor); - return intrinsic.generate(this, v, returnType, expression, Collections.emptyList(), receiver, state); + intrinsic.generate(this, v, returnType, expression, Collections.emptyList(), receiver, state); + return StackValue.onStack(returnType); } } @@ -2010,8 +2010,7 @@ public class ExpressionCodegen extends JetVisitor implem Type returnType = typeMapper.mapType(resolvedCall.getResultingDescriptor()); - StackValue stackValue = intrinsic.generate(this, v, returnType, call.getCallElement(), args, receiver, state); - stackValue.put(returnType, v); + intrinsic.generate(this, v, returnType, call.getCallElement(), args, receiver, state); return StackValue.onStack(returnType); } } @@ -2650,8 +2649,9 @@ public class ExpressionCodegen extends JetVisitor implem if (callable instanceof IntrinsicMethod) { //noinspection ConstantConditions Type returnType = typeMapper.mapType(resolvedCall.getResultingDescriptor()); - return ((IntrinsicMethod) callable).generate(this, v, returnType, expression, - Arrays.asList(expression.getLeft(), expression.getRight()), receiver, state); + ((IntrinsicMethod) callable).generate(this, v, returnType, expression, + Arrays.asList(expression.getLeft(), expression.getRight()), receiver, state); + return StackValue.onStack(returnType); } else { return invokeFunction(call, receiver, resolvedCall); @@ -2983,35 +2983,34 @@ public class ExpressionCodegen extends JetVisitor implem Callable callable = resolveToCallable((FunctionDescriptor) op, false); if (callable instanceof IntrinsicMethod) { Type returnType = typeMapper.mapType((FunctionDescriptor) op); - return ((IntrinsicMethod) callable).generate(this, v, returnType, expression, - Collections.singletonList(expression.getBaseExpression()), receiver, state); + ((IntrinsicMethod) callable).generate(this, v, returnType, expression, + Collections.singletonList(expression.getBaseExpression()), receiver, state); + return StackValue.onStack(returnType); } - else { - DeclarationDescriptor cls = op.getContainingDeclaration(); - ResolvedCall resolvedCall = - bindingContext.get(BindingContext.RESOLVED_CALL, expression.getOperationReference()); - assert resolvedCall != null; - if (isPrimitiveNumberClassDescriptor(cls) || !(op.getName().asString().equals("inc") || op.getName().asString().equals("dec"))) { - Call call = bindingContext.get(BindingContext.CALL, expression.getOperationReference()); - return invokeFunction(call, receiver, resolvedCall); - } - else { - CallableMethod callableMethod = (CallableMethod) callable; + DeclarationDescriptor cls = op.getContainingDeclaration(); + ResolvedCall resolvedCall = + bindingContext.get(BindingContext.RESOLVED_CALL, expression.getOperationReference()); + assert resolvedCall != null; - StackValue value = gen(expression.getBaseExpression()); - value.dupReceiver(v); - value.dupReceiver(v); - - Type type = expressionType(expression.getBaseExpression()); - value.put(type, v); - callableMethod.invokeWithNotNullAssertion(v, state, resolvedCall); - - value.store(callableMethod.getReturnType(), v); - value.put(type, v); - return StackValue.onStack(type); - } + if (isPrimitiveNumberClassDescriptor(cls) || !(op.getName().asString().equals("inc") || op.getName().asString().equals("dec"))) { + Call call = bindingContext.get(BindingContext.CALL, expression.getOperationReference()); + return invokeFunction(call, receiver, resolvedCall); } + + CallableMethod callableMethod = (CallableMethod) callable; + + StackValue value = gen(expression.getBaseExpression()); + value.dupReceiver(v); + value.dupReceiver(v); + + Type type = expressionType(expression.getBaseExpression()); + value.put(type, v); + callableMethod.invokeWithNotNullAssertion(v, state, resolvedCall); + + value.store(callableMethod.getReturnType(), v); + value.put(type, v); + return StackValue.onStack(type); } @Override diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java b/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java index 3564a26d024..a25741d33c0 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java @@ -632,7 +632,7 @@ public abstract class StackValue { ((CallableMethod) getter).invokeWithNotNullAssertion(v, state, resolvedGetCall); } else { - ((IntrinsicMethod) getter).generate(codegen, v, type, null, null, null, state); + ((IntrinsicMethod) getter).generate(codegen, v, this.type, null, null, null, state); } coerceTo(type, v); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayGet.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayGet.java index 5d5fec2620b..d3aab0ce26b 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayGet.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayGet.java @@ -48,6 +48,8 @@ public class ArrayGet implements IntrinsicMethod { v.aload(type); - return StackValue.onStack(type); + StackValue.coerce(type, returnType, v); + + return StackValue.onStack(returnType); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayIndices.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayIndices.java index d7dd4134511..496aaa9da4b 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayIndices.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayIndices.java @@ -20,7 +20,6 @@ import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.asm4.Type; import org.jetbrains.asm4.commons.InstructionAdapter; -import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants; import org.jetbrains.jet.codegen.ExpressionCodegen; import org.jetbrains.jet.codegen.StackValue; import org.jetbrains.jet.codegen.state.GenerationState; @@ -28,6 +27,8 @@ import org.jetbrains.jet.lang.psi.JetExpression; import java.util.List; +import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.JET_INT_RANGE_TYPE; + public class ArrayIndices implements IntrinsicMethod { @Override public StackValue generate( @@ -42,6 +43,7 @@ public class ArrayIndices implements IntrinsicMethod { receiver.put(receiver.type, v); v.arraylength(); v.invokestatic("jet/runtime/Ranges", "arrayIndices", "(I)Ljet/IntRange;"); - return StackValue.onStack(AsmTypeConstants.JET_INT_RANGE_TYPE); + StackValue.coerce(JET_INT_RANGE_TYPE, returnType, v); + return StackValue.onStack(returnType); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayIterator.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayIterator.java index 4ec5cd1e39d..77ba8b48aa9 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayIterator.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayIterator.java @@ -29,7 +29,6 @@ import org.jetbrains.jet.lang.psi.JetCallExpression; import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.psi.JetSimpleNameExpression; import org.jetbrains.jet.lang.resolve.BindingContext; -import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants; import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; @@ -38,6 +37,7 @@ import org.jetbrains.jet.lang.types.lang.PrimitiveType; import java.util.List; import static org.jetbrains.jet.codegen.AsmUtil.asmDescByFqNameWithoutInnerClasses; +import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.JET_ITERATOR_TYPE; import static org.jetbrains.jet.lang.resolve.java.mapping.PrimitiveTypesUtil.asmTypeForPrimitive; public class ArrayIterator implements IntrinsicMethod { @@ -59,7 +59,8 @@ public class ArrayIterator implements IntrinsicMethod { ClassDescriptor containingDeclaration = (ClassDescriptor) funDescriptor.getContainingDeclaration().getOriginal(); if (containingDeclaration.equals(KotlinBuiltIns.getInstance().getArray())) { v.invokestatic("jet/runtime/ArrayIterator", "iterator", "([Ljava/lang/Object;)Ljava/util/Iterator;"); - return StackValue.onStack(AsmTypeConstants.JET_ITERATOR_TYPE); + StackValue.coerce(JET_ITERATOR_TYPE, returnType, v); + return StackValue.onStack(returnType); } for (JvmPrimitiveType jvmPrimitiveType : JvmPrimitiveType.values()) { @@ -69,7 +70,8 @@ public class ArrayIterator implements IntrinsicMethod { String iteratorDesc = asmDescByFqNameWithoutInnerClasses(new FqName("jet." + primitiveType.getTypeName() + "Iterator")); String methodSignature = "([" + asmTypeForPrimitive(jvmPrimitiveType) + ")" + iteratorDesc; v.invokestatic("jet/runtime/ArrayIterator", "iterator", methodSignature); - return StackValue.onStack(Type.getType(iteratorDesc)); + StackValue.coerce(Type.getType(iteratorDesc), returnType, v); + return StackValue.onStack(returnType); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArraySet.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArraySet.java index e771c6357e1..736589d307e 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArraySet.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArraySet.java @@ -24,7 +24,6 @@ import org.jetbrains.jet.codegen.ExpressionCodegen; import org.jetbrains.jet.codegen.StackValue; import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.lang.psi.JetExpression; -import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants; import java.util.List; @@ -49,6 +48,8 @@ public class ArraySet implements IntrinsicMethod { v.astore(type); - return StackValue.none(); + StackValue.coerce(Type.VOID_TYPE, returnType, v); + + return StackValue.onStack(returnType); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArraySize.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArraySize.java index b9582258d1e..0d3b4edec09 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArraySize.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArraySize.java @@ -42,6 +42,7 @@ public class ArraySize implements IntrinsicMethod { receiver.put(receiver.type, v); v.arraylength(); - return StackValue.onStack(Type.INT_TYPE); + StackValue.coerce(Type.INT_TYPE, returnType, v); + return StackValue.onStack(returnType); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/CompareTo.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/CompareTo.java index 4d7188a848c..50317dd82d1 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/CompareTo.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/CompareTo.java @@ -76,6 +76,8 @@ public class CompareTo implements IntrinsicMethod { else { throw new UnsupportedOperationException(); } - return StackValue.onStack(Type.INT_TYPE); + + StackValue.coerce(Type.INT_TYPE, returnType, v); + return StackValue.onStack(returnType); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/Equals.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/Equals.java index 90748cb6d30..7d8c7e14281 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/Equals.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/Equals.java @@ -57,6 +57,8 @@ public class Equals implements IntrinsicMethod { leftExpr.put(AsmTypeConstants.OBJECT_TYPE, v); codegen.gen(rightExpr).put(AsmTypeConstants.OBJECT_TYPE, v); - return genEqualsForExpressionsOnStack(v, JetTokens.EQEQ, AsmTypeConstants.OBJECT_TYPE, AsmTypeConstants.OBJECT_TYPE); + StackValue value = genEqualsForExpressionsOnStack(v, JetTokens.EQEQ, AsmTypeConstants.OBJECT_TYPE, AsmTypeConstants.OBJECT_TYPE); + value.put(returnType, v); + return StackValue.onStack(returnType); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/HashCode.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/HashCode.java index 48488af9785..6181edaec1d 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/HashCode.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/HashCode.java @@ -22,11 +22,11 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.asm4.Opcodes; import org.jetbrains.asm4.Type; import org.jetbrains.asm4.commons.InstructionAdapter; -import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants; import org.jetbrains.jet.codegen.ExpressionCodegen; import org.jetbrains.jet.codegen.StackValue; import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.lang.psi.JetExpression; +import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants; import java.util.List; @@ -43,6 +43,7 @@ public class HashCode implements IntrinsicMethod { ) { receiver.put(AsmTypeConstants.OBJECT_TYPE, v); v.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Object", "hashCode", "()I"); - return StackValue.onStack(Type.INT_TYPE); + StackValue.coerce(Type.INT_TYPE, returnType, v); + return StackValue.onStack(returnType); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IdentityEquals.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IdentityEquals.java index be342c3036a..bfadcbf45c9 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IdentityEquals.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IdentityEquals.java @@ -53,6 +53,7 @@ public class IdentityEquals implements IntrinsicMethod { codegen.gen(e.getLeft()).put(OBJECT_TYPE, v); codegen.gen(e.getRight()).put(OBJECT_TYPE, v); } - return StackValue.cmp(JetTokens.EQEQEQ, OBJECT_TYPE); + StackValue.cmp(JetTokens.EQEQEQ, OBJECT_TYPE).put(returnType, v); + return StackValue.onStack(returnType); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/Increment.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/Increment.java index d4e984aaec6..2e5f873a0ab 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/Increment.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/Increment.java @@ -60,7 +60,8 @@ public class Increment implements IntrinsicMethod { if (operand instanceof JetReferenceExpression && returnType == Type.INT_TYPE) { int index = codegen.indexOfLocal((JetReferenceExpression) operand); if (index >= 0) { - return StackValue.preIncrement(index, myDelta); + StackValue.preIncrement(index, myDelta).put(returnType, v); + return StackValue.onStack(returnType); } } StackValue value = codegen.genQualified(receiver, operand); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IteratorIterator.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IteratorIterator.java index 57019b46205..aebe3fa3deb 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IteratorIterator.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IteratorIterator.java @@ -39,6 +39,7 @@ public class IteratorIterator implements IntrinsicMethod { StackValue receiver, @NotNull GenerationState state ) { - return receiver; + receiver.put(returnType, v); + return StackValue.onStack(returnType); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassFunction.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassFunction.java index 2cbfe10eaef..2657d84e6b9 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassFunction.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassFunction.java @@ -29,13 +29,13 @@ import org.jetbrains.jet.lang.psi.JetCallExpression; import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; -import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants; import org.jetbrains.jet.lang.types.JetType; import java.util.List; import static org.jetbrains.jet.codegen.AsmUtil.boxType; import static org.jetbrains.jet.codegen.AsmUtil.isPrimitive; +import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.getType; public class JavaClassFunction implements IntrinsicMethod { @Override @@ -57,6 +57,8 @@ public class JavaClassFunction implements IntrinsicMethod { else { v.aconst(type); } - return StackValue.onStack(AsmTypeConstants.getType(Class.class)); + + StackValue.coerce(getType(Class.class), expectedType, v); + return StackValue.onStack(expectedType); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassProperty.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassProperty.java index a62772bb979..4b353446b92 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassProperty.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassProperty.java @@ -25,12 +25,12 @@ import org.jetbrains.jet.codegen.ExpressionCodegen; import org.jetbrains.jet.codegen.StackValue; import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.lang.psi.JetExpression; -import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants; import java.util.List; import static org.jetbrains.jet.codegen.AsmUtil.boxType; import static org.jetbrains.jet.codegen.AsmUtil.isPrimitive; +import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.getType; public class JavaClassProperty implements IntrinsicMethod { @Override @@ -51,6 +51,8 @@ public class JavaClassProperty implements IntrinsicMethod { receiver.put(type, v); v.invokevirtual("java/lang/Object", "getClass", "()Ljava/lang/Class;"); } - return StackValue.onStack(AsmTypeConstants.getType(Class.class)); + + StackValue.coerce(getType(Class.class), returnType, v); + return StackValue.onStack(returnType); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/Not.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/Not.java index 2bc44aee264..f20091e06ee 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/Not.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/Not.java @@ -46,6 +46,7 @@ public class Not implements IntrinsicMethod { stackValue = receiver; } stackValue.put(Type.BOOLEAN_TYPE, v); - return StackValue.not(StackValue.onStack(Type.BOOLEAN_TYPE)); + StackValue.not(StackValue.onStack(Type.BOOLEAN_TYPE)).put(returnType, v); + return StackValue.onStack(returnType); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/RangeTo.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/RangeTo.java index 1e72407aed4..211077016d7 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/RangeTo.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/RangeTo.java @@ -29,10 +29,6 @@ import org.jetbrains.jet.lang.psi.JetExpression; import java.util.List; public class RangeTo implements IntrinsicMethod { - - public RangeTo() { - } - @Override public StackValue generate( ExpressionCodegen codegen, @@ -50,22 +46,17 @@ public class RangeTo implements IntrinsicMethod { codegen.gen(arguments.get(0), rightType); v.invokestatic("jet/runtime/Ranges", "rangeTo", "(" + receiver.type.getDescriptor() + leftType.getDescriptor() + ")" + returnType.getDescriptor()); - return StackValue.onStack(returnType); } else { JetBinaryExpression expression = (JetBinaryExpression) element; Type leftType = codegen.expressionType(expression.getLeft()); Type rightType = codegen.expressionType(expression.getRight()); - // if (JetTypeMapper.isIntPrimitive(leftType)) { codegen.gen(expression.getLeft(), leftType); codegen.gen(expression.getRight(), rightType); v.invokestatic("jet/runtime/Ranges", "rangeTo", "(" + leftType.getDescriptor() + rightType.getDescriptor() + ")" + returnType.getDescriptor()); - return StackValue.onStack(returnType); - // } - // else { - // throw new UnsupportedOperationException("ranges are only supported for int objects"); - // } } + + return StackValue.onStack(returnType); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/StringGetChar.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/StringGetChar.java index d1b674d3156..6875064ce3a 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/StringGetChar.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/StringGetChar.java @@ -46,6 +46,7 @@ public class StringGetChar implements IntrinsicMethod { codegen.gen(arguments.get(0)).put(Type.INT_TYPE, v); } v.invokeinterface("java/lang/CharSequence", "charAt", "(I)C"); - return StackValue.onStack(Type.CHAR_TYPE); + StackValue.coerce(Type.CHAR_TYPE, returnType, v); + return StackValue.onStack(returnType); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/StringLength.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/StringLength.java index a552636e661..a680b6ee672 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/StringLength.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/StringLength.java @@ -41,6 +41,7 @@ public class StringLength implements IntrinsicMethod { ) { receiver.put(receiver.type, v); v.invokeinterface("java/lang/CharSequence", "length", "()I"); - return StackValue.onStack(Type.INT_TYPE); + StackValue.coerce(Type.INT_TYPE, returnType, v); + return StackValue.onStack(returnType); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/StringPlus.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/StringPlus.java index bd6d35fbd04..05f9add0bb9 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/StringPlus.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/StringPlus.java @@ -20,7 +20,6 @@ import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.asm4.Type; import org.jetbrains.asm4.commons.InstructionAdapter; -import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants; import org.jetbrains.jet.codegen.ExpressionCodegen; import org.jetbrains.jet.codegen.StackValue; import org.jetbrains.jet.codegen.state.GenerationState; @@ -28,6 +27,9 @@ import org.jetbrains.jet.lang.psi.JetExpression; import java.util.List; +import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.JAVA_STRING_TYPE; +import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.OBJECT_TYPE; + public class StringPlus implements IntrinsicMethod { @Override public StackValue generate( @@ -40,14 +42,16 @@ public class StringPlus implements IntrinsicMethod { @NotNull GenerationState state ) { if (receiver == null || receiver == StackValue.none()) { - codegen.gen(arguments.get(0)).put(AsmTypeConstants.JAVA_STRING_TYPE, v); - codegen.gen(arguments.get(1)).put(AsmTypeConstants.OBJECT_TYPE, v); + codegen.gen(arguments.get(0)).put(JAVA_STRING_TYPE, v); + codegen.gen(arguments.get(1)).put(OBJECT_TYPE, v); } else { - receiver.put(AsmTypeConstants.JAVA_STRING_TYPE, v); - codegen.gen(arguments.get(0)).put(AsmTypeConstants.OBJECT_TYPE, v); + receiver.put(JAVA_STRING_TYPE, v); + codegen.gen(arguments.get(0)).put(OBJECT_TYPE, v); } v.invokestatic("jet/runtime/Intrinsics", "stringPlus", "(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String;"); - return StackValue.onStack(AsmTypeConstants.JAVA_STRING_TYPE); + + StackValue.coerce(JAVA_STRING_TYPE, returnType, v); + return StackValue.onStack(returnType); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ToString.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ToString.java index 0d4da041a5b..94654bbbef1 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ToString.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ToString.java @@ -40,6 +40,7 @@ public class ToString implements IntrinsicMethod { StackValue receiver, @NotNull GenerationState state ) { - return genToString(v, receiver, receiver.type); + genToString(v, receiver, receiver.type).put(returnType, v); + return StackValue.onStack(returnType); } }