Add intrinsic for ULong/UInt.toString on Java 8+

Unfortunately this cannot currently be done for the extension overload which accepts a radix due to behavior difference with regard to invalid radix values.
This commit is contained in:
Jake Wharton
2019-07-03 21:54:54 -04:00
committed by max-kammerer
parent b7917978b8
commit 4386518c4d
13 changed files with 158 additions and 1 deletions
@@ -175,6 +175,8 @@ public class IntrinsicMethods {
intrinsicsMap.registerIntrinsic(KOTLIN_UINT.toSafe(), null, "compareTo", 1, java8UIntCompare);
intrinsicsMap.registerIntrinsic(BUILT_INS_PACKAGE_FQ_NAME, null, "uintCompare", 2, java8UIntCompare);
intrinsicsMap.registerIntrinsic(KOTLIN_UINT.toSafe(), null, "toString", 0, new Java8UIntToString());
Java8ULongDivide java8ULongDivide = new Java8ULongDivide();
intrinsicsMap.registerIntrinsic(KOTLIN_ULONG.toSafe(), null, "div", 1, java8ULongDivide);
intrinsicsMap.registerIntrinsic(BUILT_INS_PACKAGE_FQ_NAME, null, "ulongDivide", 2, java8ULongDivide);
@@ -186,6 +188,8 @@ public class IntrinsicMethods {
Java8ULongCompare java8ULongCompare = new Java8ULongCompare();
intrinsicsMap.registerIntrinsic(KOTLIN_ULONG.toSafe(), null, "compareTo", 1, java8ULongCompare);
intrinsicsMap.registerIntrinsic(BUILT_INS_PACKAGE_FQ_NAME, null, "ulongCompare", 2, java8ULongCompare);
intrinsicsMap.registerIntrinsic(KOTLIN_ULONG.toSafe(), null, "toString", 0, new Java8ULongToString());
}
}
@@ -13,7 +13,8 @@ import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
abstract class UnsignedIntrinsic(private val targetDescriptor: String) : IntrinsicMethod() {
override fun isApplicableToOverload(descriptor: CallableMemberDescriptor): Boolean {
if (descriptor.containingDeclaration is PackageFragmentDescriptor) return true
val singleValueParameterTypeDescriptor = descriptor.valueParameters.single().type.constructor.declarationDescriptor
val valueParameter = descriptor.valueParameters.singleOrNull() ?: return true
val singleValueParameterTypeDescriptor = valueParameter.type.constructor.declarationDescriptor
?: throw AssertionError("Unexpected descriptor for unsigned intrinsic: $descriptor")
return singleValueParameterTypeDescriptor.name.asString() == targetDescriptor
}
@@ -40,6 +41,13 @@ class Java8UIntCompare : UnsignedIntrinsic("UInt") {
}
}
class Java8UIntToString : UnsignedIntrinsic("UInt") {
override fun toCallable(method: CallableMethod): Callable =
createIntrinsicCallable(method) {
it.invokestatic("java/lang/Integer", "toUnsignedString", "(I)Ljava/lang/String;", false)
}
}
class Java8ULongDivide : UnsignedIntrinsic("ULong") {
override fun toCallable(method: CallableMethod): Callable =
createIntrinsicCallable(method) {
@@ -60,3 +68,10 @@ class Java8ULongCompare : UnsignedIntrinsic("ULong") {
it.invokestatic("java/lang/Long", "compareUnsigned", "(JJ)I", false)
}
}
class Java8ULongToString : UnsignedIntrinsic("ULong") {
override fun toCallable(method: CallableMethod): Callable =
createIntrinsicCallable(method) {
it.invokestatic("java/lang/Long", "toUnsignedString", "(J)Ljava/lang/String;", false)
}
}