com.codename1.tools.translator.bytecodes.ArrayLoadExpression.java Source code

Java tutorial

Introduction

Here is the source code for com.codename1.tools.translator.bytecodes.ArrayLoadExpression.java

Source

/*
 * 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<Instruction> 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<String> 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<Instruction> 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;
    }
}