forked from kscience/kmath
Optimize number constants placing to economize contant pool places
This commit is contained in:
parent
30b32c1515
commit
41094e63da
@ -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)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user