871 staticArgs = staticArgs.append(LoadableConstant.Int(bridges.length() - 1));
872 for (Symbol s : bridges) {
873 Type s_erasure = s.erasure(types);
874 if (!types.isSameType(s_erasure, samSym.erasure(types))) {
875 staticArgs = staticArgs.append(((MethodType)s.erasure(types)));
876 }
877 }
878 }
879 if (isSerializable) {
880 int prevPos = make.pos;
881 try {
882 make.at(kInfo.clazz);
883 addDeserializationCase(refSym, tree.type, samSym,
884 tree, staticArgs, indyType);
885 } finally {
886 make.at(prevPos);
887 }
888 }
889 }
890
891 return makeIndyCall(tree, syms.lambdaMetafactory, metafactoryName, staticArgs, indyType, indy_args, samSym.name);
892 }
893
894 /**
895 * Generate an indy method call with given name, type and static bootstrap
896 * arguments types
897 */
898 private JCExpression makeIndyCall(DiagnosticPosition pos, Type site, Name bsmName,
899 List<LoadableConstant> staticArgs, MethodType indyType, List<JCExpression> indyArgs,
900 Name methName) {
901 int prevPos = make.pos;
902 try {
903 make.at(pos);
904 List<Type> bsm_staticArgs = List.of(syms.methodHandleLookupType,
905 syms.stringType,
906 syms.methodTypeType).appendList(staticArgs.map(types::constantType));
907
908 MethodSymbol bsm = rs.resolveInternalMethod(pos, attrEnv, site,
909 bsmName, bsm_staticArgs, List.nil());
910
911 DynamicMethodSymbol dynSym =
|
871 staticArgs = staticArgs.append(LoadableConstant.Int(bridges.length() - 1));
872 for (Symbol s : bridges) {
873 Type s_erasure = s.erasure(types);
874 if (!types.isSameType(s_erasure, samSym.erasure(types))) {
875 staticArgs = staticArgs.append(((MethodType)s.erasure(types)));
876 }
877 }
878 }
879 if (isSerializable) {
880 int prevPos = make.pos;
881 try {
882 make.at(kInfo.clazz);
883 addDeserializationCase(refSym, tree.type, samSym,
884 tree, staticArgs, indyType);
885 } finally {
886 make.at(prevPos);
887 }
888 }
889 }
890
891 Name lambdaName = samSym.name;
892 if (tree.codeReflectionInfo != null) {
893 lambdaName = lambdaName
894 .append(names.fromString("="))
895 .append(tree.codeReflectionInfo.codeModel().name);
896 }
897 Type lambdaMetafactory = tree.codeReflectionInfo != null ?
898 tree.codeReflectionInfo.reflectableLambdaMetafactory() : syms.lambdaMetafactory;
899 return makeIndyCall(tree, lambdaMetafactory, metafactoryName, staticArgs, indyType, indy_args, lambdaName);
900 }
901
902 /**
903 * Generate an indy method call with given name, type and static bootstrap
904 * arguments types
905 */
906 private JCExpression makeIndyCall(DiagnosticPosition pos, Type site, Name bsmName,
907 List<LoadableConstant> staticArgs, MethodType indyType, List<JCExpression> indyArgs,
908 Name methName) {
909 int prevPos = make.pos;
910 try {
911 make.at(pos);
912 List<Type> bsm_staticArgs = List.of(syms.methodHandleLookupType,
913 syms.stringType,
914 syms.methodTypeType).appendList(staticArgs.map(types::constantType));
915
916 MethodSymbol bsm = rs.resolveInternalMethod(pos, attrEnv, site,
917 bsmName, bsm_staticArgs, List.nil());
918
919 DynamicMethodSymbol dynSym =
|