com.codename1.tools.translator.bytecodes.ArrayLoadExpression Maven / Gradle / Ivy
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.codename1.tools.translator.bytecodes;
import java.util.List;
import org.objectweb.asm.Opcodes;
/**
*
* @author shannah
*/
public class ArrayLoadExpression extends Instruction implements AssignableExpression {
private Instruction targetArrayInstruction;
private Instruction indexInstruction;
private Instruction loadInstruction;
private ArrayLoadExpression() {
super(-4);
}
public static int tryReduce(List instructions, int index) {
Instruction instr = instructions.get(index);
switch (instr.getOpcode()) {
case Opcodes.AALOAD:
case Opcodes.FALOAD:
case Opcodes.CALOAD:
case Opcodes.DALOAD:
case Opcodes.BALOAD:
case Opcodes.IALOAD:
case Opcodes.LALOAD:
case Opcodes.SALOAD:
break;
default:
return -1;
}
if (index < 2) {
return -1;
}
Instruction indexInstr = instructions.get(index-1);
if (!(indexInstr instanceof AssignableExpression)) {
return -1;
}
Instruction arrInstr = instructions.get(index-2);
if (!(arrInstr instanceof AssignableExpression)) {
return -1;
}
ArrayLoadExpression out = new ArrayLoadExpression();
out.loadInstruction = instr;
out.indexInstruction = indexInstr;
out.targetArrayInstruction = arrInstr;
instructions.remove(index-2);
instructions.remove(index-2);
instructions.remove(index-2);
instructions.add(index-2, out);
return index-2;
}
@Override
public void addDependencies(List dependencyList) {
if (indexInstruction != null) {
indexInstruction.addDependencies(dependencyList);
}
if (targetArrayInstruction != null) {
targetArrayInstruction.addDependencies(dependencyList);
}
if (loadInstruction != null) {
loadInstruction.addDependencies(dependencyList);
}
}
@Override
public void appendInstruction(StringBuilder b) {
if (targetArrayInstruction != null) {
targetArrayInstruction.appendInstruction(b);
}
if (indexInstruction != null) {
indexInstruction.appendInstruction(b);
}
if (loadInstruction != null) {
loadInstruction.appendInstruction(b);
}
}
@Override
public void appendInstruction(StringBuilder b, List l) {
if (targetArrayInstruction != null) {
targetArrayInstruction.appendInstruction(b, l);
}
if (indexInstruction != null) {
indexInstruction.appendInstruction(b, l);
}
if (loadInstruction != null) {
loadInstruction.appendInstruction(b, l);
}
}
@Override
public boolean assignTo(String varName, StringBuilder sb) {
StringBuilder b = new StringBuilder();
if (varName != null) {
b.append(varName).append("=");
}
b.append("CN1_ARRAY_ELEMENT_");
String arrayType = null;
switch (loadInstruction.getOpcode()) {
case Opcodes.FALOAD:
arrayType = "FLOAT";
break;
case Opcodes.DALOAD:
arrayType = "DOUBLE";
break;
case Opcodes.LALOAD:
arrayType = "LONG";
break;
case Opcodes.IALOAD:
arrayType = "INT";
break;
case Opcodes.BALOAD:
arrayType = "BYTE";
break;
case Opcodes.CALOAD:
arrayType = "CHAR";
break;
case Opcodes.AALOAD:
arrayType = "OBJECT";
break;
case Opcodes.SALOAD:
arrayType = "SHORT";
break;
}
b.append(arrayType).append("(");
if (targetArrayInstruction instanceof AssignableExpression) {
StringBuilder sb2 = new StringBuilder();
boolean res = ((AssignableExpression)targetArrayInstruction).assignTo(null, sb2);
if (!res) {
return false;
}
b.append(sb2.toString().trim());
} else {
return false;
}
b.append(", ");
if (indexInstruction instanceof AssignableExpression) {
StringBuilder sb2 = new StringBuilder();
boolean res = ((AssignableExpression)indexInstruction).assignTo(null, sb2);
if (!res) {
return false;
}
b.append(sb2.toString().trim());
} else {
return false;
}
b.append(")");
if (varName != null) {
b.append(";\n");
}
sb.append(b);
return true;
}
}