Optimize number constants placing to economize contant pool places

This commit is contained in:
Iaroslav 2020-06-06 21:48:52 +07:00
parent 30b32c1515
commit 41094e63da
No known key found for this signature in database
GPG Key ID: 46E15E4A31B3BCD7

View File

@ -3,8 +3,7 @@ package scientifik.kmath.expressions
import org.objectweb.asm.MethodVisitor
import org.objectweb.asm.Opcodes.*
fun MethodVisitor.visitLdcOrIConstInsn(value: Int) {
when (value) {
fun MethodVisitor.visitLdcOrIConstInsn(value: Int) = when (value) {
-1 -> visitInsn(ICONST_M1)
0 -> visitInsn(ICONST_0)
1 -> visitInsn(ICONST_1)
@ -13,7 +12,19 @@ fun MethodVisitor.visitLdcOrIConstInsn(value: Int) {
4 -> visitInsn(ICONST_4)
5 -> visitInsn(ICONST_5)
else -> visitLdcInsn(value)
}
}
fun MethodVisitor.visitLdcOrDConstInsn(value: Double) = when (value) {
0.0 -> visitInsn(DCONST_0)
1.0 -> visitInsn(DCONST_1)
else -> visitLdcInsn(value)
}
fun MethodVisitor.visitLdcOrFConstInsn(value: Float) = when (value) {
0f -> visitInsn(FCONST_0)
1f -> visitInsn(FCONST_1)
2f -> visitInsn(FCONST_2)
else -> visitLdcInsn(value)
}
private val signatureLetters = mapOf(
@ -29,6 +40,13 @@ private val signatureLetters = mapOf(
fun MethodVisitor.visitBoxedNumberConstant(number: Number) {
val clazz = number.javaClass
val c = clazz.name.replace('.', '/')
visitLdcInsn(number)
when (number) {
is Int -> visitLdcOrIConstInsn(number)
is Double -> visitLdcOrDConstInsn(number)
is Float -> visitLdcOrFConstInsn(number)
else -> visitLdcInsn(number)
}
visitMethodInsn(INVOKESTATIC, c, "valueOf", "(${signatureLetters[clazz]})L${c};", false)
}