Package cn.wensiqun.asmsupport.operators.array

Source Code of cn.wensiqun.asmsupport.operators.array.AbstractArrayOperator

/**
*
*/
package cn.wensiqun.asmsupport.operators.array;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import cn.wensiqun.asmsupport.Parameterized;
import cn.wensiqun.asmsupport.asm.InstructionHelper;
import cn.wensiqun.asmsupport.block.ProgramBlock;
import cn.wensiqun.asmsupport.clazz.AClass;
import cn.wensiqun.asmsupport.clazz.ArrayClass;
import cn.wensiqun.asmsupport.exception.ClassException;
import cn.wensiqun.asmsupport.operators.AbstractOperator;
import cn.wensiqun.asmsupport.operators.numerical.crement.AbstractCrement;
import cn.wensiqun.asmsupport.utils.AClassUtils;

/**
* @author 温斯群(Joe Wen)
*
*/
public abstract class AbstractArrayOperator extends AbstractOperator {

    private static Log log = LogFactory.getLog(AbstractArrayOperator.class);
   
    protected Parameterized arrayReference;
   
    protected Parameterized[] parDims;
   
    protected AbstractArrayOperator(ProgramBlock block, Parameterized arrayVar) {
        super(block);
        this.arrayReference = arrayVar;
    }
   
  @Override
  protected final void checkOutCrement() {
        if(parDims != null){
            for(Parameterized par : parDims){
                if(par instanceof AbstractCrement){
                    allCrement.add((AbstractCrement) par);
                }
            }
        }
  }
 
    @Override
  protected void checkAsArgument() {
        arrayReference.asArgument();
        if(parDims != null){
            for(Parameterized par : parDims){
                par.asArgument();
            }
        }
  }
   
  @Override
  protected void verifyArgument() {
    if(!(arrayReference.getParamterizedType() instanceof ArrayClass)){
          throw new ClassException(toString() + " : the declare class of " + arrayReference.toString() + " is not a array type");
        }
   
    if(ArrayUtils.isNotEmpty(parDims)){
      for(Parameterized par : parDims){
        AClassUtils.autoCastTypeCheck(par.getParamterizedType(), AClass.INT_ACLASS);
      }
    }
   
  }

  protected void getValue(){
        InstructionHelper ih = block.getInsnHelper();
        AClass cls = arrayReference.getParamterizedType();
        if(log.isDebugEnabled()){
            log.debug("load the array reference to stack");
        }
        arrayReference.loadToStack(block);
       
        for(int i=0; i<parDims.length; i++){
            cls = ((ArrayClass) cls).getNextDimType();
            parDims[i].loadToStack(block);
            autoCast(parDims[i].getParamterizedType(), AClass.INT_ACLASS);
            ih.arrayLoad(cls.getType());
        }
       
    }
}
TOP

Related Classes of cn.wensiqun.asmsupport.operators.array.AbstractArrayOperator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.