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