Home | History | Annotate | Download | only in code
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.dexgen.rop.code;
     18 
     19 import com.android.dexgen.rop.cst.Constant;
     20 import com.android.dexgen.rop.type.StdTypeList;
     21 import com.android.dexgen.rop.type.Type;
     22 import com.android.dexgen.rop.type.TypeList;
     23 
     24 import java.util.ArrayList;
     25 
     26 /**
     27  * Instruction which fills a newly created array with a predefined list of
     28  * constant values.
     29  */
     30 public final class FillArrayDataInsn
     31         extends Insn {
     32 
     33     /** non-null: initial values to fill the newly created array */
     34     private final ArrayList<Constant> initValues;
     35 
     36     /**
     37      * non-null: type of the array. Will be used to determine the width of
     38      * elements in the array-data table.
     39      */
     40     private final Constant arrayType;
     41 
     42     /**
     43      * Constructs an instance.
     44      *
     45      * @param opcode {@code non-null;} the opcode
     46      * @param position {@code non-null;} source position
     47      * @param sources {@code non-null;} specs for all the sources
     48      * @param initValues {@code non-null;} list of initial values to fill the array
     49      * @param cst {@code non-null;} type of the new array
     50      */
     51     public FillArrayDataInsn(Rop opcode, SourcePosition position,
     52                              RegisterSpecList sources,
     53                              ArrayList<Constant> initValues,
     54                              Constant cst) {
     55         super(opcode, position, null, sources);
     56 
     57         if (opcode.getBranchingness() != Rop.BRANCH_NONE) {
     58             throw new IllegalArgumentException("bogus branchingness");
     59         }
     60 
     61         this.initValues = initValues;
     62         this.arrayType = cst;
     63     }
     64 
     65 
     66     /** {@inheritDoc} */
     67     @Override
     68     public TypeList getCatches() {
     69         return StdTypeList.EMPTY;
     70     }
     71 
     72     /**
     73      * Return the list of init values
     74      * @return {@code non-null;} list of init values
     75      */
     76     public ArrayList<Constant> getInitValues() {
     77         return initValues;
     78     }
     79 
     80     /**
     81      * Return the type of the newly created array
     82      * @return {@code non-null;} array type
     83      */
     84     public Constant getConstant() {
     85         return arrayType;
     86     }
     87 
     88     /** {@inheritDoc} */
     89     @Override
     90     public void accept(Visitor visitor) {
     91         visitor.visitFillArrayDataInsn(this);
     92     }
     93 
     94     /** {@inheritDoc} */
     95     @Override
     96     public Insn withAddedCatch(Type type) {
     97         throw new  UnsupportedOperationException("unsupported");
     98     }
     99 
    100     /** {@inheritDoc} */
    101     @Override
    102     public Insn withRegisterOffset(int delta) {
    103         return new FillArrayDataInsn(getOpcode(), getPosition(),
    104                                      getSources().withOffset(delta),
    105                                      initValues, arrayType);
    106     }
    107 
    108     /** {@inheritDoc} */
    109     @Override
    110     public Insn withNewRegisters(RegisterSpec result,
    111             RegisterSpecList sources) {
    112 
    113         return new FillArrayDataInsn(getOpcode(), getPosition(),
    114                                      sources, initValues, arrayType);
    115     }
    116 }
    117