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