1e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver/* 2e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver * Copyright 2012, Google Inc. 3e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver * All rights reserved. 4e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver * 5e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver * Redistribution and use in source and binary forms, with or without 6e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver * modification, are permitted provided that the following conditions are 7e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver * met: 8e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver * 9e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver * * Redistributions of source code must retain the above copyright 10e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver * notice, this list of conditions and the following disclaimer. 11e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver * * Redistributions in binary form must reproduce the above 12e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver * copyright notice, this list of conditions and the following disclaimer 13e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver * in the documentation and/or other materials provided with the 14e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver * distribution. 15e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver * * Neither the name of Google Inc. nor the names of its 16e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver * contributors may be used to endorse or promote products derived from 17e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver * this software without specific prior written permission. 18e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver * 19e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver */ 31e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver 32e80efa670f1027fdf3882a298216a460199e38d0Ben Gruverpackage org.jf.dexlib2.builder.instruction; 33e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver 34e80efa670f1027fdf3882a298216a460199e38d0Ben Gruverimport com.google.common.collect.ImmutableList; 35e80efa670f1027fdf3882a298216a460199e38d0Ben Gruverimport com.google.common.collect.Lists; 36e80efa670f1027fdf3882a298216a460199e38d0Ben Gruverimport org.jf.dexlib2.Format; 37e80efa670f1027fdf3882a298216a460199e38d0Ben Gruverimport org.jf.dexlib2.Opcode; 38e80efa670f1027fdf3882a298216a460199e38d0Ben Gruverimport org.jf.dexlib2.builder.BuilderSwitchPayload; 39e80efa670f1027fdf3882a298216a460199e38d0Ben Gruverimport org.jf.dexlib2.builder.Label; 40e80efa670f1027fdf3882a298216a460199e38d0Ben Gruverimport org.jf.dexlib2.iface.instruction.formats.PackedSwitchPayload; 41e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver 42e80efa670f1027fdf3882a298216a460199e38d0Ben Gruverimport javax.annotation.Nonnull; 43e80efa670f1027fdf3882a298216a460199e38d0Ben Gruverimport javax.annotation.Nullable; 44e80efa670f1027fdf3882a298216a460199e38d0Ben Gruverimport java.util.List; 45e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver 46e80efa670f1027fdf3882a298216a460199e38d0Ben Gruverpublic class BuilderPackedSwitchPayload extends BuilderSwitchPayload implements PackedSwitchPayload { 47e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver public static final Opcode OPCODE = Opcode.PACKED_SWITCH_PAYLOAD; 48e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver 49899b1e6611d260370aa81b9fb23684d2052e5f5fBen Gruver @Nonnull protected final List<BuilderSwitchElement> switchElements; 50e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver 51e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver public BuilderPackedSwitchPayload(final int startKey, 52e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver @Nullable List<? extends Label> switchElements) { 53e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver super(OPCODE); 54e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver if (switchElements == null) { 55e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver this.switchElements = ImmutableList.of(); 56e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver } else { 57a2bf7f64bc39c6631ddaff28d87c1a982ba5dfa6Ben Gruver this.switchElements = Lists.newArrayList(); 58a2bf7f64bc39c6631ddaff28d87c1a982ba5dfa6Ben Gruver int key = startKey; 59a2bf7f64bc39c6631ddaff28d87c1a982ba5dfa6Ben Gruver for (Label target: switchElements) { 60a2bf7f64bc39c6631ddaff28d87c1a982ba5dfa6Ben Gruver this.switchElements.add(new BuilderSwitchElement(this, key++, target)); 61a2bf7f64bc39c6631ddaff28d87c1a982ba5dfa6Ben Gruver } 62e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver } 63e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver } 64e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver 65899b1e6611d260370aa81b9fb23684d2052e5f5fBen Gruver @Nonnull @Override public List<BuilderSwitchElement> getSwitchElements() { return switchElements; } 66e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver 67e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver @Override public int getCodeUnits() { return 4 + switchElements.size() * 2; } 68e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver @Override public Format getFormat() { return OPCODE.format; } 69e80efa670f1027fdf3882a298216a460199e38d0Ben Gruver} 70