KT-737 compareTo() intrinsic
This commit is contained in:
@@ -320,7 +320,8 @@ public class JetTypeMapper {
|
|||||||
ClassDescriptor containingClass = (ClassDescriptor) functionParent;
|
ClassDescriptor containingClass = (ClassDescriptor) functionParent;
|
||||||
boolean isInterface = CodegenUtil.isInterface(containingClass);
|
boolean isInterface = CodegenUtil.isInterface(containingClass);
|
||||||
OwnerKind kind1 = isInterface && superCall ? OwnerKind.TRAIT_IMPL : OwnerKind.IMPLEMENTATION;
|
OwnerKind kind1 = isInterface && superCall ? OwnerKind.TRAIT_IMPL : OwnerKind.IMPLEMENTATION;
|
||||||
owner = mapType(containingClass.getDefaultType(), kind1).getInternalName();
|
Type type = mapType(containingClass.getDefaultType(), kind1);
|
||||||
|
owner = type.getInternalName();
|
||||||
invokeOpcode = isInterface
|
invokeOpcode = isInterface
|
||||||
? (superCall ? Opcodes.INVOKESTATIC : Opcodes.INVOKEINTERFACE)
|
? (superCall ? Opcodes.INVOKESTATIC : Opcodes.INVOKEINTERFACE)
|
||||||
: (superCall ? Opcodes.INVOKESPECIAL : Opcodes.INVOKEVIRTUAL);
|
: (superCall ? Opcodes.INVOKESPECIAL : Opcodes.INVOKEVIRTUAL);
|
||||||
|
|||||||
@@ -0,0 +1,45 @@
|
|||||||
|
package org.jetbrains.jet.codegen.intrinsics;
|
||||||
|
|
||||||
|
import com.intellij.psi.PsiElement;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.jetbrains.jet.codegen.ExpressionCodegen;
|
||||||
|
import org.jetbrains.jet.codegen.JetTypeMapper;
|
||||||
|
import org.jetbrains.jet.codegen.StackValue;
|
||||||
|
import org.jetbrains.jet.lang.psi.JetExpression;
|
||||||
|
import org.objectweb.asm.Type;
|
||||||
|
import org.objectweb.asm.commons.InstructionAdapter;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author alex.tkachman
|
||||||
|
*/
|
||||||
|
public class CompareTo implements IntrinsicMethod {
|
||||||
|
@Override
|
||||||
|
public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, Type expectedType, @Nullable PsiElement element, @Nullable List<JetExpression> arguments, StackValue receiver) {
|
||||||
|
assert arguments != null;
|
||||||
|
receiver.put(receiver.type, v);
|
||||||
|
codegen.gen(arguments.get(0), receiver.type);
|
||||||
|
if(receiver.type == Type.BYTE_TYPE || receiver.type == Type.SHORT_TYPE || receiver.type == Type.CHAR_TYPE)
|
||||||
|
v.sub(Type.INT_TYPE);
|
||||||
|
else if(receiver.type == Type.INT_TYPE) {
|
||||||
|
v.invokestatic("jet/runtime/Intrinsics", "compare", "(II)I");
|
||||||
|
}
|
||||||
|
else if(receiver.type == Type.BOOLEAN_TYPE) {
|
||||||
|
v.invokestatic("jet/runtime/Intrinsics", "compare", "(ZZ)I");
|
||||||
|
}
|
||||||
|
else if(receiver.type == Type.LONG_TYPE) {
|
||||||
|
v.invokestatic("jet/runtime/Intrinsics", "compare", "(JJ)I");
|
||||||
|
}
|
||||||
|
else if(receiver.type == Type.FLOAT_TYPE) {
|
||||||
|
v.invokestatic("java/lang/Float", "compare", "(FF)I");
|
||||||
|
}
|
||||||
|
else if(receiver.type == Type.DOUBLE_TYPE) {
|
||||||
|
v.invokestatic("java/lang/Double", "compare", "(DD)I");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
return StackValue.onStack(Type.INT_TYPE);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -97,6 +97,9 @@ public class IntrinsicMethods {
|
|||||||
declareIntrinsicFunction("FloatIterator", "next", 0, ITERATOR_NEXT);
|
declareIntrinsicFunction("FloatIterator", "next", 0, ITERATOR_NEXT);
|
||||||
declareIntrinsicFunction("DoubleIterator", "next", 0, ITERATOR_NEXT);
|
declareIntrinsicFunction("DoubleIterator", "next", 0, ITERATOR_NEXT);
|
||||||
|
|
||||||
|
for (String type : PRIMITIVE_NUMBER_TYPES) {
|
||||||
|
declareIntrinsicFunction(type, "compareTo", 1, new CompareTo());
|
||||||
|
}
|
||||||
// declareIntrinsicFunction("Any", "equals", 1, new Equals());
|
// declareIntrinsicFunction("Any", "equals", 1, new Equals());
|
||||||
//
|
//
|
||||||
declareIntrinsicStringMethods();
|
declareIntrinsicStringMethods();
|
||||||
|
|||||||
@@ -315,6 +315,12 @@ public class PrimitiveTypesTest extends CodegenTestCase {
|
|||||||
assertTrue(generateToText().contains("IFNULL"));
|
assertTrue(generateToText().contains("IFNULL"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testKt737() throws Exception {
|
||||||
|
loadText("fun box() = if(3.compareTo(2) != 1) \"fail\" else if(5.byt.compareTo(10.lng) >= 0) \"fail\" else \"OK\"");
|
||||||
|
System.out.println(generateToText());
|
||||||
|
assertEquals("OK", blackBox());
|
||||||
|
}
|
||||||
|
|
||||||
public void testKt665() throws Exception {
|
public void testKt665() throws Exception {
|
||||||
loadText("fun f(x: Long, zzz: Long = 1): Long\n" +
|
loadText("fun f(x: Long, zzz: Long = 1): Long\n" +
|
||||||
"{\n" +
|
"{\n" +
|
||||||
|
|||||||
@@ -17,6 +17,18 @@ public class Intrinsics {
|
|||||||
throw new JetNullPointerException();
|
throw new JetNullPointerException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int compare(long thisVal, long anotherVal) {
|
||||||
|
return (thisVal<anotherVal ? -1 : (thisVal==anotherVal ? 0 : 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int compare(int thisVal, int anotherVal) {
|
||||||
|
return (thisVal<anotherVal ? -1 : (thisVal==anotherVal ? 0 : 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int compare(boolean thisVal, boolean anotherVal) {
|
||||||
|
return (thisVal == anotherVal ? 0 : (anotherVal ? 1 : -1));
|
||||||
|
}
|
||||||
|
|
||||||
private static Throwable sanitizeStackTrace(Throwable throwable) {
|
private static Throwable sanitizeStackTrace(Throwable throwable) {
|
||||||
StackTraceElement[] stackTrace = throwable.getStackTrace();
|
StackTraceElement[] stackTrace = throwable.getStackTrace();
|
||||||
ArrayList<StackTraceElement> list = new ArrayList<StackTraceElement>();
|
ArrayList<StackTraceElement> list = new ArrayList<StackTraceElement>();
|
||||||
|
|||||||
Reference in New Issue
Block a user