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