• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.android.dx.cf.code;
17 
18 import com.android.dx.rop.cst.CstMethodHandle;
19 import com.android.dx.rop.cst.CstType;
20 import com.android.dx.util.FixedSizeList;
21 
22 /**
23  * List of bootstrap method entries, which are the contents of
24  * {@code BootstrapMethods} attributes.
25  */
26 public class BootstrapMethodsList extends FixedSizeList {
27     /** {@code non-null;} zero-size instance */
28     public static final BootstrapMethodsList EMPTY = new BootstrapMethodsList(0);
29 
30     /**
31      * Constructs an instance.
32      *
33      * @param count the number of elements to be in the list
34      */
BootstrapMethodsList(int count)35     public BootstrapMethodsList(int count) {
36         super(count);
37     }
38 
39     /**
40      * Gets the indicated item.
41      *
42      * @param n {@code >= 0;} which item
43      * @return {@code null-ok;} the indicated item
44      */
get(int n)45     public Item get(int n) {
46         return (Item) get0(n);
47     }
48 
49     /**
50      * Sets the item at the given index.
51      *
52      * @param n {@code >= 0, < size();} which element
53      * @param item {@code non-null;} the item
54      */
set(int n, Item item)55     public void set(int n, Item item) {
56         if (item == null) {
57             throw new NullPointerException("item == null");
58         }
59 
60         set0(n, item);
61     }
62 
63     /**
64      * Sets the item at the given index.
65      *
66      * @param n {@code >= 0, < size();} which element
67      * @param declaringClass {@code non-null;} the class declaring bootstrap method.
68      * @param bootstrapMethodHandle {@code non-null;} the bootstrap method handle
69      * @param arguments {@code non-null;} the arguments of the bootstrap method
70      */
set(int n, CstType declaringClass, CstMethodHandle bootstrapMethodHandle, BootstrapMethodArgumentsList arguments)71     public void set(int n, CstType declaringClass, CstMethodHandle bootstrapMethodHandle,
72                     BootstrapMethodArgumentsList arguments) {
73         set(n, new Item(declaringClass, bootstrapMethodHandle, arguments));
74     }
75 
76     /**
77      * Returns an instance which is the concatenation of the two given
78      * instances.
79      *
80      * @param list1 {@code non-null;} first instance
81      * @param list2 {@code non-null;} second instance
82      * @return {@code non-null;} combined instance
83      */
concat(BootstrapMethodsList list1, BootstrapMethodsList list2)84     public static BootstrapMethodsList concat(BootstrapMethodsList list1,
85                                               BootstrapMethodsList list2) {
86         if (list1 == EMPTY) {
87             return list2;
88         } else if (list2 == EMPTY) {
89             return list1;
90         }
91 
92         int sz1 = list1.size();
93         int sz2 = list2.size();
94         BootstrapMethodsList result = new BootstrapMethodsList(sz1 + sz2);
95 
96         for (int i = 0; i < sz1; i++) {
97             result.set(i, list1.get(i));
98         }
99 
100         for (int i = 0; i < sz2; i++) {
101             result.set(sz1 + i, list2.get(i));
102         }
103 
104         return result;
105     }
106 
107     public static class Item {
108         private final BootstrapMethodArgumentsList bootstrapMethodArgumentsList;
109         private final CstMethodHandle bootstrapMethodHandle;
110         private final CstType declaringClass;
111 
Item(CstType declaringClass, CstMethodHandle bootstrapMethodHandle, BootstrapMethodArgumentsList bootstrapMethodArguments)112         public Item(CstType declaringClass, CstMethodHandle bootstrapMethodHandle,
113                     BootstrapMethodArgumentsList bootstrapMethodArguments) {
114             if (declaringClass == null) {
115                 throw new NullPointerException("declaringClass == null");
116             }
117             if (bootstrapMethodHandle == null) {
118                 throw new NullPointerException("bootstrapMethodHandle == null");
119             }
120             if (bootstrapMethodArguments == null) {
121                 throw new NullPointerException("bootstrapMethodArguments == null");
122             }
123             this.bootstrapMethodHandle = bootstrapMethodHandle;
124             this.bootstrapMethodArgumentsList = bootstrapMethodArguments;
125             this.declaringClass = declaringClass;
126         }
127 
getBootstrapMethodHandle()128         public CstMethodHandle getBootstrapMethodHandle() {
129             return bootstrapMethodHandle;
130         }
131 
getBootstrapMethodArguments()132         public BootstrapMethodArgumentsList getBootstrapMethodArguments() {
133             return bootstrapMethodArgumentsList;
134         }
135 
getDeclaringClass()136         public CstType getDeclaringClass() {
137             return declaringClass;
138         }
139     }
140 }
141