Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8050977

Java8 Javascript Nashorn exception: no current Global instance for nashorn

XMLWordPrintable

    • b12
    • generic
    • generic

        FULL PRODUCT VERSION :
        java version "1.8.0_11"
        Java(TM) SE Runtime Environment (build 1.8.0_11-b12)
        Java HotSpot(TM) 64-Bit Server VM (build 25.11-b03, mixed mode)

        ADDITIONAL OS VERSION INFORMATION :
        Microsoft Windows [Version 6.1.7601]

        A DESCRIPTION OF THE PROBLEM :
        Initially i added this here:
        http://stackoverflow.com/questions/24784792/java8-javascript-nashorn-exception-no-current-global-instance-for-nashorn

        I want to retrieve object generated in JS store them in Java and later call methods on them.
        This worked with Java 7, now with Java 8 i get an exception:

            Exception in thread "main" java.lang.IllegalArgumentException: no current Global instance for nashorn
             at jdk.nashorn.api.scripting.NashornScriptEngine.invokeImpl(NashornScriptEngine.java:492)
        at jdk.nashorn.api.scripting.NashornScriptEngine.invokeMethod(NashornScriptEngine.java:238)

        I have modified the official example from here http://docs.oracle.com/javase/8/docs/technotes/guides/scripting/prog_guide/api.html a bit.

        Now i created a minimal example to produce this exception.
        It seems like, if a JS object is passed to Java via return value, it is different to the case JS calls a Java object's method and passes the object.

            public class InvokeScriptMethod {

        static Object o1;

        public static class Context {
        public void add( Object o ){
        InvokeScriptMethod.o1 = o;
             }
        }
            
             public static void main(String[] args) throws Exception {
                    ScriptEngineManager manager = new ScriptEngineManager();
                    ScriptEngine engine = manager.getEngineByName("nashorn");

                    engine.put("ctx", new Context());

                    engine.eval("function bla(){\n"
                     + "var obj = new Object();\n"
                 + "obj.var1 = 3;\n"
                 + "obj.hello = function(name) { print('Hello, ' + this.var1 + ' ' + name); this.var1++; };\n"
                     + "ctx.add(obj);\n"
                     + "return obj;\n"
                     + "}");

                    Invocable inv = (Invocable) engine;
                
                    Object obj = inv.invokeFunction("bla");
                
                    System.out.printf("retrieved as return value : %s %s\n", obj.getClass(), obj);
                    System.out.printf("retrieved via call to java object: %s %s\n", o1.getClass(), o1);

                    inv.invokeMethod(obj, "hello", "Script Method!");
                    inv.invokeMethod(o1, "hello", "Script Method!"); // <-- exception
                }
            }

        program output:

            retrieved as return value : class jdk.nashorn.api.scripting.ScriptObjectMirror [object Object]
            retrieved via call to java object: class jdk.nashorn.internal.scripts.JO jdk.nashorn.internal.scripts.JO@105fece7
            Hello, 3 Script Method!
            Exception in thread "main" java.lang.IllegalArgumentException: no current Global instance for nashorn

        obj is a ScriptObjectMirror as it is expected, o1 is an internal object.
        http://cr.openjdk.java.net/~sundar/8023631/webrev.00/src/jdk/nashorn/api/scripting/NashornScriptEngine.java.html line 481 shows how this exception is thrown.
        So I think, there is something wrong by wrapping the "naked" JS object into a ScriptObjectMirror when passing as argument to Java.



        REGRESSION. Last worked in version 7u10

        ADDITIONAL REGRESSION INFORMATION:
        java version "1.7.0_06"
        Java(TM) SE Runtime Environment (build 1.7.0_06-b24)
        Java HotSpot(TM) 64-Bit Server VM (build 23.2-b09, mixed mode)

        STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
        run example code

        EXPECTED VERSUS ACTUAL BEHAVIOR :
        EXPECTED -
        no exception
        ACTUAL -
        exception thrown

        ERROR MESSAGES/STACK TRACES THAT OCCUR :
        no current Global instance for nashorn

        REPRODUCIBILITY :
        This bug can be reproduced always.

        ---------- BEGIN SOURCE ----------
           public class InvokeScriptMethod {

        static Object o1;

        public static class Context {
        public void add( Object o ){
        InvokeScriptMethod.o1 = o;
             }
        }
            
             public static void main(String[] args) throws Exception {
                    ScriptEngineManager manager = new ScriptEngineManager();
                    ScriptEngine engine = manager.getEngineByName("nashorn");

                    engine.put("ctx", new Context());

                    engine.eval("function bla(){\n"
                     + "var obj = new Object();\n"
                 + "obj.var1 = 3;\n"
                 + "obj.hello = function(name) { print('Hello, ' + this.var1 + ' ' + name); this.var1++; };\n"
                     + "ctx.add(obj);\n"
                     + "return obj;\n"
                     + "}");

                    Invocable inv = (Invocable) engine;
                
                    Object obj = inv.invokeFunction("bla");
                
                    System.out.printf("retrieved as return value : %s %s\n", obj.getClass(), obj);
                    System.out.printf("retrieved via call to java object: %s %s\n", o1.getClass(), o1);

                    inv.invokeMethod(obj, "hello", "Script Method!");
                    inv.invokeMethod(o1, "hello", "Script Method!"); // <-- exception
                }
            }

        ---------- END SOURCE ----------

              sundar Sundararajan Athijegannathan
              webbuggrp Webbug Group
              Votes:
              0 Vote for this issue
              Watchers:
              4 Start watching this issue

                Created:
                Updated:
                Resolved: