1b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson/* 2b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson * Copyright (C) 2017 The Android Open Source Project 3b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson * 4b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson * Licensed under the Apache License, Version 2.0 (the "License"); 5b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson * you may not use this file except in compliance with the License. 6b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson * You may obtain a copy of the License at 7b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson * 8b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson * http://www.apache.org/licenses/LICENSE-2.0 9b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson * 10b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson * Unless required by applicable law or agreed to in writing, software 11b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson * distributed under the License is distributed on an "AS IS" BASIS, 12b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson * See the License for the specific language governing permissions and 14b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson * limitations under the License. 15b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson */ 16b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodsonpackage com.android.dx.dex.file; 17b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson 18b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodsonimport com.android.dx.rop.cst.Constant; 19b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodsonimport com.android.dx.rop.cst.CstMethodHandle; 20b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodsonimport java.util.Collection; 21b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodsonimport java.util.TreeMap; 22b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson 23b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodsonpublic final class MethodHandlesSection extends UniformItemSection { 24b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson 25b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson private final TreeMap<CstMethodHandle, MethodHandleItem> methodHandles = new TreeMap<>(); 26b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson 27b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson public MethodHandlesSection(DexFile dexFile) { 28b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson super("method_handles", dexFile, 8); 29b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson } 30b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson 31b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson @Override 32b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson public IndexedItem get(Constant cst) { 33b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson if (cst == null) { 34b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson throw new NullPointerException("cst == null"); 35b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson } 36b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson throwIfNotPrepared(); 37b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson 38b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson IndexedItem result = methodHandles.get((CstMethodHandle) cst); 39b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson if (result == null) { 40b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson throw new IllegalArgumentException("not found"); 41b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson } 42b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson return result; 43b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson } 44b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson 45b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson @Override 46b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson protected void orderItems() { 47b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson int index = 0; 48b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson for (MethodHandleItem item : methodHandles.values()) { 49b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson item.setIndex(index++); 50b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson } 51b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson } 52b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson 53b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson @Override 54b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson public Collection<? extends Item> items() { 55b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson return methodHandles.values(); 56b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson } 57b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson 58b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson public void intern(CstMethodHandle methodHandle) { 59b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson if (methodHandle == null) { 60b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson throw new NullPointerException("methodHandle == null"); 61b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson } 62b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson 63b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson throwIfPrepared(); 64b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson 65b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson MethodHandleItem result = methodHandles.get(methodHandle); 66b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson if (result == null) { 67b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson result = new MethodHandleItem(methodHandle); 68b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson methodHandles.put(methodHandle, result); 69b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson } 70b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson } 71b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson 72b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson int indexOf(CstMethodHandle cstMethodHandle) { 73b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson return methodHandles.get(cstMethodHandle).getIndex(); 74b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson } 75b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson} 76