< prev index next >

src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java

Print this page
rev 49208 : 8199471: Enable generation of callSiteForms at link time
Reviewed-by: psandoz


 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);


< prev index next >