Small refactoring in constant processing
This commit is contained in:
@@ -32,8 +32,6 @@ open class BranchedValue(
|
||||
val opcode: Int
|
||||
) : StackValue(Type.BOOLEAN_TYPE) {
|
||||
|
||||
constructor(or: BranchedValue, opcode: Int) : this(or.arg1, or.arg2, or.operandType, opcode)
|
||||
|
||||
override fun putSelector(type: Type, v: InstructionAdapter) {
|
||||
val branchJumpLabel = Label()
|
||||
condJump(branchJumpLabel, v, true)
|
||||
@@ -63,7 +61,7 @@ open class BranchedValue(
|
||||
companion object {
|
||||
val negatedOperations = hashMapOf<Int, Int>()
|
||||
|
||||
val TRUE: BranchedValue = object : BranchedValue(StackValue.Constant(true, Type.BOOLEAN_TYPE), null, Type.BOOLEAN_TYPE, IFEQ) {
|
||||
val TRUE: BranchedValue = object : BranchedValue(StackValue.none()/*not used*/, null, Type.BOOLEAN_TYPE, IFEQ) {
|
||||
override fun condJump(jumpLabel: Label, v: InstructionAdapter, jumpIfFalse: Boolean) {
|
||||
if (!jumpIfFalse) {
|
||||
v.goTo(jumpLabel)
|
||||
@@ -85,7 +83,7 @@ open class BranchedValue(
|
||||
}
|
||||
}
|
||||
|
||||
val FALSE: BranchedValue = object : BranchedValue(StackValue.Constant(false, Type.BOOLEAN_TYPE), null, Type.BOOLEAN_TYPE, IFEQ) {
|
||||
val FALSE: BranchedValue = object : BranchedValue(StackValue.none()/*not used*/, null, Type.BOOLEAN_TYPE, IFEQ) {
|
||||
override fun condJump(jumpLabel: Label, v: InstructionAdapter, jumpIfFalse: Boolean) {
|
||||
if (jumpIfFalse) {
|
||||
v.goTo(jumpLabel)
|
||||
|
||||
@@ -770,12 +770,13 @@ public abstract class StackValue {
|
||||
}
|
||||
}
|
||||
|
||||
public static class Constant extends StackValue {
|
||||
private static class Constant extends StackValue {
|
||||
@Nullable
|
||||
private final Object value;
|
||||
|
||||
public Constant(@Nullable Object value, Type type) {
|
||||
super(type, false);
|
||||
assert !Type.BOOLEAN_TYPE.equals(type) : "Boolean constants should be created via 'StackValue.constant'";
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@@ -784,6 +785,9 @@ public abstract class StackValue {
|
||||
if (value instanceof Integer || value instanceof Byte || value instanceof Short) {
|
||||
v.iconst(((Number) value).intValue());
|
||||
}
|
||||
else if (value instanceof Character) {
|
||||
v.iconst(((Character) value).charValue());
|
||||
}
|
||||
else if (value instanceof Long) {
|
||||
v.lconst((Long) value);
|
||||
}
|
||||
@@ -1212,7 +1216,7 @@ public abstract class StackValue {
|
||||
value = ((Double) value).floatValue();
|
||||
}
|
||||
|
||||
new Constant(value, this.type).putSelector(type, v);
|
||||
StackValue.constant(value, this.type).putSelector(type, v);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
-29
@@ -57,35 +57,6 @@ public class OptimizationBasicInterpreter extends BasicInterpreter {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public BasicValue newOperation(@NotNull AbstractInsnNode insn) throws AnalyzerException {
|
||||
if (insn.getOpcode() == Opcodes.LDC) {
|
||||
Object cst = ((LdcInsnNode) insn).cst;
|
||||
|
||||
if (cst instanceof Long) {
|
||||
return BasicValue.LONG_VALUE;
|
||||
}
|
||||
|
||||
if (cst instanceof Boolean ||
|
||||
cst instanceof Integer ||
|
||||
cst instanceof Short ||
|
||||
cst instanceof Byte ||
|
||||
cst instanceof Character) {
|
||||
return BasicValue.INT_VALUE;
|
||||
}
|
||||
|
||||
if (cst instanceof Float) {
|
||||
return BasicValue.FLOAT_VALUE;
|
||||
}
|
||||
|
||||
if (cst instanceof Double) {
|
||||
return BasicValue.DOUBLE_VALUE;
|
||||
}
|
||||
}
|
||||
|
||||
return super.newOperation(insn);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public BasicValue merge(
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
fun test() {
|
||||
val z = 'A'
|
||||
}
|
||||
|
||||
//1 BIPUSH 65
|
||||
//0 LDC A
|
||||
@@ -65,10 +65,10 @@ fun test() {
|
||||
// 1 SIPUSH 9000
|
||||
// 1 LDC 59000
|
||||
// 1 BIPUSH -8
|
||||
// 1 LDC K
|
||||
// 1 BIPUSH 75
|
||||
// 1 LDC 100000
|
||||
// 1 SIPUSH 901
|
||||
// 1 LDC false
|
||||
// 1 ICONST_0
|
||||
// 1 LDC 36.6
|
||||
// 1 LDC 42.4242
|
||||
// 1 LDC ":J"
|
||||
|
||||
@@ -95,6 +95,12 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest {
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("charConstant.kt")
|
||||
public void testCharConstant() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/charConstant.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("componentEvaluatesOnlyOnce.kt")
|
||||
public void testComponentEvaluatesOnlyOnce() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/componentEvaluatesOnlyOnce.kt");
|
||||
|
||||
Reference in New Issue
Block a user