116 // the basic reinvokers associated with Species_L. Ultimately we
117 // may want to consider pregenerating more of these, which will
118 // require an even more complex naming scheme
119 LambdaForm reinvoker = makeReinvokerFor(methodTypes[i]);
120 forms.add(reinvoker);
121 String speciesSig = BoundMethodHandle.speciesDataFor(reinvoker).key();
122 assert(speciesSig.equals("L"));
123 names.add(reinvoker.kind.defaultLambdaName + "_" + speciesSig);
124
125 LambdaForm delegate = makeDelegateFor(methodTypes[i]);
126 forms.add(delegate);
127 names.add(delegate.kind.defaultLambdaName);
128 }
129 }
130 return generateCodeBytesForLFs(className,
131 names.toArray(new String[0]),
132 forms.toArray(new LambdaForm[0]));
133 }
134
135 static byte[] generateInvokersHolderClassBytes(String className,
136 MethodType[] methodTypes) {
137
138 HashSet<MethodType> dedupSet = new HashSet<>();
139 ArrayList<LambdaForm> forms = new ArrayList<>();
140 ArrayList<String> names = new ArrayList<>();
141 int[] types = {
142 MethodTypeForm.LF_EX_LINKER,
143 MethodTypeForm.LF_EX_INVOKER,
144 MethodTypeForm.LF_GEN_LINKER,
145 MethodTypeForm.LF_GEN_INVOKER
146 };
147 for (int i = 0; i < methodTypes.length; i++) {
148 // generate methods representing invokers of the specified type
149 if (dedupSet.add(methodTypes[i])) {
150 for (int type : types) {
151 LambdaForm invokerForm = Invokers.invokeHandleForm(methodTypes[i],
152 /*customized*/false, type);
153 forms.add(invokerForm);
154 names.add(invokerForm.kind.defaultLambdaName);
155 }
156 }
157 }
158 return generateCodeBytesForLFs(className,
159 names.toArray(new String[0]),
160 forms.toArray(new LambdaForm[0]));
161 }
162
163 /*
164 * Generate customized code for a set of LambdaForms of specified types into
165 * a class with a specified name.
166 */
167 private static byte[] generateCodeBytesForLFs(String className,
168 String[] names, LambdaForm[] forms) {
169
170 ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES);
171 cw.visit(Opcodes.V1_8, Opcodes.ACC_PRIVATE + Opcodes.ACC_FINAL + Opcodes.ACC_SUPER,
172 className, null, InvokerBytecodeGenerator.INVOKER_SUPER_NAME, null);
173 cw.visitSource(className.substring(className.lastIndexOf('/') + 1), null);
174
175 for (int i = 0; i < forms.length; i++) {
176 addMethod(className, names[i], forms[i],
177 forms[i].methodType(), cw);
|
116 // the basic reinvokers associated with Species_L. Ultimately we
117 // may want to consider pregenerating more of these, which will
118 // require an even more complex naming scheme
119 LambdaForm reinvoker = makeReinvokerFor(methodTypes[i]);
120 forms.add(reinvoker);
121 String speciesSig = BoundMethodHandle.speciesDataFor(reinvoker).key();
122 assert(speciesSig.equals("L"));
123 names.add(reinvoker.kind.defaultLambdaName + "_" + speciesSig);
124
125 LambdaForm delegate = makeDelegateFor(methodTypes[i]);
126 forms.add(delegate);
127 names.add(delegate.kind.defaultLambdaName);
128 }
129 }
130 return generateCodeBytesForLFs(className,
131 names.toArray(new String[0]),
132 forms.toArray(new LambdaForm[0]));
133 }
134
135 static byte[] generateInvokersHolderClassBytes(String className,
136 MethodType[] invokerMethodTypes, MethodType[] callSiteMethodTypes) {
137
138 HashSet<MethodType> dedupSet = new HashSet<>();
139 ArrayList<LambdaForm> forms = new ArrayList<>();
140 ArrayList<String> names = new ArrayList<>();
141 int[] types = {
142 MethodTypeForm.LF_EX_LINKER,
143 MethodTypeForm.LF_EX_INVOKER,
144 MethodTypeForm.LF_GEN_LINKER,
145 MethodTypeForm.LF_GEN_INVOKER
146 };
147
148 for (int i = 0; i < invokerMethodTypes.length; i++) {
149 // generate methods representing invokers of the specified type
150 if (dedupSet.add(invokerMethodTypes[i])) {
151 for (int type : types) {
152 LambdaForm invokerForm = Invokers.invokeHandleForm(invokerMethodTypes[i],
153 /*customized*/false, type);
154 forms.add(invokerForm);
155 names.add(invokerForm.kind.defaultLambdaName);
156 }
157 }
158 }
159
160 dedupSet = new HashSet<>();
161 for (int i = 0; i < callSiteMethodTypes.length; i++) {
162 // generate methods representing invokers of the specified type
163 if (dedupSet.add(callSiteMethodTypes[i])) {
164 LambdaForm callSiteForm = Invokers.callSiteForm(callSiteMethodTypes[i], true);
165 forms.add(callSiteForm);
166 names.add(callSiteForm.kind.defaultLambdaName);
167
168 LambdaForm methodHandleForm = Invokers.callSiteForm(callSiteMethodTypes[i], false);
169 forms.add(methodHandleForm);
170 names.add(methodHandleForm.kind.defaultLambdaName);
171 }
172 }
173
174 return generateCodeBytesForLFs(className,
175 names.toArray(new String[0]),
176 forms.toArray(new LambdaForm[0]));
177 }
178
179 /*
180 * Generate customized code for a set of LambdaForms of specified types into
181 * a class with a specified name.
182 */
183 private static byte[] generateCodeBytesForLFs(String className,
184 String[] names, LambdaForm[] forms) {
185
186 ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES);
187 cw.visit(Opcodes.V1_8, Opcodes.ACC_PRIVATE + Opcodes.ACC_FINAL + Opcodes.ACC_SUPER,
188 className, null, InvokerBytecodeGenerator.INVOKER_SUPER_NAME, null);
189 cw.visitSource(className.substring(className.lastIndexOf('/') + 1), null);
190
191 for (int i = 0; i < forms.length; i++) {
192 addMethod(className, names[i], forms[i],
193 forms[i].methodType(), cw);
|