@@ -311,7 +311,16 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
311
311
case app : Apply =>
312
312
generatedType = genApply(app, expectedType)
313
313
314
- case ApplyDynamic (qual, args) => sys.error(" No invokedynamic support yet." )
314
+ case app @ ApplyDynamic (qual, args) =>
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)
315
324
316
325
case This (qual) =>
317
326
val symIsModuleClass = tree.symbol.isModuleClass
@@ -1324,4 +1333,11 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
1324
1333
definitions.LambdaMetaFactory .fullName('/' ), sn.AltMetafactory .toString,
1325
1334
" (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;" )
1326
1335
1336
+ // TODO use custom boostrap method in our runtime that employs ChainedCallSite to cache recently used linkage results
1337
+ // TODO use "org.dynalang" % "dynalink" rather than relying on Nashorn internals
1338
+ lazy val dynalinkBoostrapHandle =
1339
+ new asm.Handle (asm.Opcodes .H_INVOKESTATIC ,
1340
+ " jdk/internal/dynalink/DefaultBootstrapper" , " bootstrap" ,
1341
+ " (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;" )
1342
+
1327
1343
}
0 commit comments