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

com.codename1.tools.translator.bytecodes.ArrayLengthExpression 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 ArrayLengthExpression extends Instruction implements AssignableExpression {

    private Instruction target;
    private Instruction arrayLenInstruction;
    
    private ArrayLengthExpression() {
        super(-3);
    }
    
    public static int tryReduce(List instructions, int index) {
        if (index < 1) {
            return -1;
        }
        Instruction instr = instructions.get(index);
        Instruction prev = instructions.get(index-1);
        if (instr.getOpcode() == Opcodes.ARRAYLENGTH && prev instanceof AssignableExpression) {
            ArrayLengthExpression out = new ArrayLengthExpression();
            out.target = prev;
            out.arrayLenInstruction = instr;
            
            instructions.remove(index-1);
            instructions.remove(index-1);
            instructions.add(index-1, out);
            
            return index-1;
            
        }
        return -1;
    }
    
    
    @Override
    public void addDependencies(List dependencyList) {
        if (target != null) {
            target.addDependencies(dependencyList);
        }
        if (arrayLenInstruction != null) {
            arrayLenInstruction.addDependencies(dependencyList);
        }
        
    }

    
    
    @Override
    public void appendInstruction(StringBuilder b) {
        if (target != null) {
            target.appendInstruction(b);
        }
        if (arrayLenInstruction != null) {
            arrayLenInstruction.appendInstruction(b);
        }
    }

    @Override
    public void appendInstruction(StringBuilder b, List l) {
        if (target != null) {
            target.appendInstruction(b, l);
        }
        if (arrayLenInstruction != null) {
            arrayLenInstruction.appendInstruction(b, l);
        }
    }

    @Override
    public boolean assignTo(String varName, StringBuilder sb) {
        
        StringBuilder b = new StringBuilder();
        if (varName != null) {
            b.append(varName).append(" = ");
        }
        
        //switch (target.getOpcode()) {
        //    case Opcodes.ALOAD: {
                if (target instanceof AssignableExpression) {
                    StringBuilder b2 = new StringBuilder();
                    boolean res = ((AssignableExpression)target).assignTo(null, b2);
                    if (!res) {
                        return false;
                    }
                    //SP[-1].data.o == JAVA_NULL ? throwException_R_int(threadStateData, __NEW_INSTANCE_java_lang_NullPointerException(threadStateData)) : (*((JAVA_ARRAY)SP[-1].data.o)).length;
                    //b.append("((").append(b2).append(" == JAVA_NULL) ? throwException_R_int(threadStateData, __NEW_INSTANCE_java_lang_NullPointerException(threadStateData)) : (*((JAVA_ARRAY)").append(b2).append(")).length)");
                    b.append("CN1_ARRAY_LENGTH(").append(b2.toString().trim()).append(")");
                } else {
                    return false;
        //        break;
        //    }
        //    default: {
        //        return false;
        //    }
        }
        if (varName != null) {
            b.append(";\n");
        }
                
        sb.append(b);
        return true;
    }
    
    
    
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy