1917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul/* 2917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * Copyright (C) 2008 The Android Open Source Project 3917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * 4917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * Licensed under the Apache License, Version 2.0 (the "License"); 5917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * you may not use this file except in compliance with the License. 6917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * You may obtain a copy of the License at 7917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * 8917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * http://www.apache.org/licenses/LICENSE-2.0 9917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * 10917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * Unless required by applicable law or agreed to in writing, software 11917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * distributed under the License is distributed on an "AS IS" BASIS, 12917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * See the License for the specific language governing permissions and 14917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * limitations under the License. 15917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul */ 16917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 17917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgulpackage com.android.dexgen.rop.code; 18917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 19917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgulimport com.android.dexgen.rop.cst.Constant; 20917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgulimport com.android.dexgen.rop.type.StdTypeList; 21917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgulimport com.android.dexgen.rop.type.Type; 22917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgulimport com.android.dexgen.rop.type.TypeList; 23917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 24917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgulimport java.util.ArrayList; 25917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 26917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul/** 27917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * Instruction which fills a newly created array with a predefined list of 28917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * constant values. 29917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul */ 30917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgulpublic final class FillArrayDataInsn 31917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul extends Insn { 32917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 33917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** non-null: initial values to fill the newly created array */ 34917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul private final ArrayList<Constant> initValues; 35917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 36917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** 37917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * non-null: type of the array. Will be used to determine the width of 38917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * elements in the array-data table. 39917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul */ 40917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul private final Constant arrayType; 41917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 42917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** 43917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * Constructs an instance. 44917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * 45917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * @param opcode {@code non-null;} the opcode 46917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * @param position {@code non-null;} source position 47917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * @param sources {@code non-null;} specs for all the sources 48917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * @param initValues {@code non-null;} list of initial values to fill the array 49917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * @param cst {@code non-null;} type of the new array 50917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul */ 51917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul public FillArrayDataInsn(Rop opcode, SourcePosition position, 52917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul RegisterSpecList sources, 53917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul ArrayList<Constant> initValues, 54917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul Constant cst) { 55917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul super(opcode, position, null, sources); 56917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 57917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul if (opcode.getBranchingness() != Rop.BRANCH_NONE) { 58917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul throw new IllegalArgumentException("bogus branchingness"); 59917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 60917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 61917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul this.initValues = initValues; 62917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul this.arrayType = cst; 63917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 64917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 65917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 66917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** {@inheritDoc} */ 67917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul @Override 68917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul public TypeList getCatches() { 69917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return StdTypeList.EMPTY; 70917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 71917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 72917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** 73917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * Return the list of init values 74917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * @return {@code non-null;} list of init values 75917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul */ 76917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul public ArrayList<Constant> getInitValues() { 77917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return initValues; 78917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 79917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 80917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** 81917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * Return the type of the newly created array 82917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * @return {@code non-null;} array type 83917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul */ 84917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul public Constant getConstant() { 85917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return arrayType; 86917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 87917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 88917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** {@inheritDoc} */ 89917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul @Override 90917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul public void accept(Visitor visitor) { 91917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul visitor.visitFillArrayDataInsn(this); 92917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 93917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 94917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** {@inheritDoc} */ 95917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul @Override 96917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul public Insn withAddedCatch(Type type) { 97917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul throw new UnsupportedOperationException("unsupported"); 98917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 99917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 100917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** {@inheritDoc} */ 101917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul @Override 102917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul public Insn withRegisterOffset(int delta) { 103917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return new FillArrayDataInsn(getOpcode(), getPosition(), 104917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul getSources().withOffset(delta), 105917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul initValues, arrayType); 106917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 107917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 108917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** {@inheritDoc} */ 109917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul @Override 110917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul public Insn withNewRegisters(RegisterSpec result, 111917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul RegisterSpecList sources) { 112917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 113917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return new FillArrayDataInsn(getOpcode(), getPosition(), 114917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul sources, initValues, arrayType); 115917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 116917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul} 117