1/* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package dexfuzz.rawdex.formats; 18 19import dexfuzz.rawdex.DexRandomAccessFile; 20import dexfuzz.rawdex.Instruction; 21import dexfuzz.rawdex.OpcodeInfo; 22 23import java.io.IOException; 24 25public class Format22cs extends Format2 implements ContainsVRegs, ContainsPoolIndex { 26 @Override 27 public void writeToFile(DexRandomAccessFile file, Instruction insn) throws IOException { 28 throw new Error("Did not expect to have to write a 22cs instruction!"); 29 // If for some reason 22cs instructions were in DEX files in the future, uncomment: 30 //file.writeByte((byte) insn.info.value); 31 //file.writeByte((byte) (insn.vreg_a | (insn.vreg_b << 4))); 32 //file.writeUShort((short) insn.vreg_c); 33 //return; 34 } 35 36 @Override 37 public long getA(byte[] raw) throws IOException { 38 return RawInsnHelper.getUnsignedLowNibbleFromByte(raw, 1); 39 } 40 41 @Override 42 public long getB(byte[] raw) throws IOException { 43 return RawInsnHelper.getUnsignedHighNibbleFromByte(raw, 1); 44 } 45 46 @Override 47 public long getC(byte[] raw) throws IOException { 48 return RawInsnHelper.getUnsignedShortFromTwoBytes(raw, 2); 49 } 50 51 @Override 52 public int getVRegCount() { 53 return 2; 54 } 55 56 @Override 57 public int getPoolIndex(Instruction insn) { 58 return (int) insn.vregC; 59 } 60 61 @Override 62 public void setPoolIndex(Instruction insn, int poolIndex) { 63 insn.vregC = poolIndex; 64 } 65 66 @Override 67 public PoolIndexKind getPoolIndexKind(OpcodeInfo info) { 68 // This should technically be a byte offset, but we should never encounter 69 // this format during DEX mutation anyway. (see writeToFile()) 70 return PoolIndexKind.Field; 71 } 72} 73