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      */
FillArrayDataInsn(Rop opcode, SourcePosition position, RegisterSpecList sources, ArrayList<Constant> initValues, Constant cst)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
getCatches()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      */
getInitValues()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      */
getConstant()84     public Constant getConstant() {
85         return arrayType;
86     }
87 
88     /** {@inheritDoc} */
89     @Override
accept(Visitor visitor)90     public void accept(Visitor visitor) {
91         visitor.visitFillArrayDataInsn(this);
92     }
93 
94     /** {@inheritDoc} */
95     @Override
withAddedCatch(Type type)96     public Insn withAddedCatch(Type type) {
97         throw new  UnsupportedOperationException("unsupported");
98     }
99 
100     /** {@inheritDoc} */
101     @Override
withRegisterOffset(int delta)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
withNewRegisters(RegisterSpec result, RegisterSpecList sources)110     public Insn withNewRegisters(RegisterSpec result,
111             RegisterSpecList sources) {
112 
113         return new FillArrayDataInsn(getOpcode(), getPosition(),
114                                      sources, initValues, arrayType);
115     }
116 }
117