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