Hi all,

I've been playing with Nashorn in combination with the Streams API in the context of being able to run functions in a distributed environment (i.e. Infinispan's server-side scripting).

In plain Java, a lambda has a SerializedLambda form which basically encapsulates all of the coordinates that allow the recreation of a MethodHandle on the remote side. This obviously assumes that the remote classloader has access to the exact same bytecode.

Nashorn lambdas however do not (or cannot?) have a SerializedLambda representation, so I'm looking for an alternative way to identify them.

Consider the following snippet which is a (dumb) example:

map.entrySet().stream().map(function(e) e.getValue())

On the Java side, the map method takes a Function parameter. Inspecting the parameter I see that Nashorn has created an adapter class at runtime (jdk.nashorn.javaadapters.java.util.function.Function) and that the apply() method of that class is a BoundMethodHandle$Species_LL. Unfortunately there is no reference to the original ScriptFunction, which would otherwise allow me to invoke toSource() on it, simply serialize that string, send it to the remote node, compile it and invoke it.

Inspecting further I've understood that anonymous javascript functions get bound to method handles identified by a name in the form of L:x where "x" looks like a counter. Compiling the same script on multiple nodes, the identifier is consistent, however I've found no way to invoke those methodhandles on the remote nodes. I've noticed that it's possible to get the ScriptFunction passed as a parameter (needsCallee), but I haven't understood how to do that.

So my question is: given a Nashorn Java adapter generated from a ScriptFunction, is there a way for me to identify the ScriptFunction it originates from and to invoke that same function "by name" on a remote node which has the same script ?

Thanks

Tristan

Reply via email to