Serialization of javascript lambdas

Tristan Tarrant ttarrant at redhat.com
Tue Jun 28 08:29:48 UTC 2016


Yes, I don't expect them to be serializable, but just allow me to 
identify them.
Is there a way to intercept the generation of the MethodHandle so that 
it can be "decorated" with the original ScriptFunction ?

Under what circumstances would the ScriptFunctionData.needsCallee() be 
triggered ?

Tristan

On 28/06/16 06:31, Sundararajan Athijegannathan wrote:
> No, none of the nashorn objects are Serializable and that is by design!
> As you've found out, Nashorn objects are too 'tied' to the current
> execution state - in which most of the objects are not Serializable.
>
> -Sundar
>
>
> On 6/27/2016 8:56 PM, Tristan Tarrant wrote:
>> 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
>>
>

-- 
Tristan Tarrant
Infinispan Lead
JBoss, a division of Red Hat


More information about the nashorn-dev mailing list