PackedSwitchMethodItem.java revision e2684fa2191e04f27faba763f2bcc19593513b25
1eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi/* 2eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi * [The "BSD licence"] 3eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi * Copyright (c) 2009 Ben Gruver 4eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi * All rights reserved. 5eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi * 6eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi * Redistribution and use in source and binary forms, with or without 7eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi * modification, are permitted provided that the following conditions 8eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi * are met: 9eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi * 1. Redistributions of source code must retain the above copyright 10eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi * notice, this list of conditions and the following disclaimer. 11eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi * 2. Redistributions in binary form must reproduce the above copyright 12eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi * notice, this list of conditions and the following disclaimer in the 13eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi * documentation and/or other materials provided with the distribution. 14eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi * 3. The name of the author may not be used to endorse or promote products 15eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi * derived from this software without specific prior written permission. 16eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi * 17eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 202b06e20ae32388f6e1dfd088d9773c34e6b1cb45Jean-Michel Trivi * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 212b06e20ae32388f6e1dfd088d9773c34e6b1cb45Jean-Michel Trivi * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 222b06e20ae32388f6e1dfd088d9773c34e6b1cb45Jean-Michel Trivi * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232b06e20ae32388f6e1dfd088d9773c34e6b1cb45Jean-Michel Trivi * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25e7bfcdc183454ec959ff51342f0973cabba219b2Jean-Michel Trivi * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi */ 28581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi 29581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivipackage org.jf.baksmali.Adaptors.Format; 30581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi 31581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Triviimport org.antlr.stringtemplate.StringTemplate; 32581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Triviimport org.antlr.stringtemplate.StringTemplateGroup; 33581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Triviimport org.jf.dexlib.Code.Format.PackedSwitchDataPseudoInstruction; 3435a5a30fdad179ccf38d8d756590411326159a89Jean-Michel Triviimport org.jf.dexlib.CodeItem; 35581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Triviimport org.jf.baksmali.Adaptors.LabelMethodItem; 36581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Triviimport org.jf.baksmali.Adaptors.MethodDefinition; 37581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi 3837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Triviimport java.util.ArrayList; 39581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Triviimport java.util.Iterator; 40581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Triviimport java.util.List; 41581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi 42581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivipublic class PackedSwitchMethodItem extends InstructionFormatMethodItem<PackedSwitchDataPseudoInstruction> 43581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi implements Iterable<LabelMethodItem> { 44581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi private List<LabelMethodItem> labels = new ArrayList<LabelMethodItem>(); 4537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 4637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi public PackedSwitchMethodItem(MethodDefinition.LabelCache labelCache, CodeItem codeItem, int offset, 4737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi StringTemplateGroup stg, PackedSwitchDataPseudoInstruction instruction, 4837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi int baseAddress) { 4937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi super(codeItem, offset, stg, instruction); 5037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 5137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi Iterator<PackedSwitchDataPseudoInstruction.PackedSwitchTarget> iterator = instruction.getTargets(); 5237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi while (iterator.hasNext()) { 5337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi PackedSwitchDataPseudoInstruction.PackedSwitchTarget target = iterator.next(); 5437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi LabelMethodItem label = new LabelMethodItem(baseAddress + target.target, stg, "pswitch_"); 5537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi label = labelCache.internLabel(label); 5637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi labels.add(label); 5737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } 5837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } 5937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 6037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi protected void setAttributes(StringTemplate template) { 6137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi template.setAttribute("FirstKey", instruction.getFirstKey()); 6237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi template.setAttribute("Targets", labels); 6337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } 6437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 6537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi public Iterator<LabelMethodItem> iterator() { 6637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi return labels.iterator(); 6737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } 6837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi} 6937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi