@@ -311,6 +311,17 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
311
311
case app : Apply =>
312
312
generatedType = genApply(app, expectedType)
313
313
314
+ case app @ ApplyDynamic (qual, args) if settings.target == " jvm.1.8" =>
315
+ genLoad(qual)
316
+ val symbol = app.symbol
317
+ val paramTypes = symbol.info.paramTypes map toTypeKind
318
+ genLoadArguments(args, paramTypes)
319
+ val argAsmTypes = symbol.info.params.map(symInfoTK).map(_.toASMType)
320
+ val returnAsmType = toTypeKind(symbol.info.resultType).toASMType
321
+ val invokedType = asm.Type .getMethodType(returnAsmType, toTypeKind(qual.tpe).toASMType +: argAsmTypes : _* )
322
+ val name = " dyn:callMethod:" + symbol.name
323
+ mnode.visitInvokeDynamicInsn(name, invokedType.getDescriptor, dynalinkBoostrapHandle)
324
+
314
325
case ApplyDynamic (qual, args) => sys.error(" No invokedynamic support yet." )
315
326
316
327
case This (qual) =>
@@ -1324,4 +1335,11 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
1324
1335
definitions.LambdaMetaFactory .fullName('/' ), sn.AltMetafactory .toString,
1325
1336
" (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;" )
1326
1337
1338
+ // TODO use custom boostrap method in our runtime that employs ChainedCallSite to cache recently used linkage results
1339
+ // TODO use "org.dynalang" % "dynalink" rather than relying on Nashorn internals
1340
+ lazy val dynalinkBoostrapHandle =
1341
+ new asm.Handle (asm.Opcodes .H_INVOKESTATIC ,
1342
+ " jdk/internal/dynalink/DefaultBootstrapper" , " bootstrap" ,
1343
+ " (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;" )
1344
+
1327
1345
}
0 commit comments