SparseSwitchMethodItem.java revision fda2e631ac0b1ca092973b7fff4b2f38d2c23437
19bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com/* 29bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com * [The "BSD licence"] 39bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com * Copyright (c) 2009 Ben Gruver 49bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com * All rights reserved. 59bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com * 69bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com * Redistribution and use in source and binary forms, with or without 79bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com * modification, are permitted provided that the following conditions 89bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com * are met: 99bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com * 1. Redistributions of source code must retain the above copyright 109bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com * notice, this list of conditions and the following disclaimer. 119bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com * 2. Redistributions in binary form must reproduce the above copyright 129bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com * notice, this list of conditions and the following disclaimer in the 139bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com * documentation and/or other materials provided with the distribution. 149bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com * 3. The name of the author may not be used to endorse or promote products 159bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com * derived from this software without specific prior written permission. 169bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com * 179bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 189bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 199bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 209bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 219bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 229bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 239bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 249bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 259bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 269bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 279bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com */ 289bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com 296ef13753e78bb7abc7e7683d5e533c3395d4a9b6JesusFreke@JesusFreke.compackage org.jf.baksmali.Adaptors.Format; 309bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com 317ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.comimport org.antlr.stringtemplate.StringTemplate; 323c23129eecb7127646f2901c1b0ec3b94a83c08fJesusFreke@JesusFreke.comimport org.antlr.stringtemplate.StringTemplateGroup; 333c23129eecb7127646f2901c1b0ec3b94a83c08fJesusFreke@JesusFreke.comimport org.jf.dexlib.Code.Format.SparseSwitchDataPseudoInstruction; 343c23129eecb7127646f2901c1b0ec3b94a83c08fJesusFreke@JesusFreke.comimport org.jf.dexlib.CodeItem; 35e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.comimport org.jf.baksmali.Adaptors.LabelMethodItem; 36e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.comimport org.jf.baksmali.Adaptors.MethodDefinition; 379bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com 383c23129eecb7127646f2901c1b0ec3b94a83c08fJesusFreke@JesusFreke.comimport java.util.ArrayList; 39cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.comimport java.util.Iterator; 407ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.comimport java.util.List; 41cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com 42e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.compublic class SparseSwitchMethodItem extends InstructionFormatMethodItem<SparseSwitchDataPseudoInstruction> 43e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com implements Iterable<LabelMethodItem> { 44e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com private List<SparseSwitchTarget> targets = new ArrayList<SparseSwitchTarget>(); 459bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com 46e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com public SparseSwitchMethodItem(MethodDefinition.LabelCache labelCache, CodeItem codeItem, int offset, 47e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com StringTemplateGroup stg, SparseSwitchDataPseudoInstruction instruction, 48e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com int baseAddress) { 493c23129eecb7127646f2901c1b0ec3b94a83c08fJesusFreke@JesusFreke.com super(codeItem, offset, stg, instruction); 50cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com 51fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com 52fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com Iterator<SparseSwitchDataPseudoInstruction.SparseSwitchTarget> iterator = instruction.iterateKeysAndTargets(); 537ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com while (iterator.hasNext()) { 547ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com SparseSwitchDataPseudoInstruction.SparseSwitchTarget target = iterator.next(); 557ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com SparseSwitchTarget sparseSwitchTarget = new SparseSwitchTarget(); 56fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com sparseSwitchTarget.Key = target.key; 57e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com 58e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com LabelMethodItem label = new LabelMethodItem(baseAddress + target.target, stg, "sswitch_"); 59e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com label = labelCache.internLabel(label); 60e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com sparseSwitchTarget.Target = label; 61e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com 627ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com targets.add(sparseSwitchTarget); 637ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com } 64e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com } 65e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com 66e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com protected void setAttributes(StringTemplate template) { 67e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com template.setAttribute("Targets", targets); 68e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com } 69e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com 70e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com public Iterator<LabelMethodItem> iterator() { 71e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com return new Iterator<LabelMethodItem>() { 72e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com private Iterator<SparseSwitchTarget> iterator = targets.iterator(); 73e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com 74e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com public boolean hasNext() { 75e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com return iterator.hasNext(); 76e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com } 779bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com 78e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com public LabelMethodItem next() { 79e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com return iterator.next().Target; 80e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com } 81e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com 82e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com public void remove() { 83e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com iterator.remove(); 84e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com } 85e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com }; 86e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com } 87e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com 88e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com private static class SparseSwitchTarget { 89fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com public int Key; 90e2684fa2191e04f27faba763f2bcc19593513b25JesusFreke@JesusFreke.com public LabelMethodItem Target; 919bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com } 929bc4978139ca38e422ae89065d3062146534132dJesusFreke@JesusFreke.com} 93