All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy