blob: 80d45b05db0618e2341561a3849f4445eb4c5473 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
package scala.runtime;
import java.dyn.CallSite;
import java.dyn.MethodHandle;
/**
* This class resolves calls through refinement types. The
* bootstrap method is called when an invokedynamic is found
* by the Java VM.
*
* Note: Requires Java 7 with invoke dynamic support (see JSR 292)
*
* @author Iulian Dragos
* @see JSR292
*/
public class DynamicDispatch {
/**
* Resolve an invoke dynamic in Scala code. invokedynamic calls appear
* when a method defined by a refinement type is called. It is resolved
* by looking up a method with the same name and types in the receiver
* object. It is guaranteed by the type checker that such a method
* exists.
*
* The current implementation is not correct, a call site being
* always bootstrapped to a method handle. A bound call site should be
* guarded by a test on the receiver type. Such code should either
* be generated by the compiler, or by this bootstrap method using
* one of the code combinators provided in java.dyn.*.
*
* ATM, they are not yet available in the JVM.
*/
public static Object bootstrapInvokeDynamic(CallSite cs, Object... args) {
println(cs);
MethodHandle mh = MethodHandles.findVirtual(cs.callerClass(),
cs.name(),
cs.type());
cs.setTarget(mh);
return mh(args);
}
}
|