1579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson/* 2579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Copyright (C) 2007 The Android Open Source Project 3579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 4579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 5579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * you may not use this file except in compliance with the License. 6579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * You may obtain a copy of the License at 7579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 8579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 9579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 10579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Unless required by applicable law or agreed to in writing, software 11579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 12579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * See the License for the specific language governing permissions and 14579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * limitations under the License. 15579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 16579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 17579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonpackage com.android.dx.dex.file; 18579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 19579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.rop.cst.Constant; 20579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.rop.cst.CstFieldRef; 21579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.util.AnnotatedOutput; 22579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.util.Hex; 23579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 24579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport java.util.Collection; 25579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport java.util.TreeMap; 26579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 27579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson/** 28579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Field refs list section of a {@code .dex} file. 29579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 30579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonpublic final class FieldIdsSection extends MemberIdsSection { 31579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 32579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * {@code non-null;} map from field constants to {@link 33579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * FieldIdItem} instances 34579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 35579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson private final TreeMap<CstFieldRef, FieldIdItem> fieldIds; 36579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 37579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 38579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Constructs an instance. The file offset is initially unknown. 39579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 40579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param file {@code non-null;} file that this instance is part of 41579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 42579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public FieldIdsSection(DexFile file) { 43579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson super("field_ids", file); 44579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 45579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson fieldIds = new TreeMap<CstFieldRef, FieldIdItem>(); 46579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 47579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 48579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@inheritDoc} */ 49579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson @Override 50579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public Collection<? extends Item> items() { 51579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return fieldIds.values(); 52579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 53579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 54579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@inheritDoc} */ 55579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson @Override 56579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public IndexedItem get(Constant cst) { 57579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (cst == null) { 58579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson throw new NullPointerException("cst == null"); 59579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 60579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 61579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson throwIfNotPrepared(); 62579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 63579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson IndexedItem result = fieldIds.get((CstFieldRef) cst); 64579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 65579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (result == null) { 66579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson throw new IllegalArgumentException("not found"); 67579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 68579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 69579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return result; 70579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 71579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 72579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 73579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Writes the portion of the file header that refers to this instance. 74579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 75579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param out {@code non-null;} where to write 76579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 77579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public void writeHeaderPart(AnnotatedOutput out) { 78579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson throwIfNotPrepared(); 79579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 80579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson int sz = fieldIds.size(); 81579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson int offset = (sz == 0) ? 0 : getFileOffset(); 82579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 83579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (out.annotates()) { 84579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson out.annotate(4, "field_ids_size: " + Hex.u4(sz)); 85579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson out.annotate(4, "field_ids_off: " + Hex.u4(offset)); 86579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 87579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 88579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson out.writeInt(sz); 89579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson out.writeInt(offset); 90579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 91579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 92579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 93579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Interns an element into this instance. 94579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 95579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param field {@code non-null;} the reference to intern 96579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return {@code non-null;} the interned reference 97579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 98579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public FieldIdItem intern(CstFieldRef field) { 99579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (field == null) { 100579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson throw new NullPointerException("field == null"); 101579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 102579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 103579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson throwIfPrepared(); 104579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 105579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson FieldIdItem result = fieldIds.get(field); 106579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 107579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (result == null) { 108579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson result = new FieldIdItem(field); 109579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson fieldIds.put(field, result); 110579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 111579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 112579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return result; 113579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 114579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 115579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 116579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Gets the index of the given reference, which must have been added 117579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * to this instance. 118579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 119579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param ref {@code non-null;} the reference to look up 120579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return {@code >= 0;} the reference's index 121579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 122579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public int indexOf(CstFieldRef ref) { 123579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (ref == null) { 124579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson throw new NullPointerException("ref == null"); 125579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 126579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 127579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson throwIfNotPrepared(); 128579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 129579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson FieldIdItem item = fieldIds.get(ref); 130579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 131579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (item == null) { 132579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson throw new IllegalArgumentException("not found"); 133579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 134579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 135579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return item.getIndex(); 136579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 137579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson} 138