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