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.cf.code;
17b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson
18b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodsonimport com.android.dx.rop.cst.CstMethodHandle;
19b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodsonimport com.android.dx.rop.cst.CstType;
20b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodsonimport com.android.dx.util.FixedSizeList;
21b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson
22b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson/**
23b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson * List of bootstrap method entries, which are the contents of
24b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson * {@code BootstrapMethods} attributes.
25b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson */
26b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodsonpublic class BootstrapMethodsList extends FixedSizeList {
27b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson    /** {@code non-null;} zero-size instance */
28b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson    public static final BootstrapMethodsList EMPTY = new BootstrapMethodsList(0);
29b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson
30b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson    /**
31b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson     * Constructs an instance.
32b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson     *
33b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson     * @param count the number of elements to be in the list
34b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson     */
35b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson    public BootstrapMethodsList(int count) {
36b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        super(count);
37b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson    }
38b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson
39b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson    /**
40b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson     * Gets the indicated item.
41b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson     *
42b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson     * @param n {@code >= 0;} which item
43b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson     * @return {@code null-ok;} the indicated item
44b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson     */
45b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson    public Item get(int n) {
46b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        return (Item) get0(n);
47b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson    }
48b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson
49b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson    /**
50b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson     * Sets the item at the given index.
51b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson     *
52b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson     * @param n {@code >= 0, < size();} which element
53b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson     * @param item {@code non-null;} the item
54b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson     */
55b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson    public void set(int n, Item item) {
56b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        if (item == null) {
57b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson            throw new NullPointerException("item == null");
58b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        }
59b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson
60b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        set0(n, item);
61b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson    }
62b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson
63b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson    /**
64b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson     * Sets the item at the given index.
65b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson     *
66b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson     * @param n {@code >= 0, < size();} which element
67b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson     * @param declaringClass {@code non-null;} the class declaring bootstrap method.
68b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson     * @param bootstrapMethodHandle {@code non-null;} the bootstrap method handle
69b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson     * @param arguments {@code non-null;} the arguments of the bootstrap method
70b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson     */
71b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson    public void set(int n, CstType declaringClass, CstMethodHandle bootstrapMethodHandle,
72b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson                    BootstrapMethodArgumentsList arguments) {
73b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        set(n, new Item(declaringClass, bootstrapMethodHandle, arguments));
74b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson    }
75b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson
76b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson    /**
77b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson     * Returns an instance which is the concatenation of the two given
78b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson     * instances.
79b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson     *
80b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson     * @param list1 {@code non-null;} first instance
81b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson     * @param list2 {@code non-null;} second instance
82b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson     * @return {@code non-null;} combined instance
83b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson     */
84b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson    public static BootstrapMethodsList concat(BootstrapMethodsList list1,
85b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson                                              BootstrapMethodsList list2) {
86b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        if (list1 == EMPTY) {
87b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson            return list2;
88b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        } else if (list2 == EMPTY) {
89b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson            return list1;
90b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        }
91b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson
92b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        int sz1 = list1.size();
93b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        int sz2 = list2.size();
94b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        BootstrapMethodsList result = new BootstrapMethodsList(sz1 + sz2);
95b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson
96b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        for (int i = 0; i < sz1; i++) {
97b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson            result.set(i, list1.get(i));
98b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        }
99b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson
100b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        for (int i = 0; i < sz2; i++) {
101b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson            result.set(sz1 + i, list2.get(i));
102b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        }
103b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson
104b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        return result;
105b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson    }
106b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson
107b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson    public static class Item {
108b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        private final BootstrapMethodArgumentsList bootstrapMethodArgumentsList;
109b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        private final CstMethodHandle bootstrapMethodHandle;
110b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        private final CstType declaringClass;
111b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson
112b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        public Item(CstType declaringClass, CstMethodHandle bootstrapMethodHandle,
113b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson                    BootstrapMethodArgumentsList bootstrapMethodArguments) {
114b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson            if (declaringClass == null) {
115b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson                throw new NullPointerException("declaringClass == null");
116b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson            }
117b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson            if (bootstrapMethodHandle == null) {
118b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson                throw new NullPointerException("bootstrapMethodHandle == null");
119b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson            }
120b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson            if (bootstrapMethodArguments == null) {
121b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson                throw new NullPointerException("bootstrapMethodArguments == null");
122b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson            }
123b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson            this.bootstrapMethodHandle = bootstrapMethodHandle;
124b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson            this.bootstrapMethodArgumentsList = bootstrapMethodArguments;
125b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson            this.declaringClass = declaringClass;
126b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        }
127b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson
128b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        public CstMethodHandle getBootstrapMethodHandle() {
129b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson            return bootstrapMethodHandle;
130b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        }
131b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson
132b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        public BootstrapMethodArgumentsList getBootstrapMethodArguments() {
133b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson            return bootstrapMethodArgumentsList;
134b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        }
135b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson
136b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        public CstType getDeclaringClass() {
137b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson            return declaringClass;
138b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        }
139b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson    }
140b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson}
141