On Oct 19, 2015, at 10:46 AM, Jochen Theodorou <blackd...@gmx.org> wrote:

> since it is dynalink there is I guess only one master linker in the end. Can 
> you point me to some code showing how the composition of linkers is done to 
> refresh my memory on that?

Sure, here’s how Nashorn does it:

http://hg.openjdk.java.net/jdk9/dev/nashorn/file/f93753325c7b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/Bootstrap.java#l92
 
<http://hg.openjdk.java.net/jdk9/dev/nashorn/file/f93753325c7b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/Bootstrap.java#l92>

You’ll notice that Nashorn has a total of 10 linkers - they’re modularized per 
purpose. 

Some of them are internal, that is, they only operate on call sites within 
Nashorn:
- NashornPrimitiveLinker deals with linking java.lang.Number, 
java.lang.Boolean, and java.lang.String objects as if they were JS number, 
boolean, and string primitive values.
- BrowserJSObjectLinker that allows linking of netscape.javascript.JSObject 
objects (should they somehow be passed to Nashorn)
- NashornStaticClassLinker links the NEW operation to enable the “new 
java.lang.Runnable() { … }” anonymous-class style creation of adapters for Java 
interfaces.
- NashornBottomLinker deals with linking missing properties on POJOs as well as 
linking operations on null, mostly supplying language-specific error-raising 
behavior.
- NashornBeansLinker is a bit weird one, as it mostly delegates to ordinary 
BeansLinker, but it deals with some odds and ends, namely allowing 
@FunctionalInterface objects to be linked as JS callables and smoothing over 
the fact that internally we don’t always use java.lang.String for representing 
strings.
- ReflectionCheckLinker is an interesting beastie as it doesn’t link anything 
itself, but can prevent linking Java reflective operations (they are 
specifically disallowed in Nashorn; this is policy due to the fact Nashorn is 
part of the JDK and we’d rather conservatively take that functionality away 
from JS programs than deal with a security risk). 

Then we have those that could be exported:
- NashornLinker obviously, as it’s the primary linker for all native JS 
objects, as well as JSObject linker as it’s the primary linker for exported JS 
objects
- BoundCallableLinker that is a nice example of how you provide linking by 
delegation; it provides linking of bound callables by delegating to the linker 
for the underlying unbound callable, and then re-binding the result of that 
linkage
- JavaSuperAdapterLinker is another delegating example working similarly to the 
previous one; this one handles the Nashorn’s feature for allowing super-calls 
to Java objects from adapters

The first 8 (prioritized) linkers all implement the 
TypeBasedGuardingDynamicLinker interface, meaning the factory will internally 
compose them into a fast (constant time) dispatch-by-receiver-type 
CompositeTypeBasedGuardingDynamicLinker instance; you could have any number of 
those without impacting the linking performance (not that finding the right 
linker is the slow operation usually).

Attila.

Reply via email to