I think you can do something like this:

import javax.script.*;
import jdk.nashorn.api.scripting.JSObject;

public class Main {
  public static void main(String[] args) throws Exception {
     ScriptEngineManager m = new ScriptEngineManager();
     ScriptEngine e = m.getEngineByName("nashorn");
     JSObject global = (JSObject) e.eval("this");
     Object undefined = global.getMember("undefined");
     System.out.println(undefined);
  }
}

Thanks,
-Sundar

On 28/08/17, 10:03 PM, Jesse Schulman wrote:
Awesome, thanks for the quick response!

On a somewhat related note, what is the proper way of returning 'undefined' from a JSObject implementation? I have seen it work various ways but when I have tested our application on the jdk9 beta releases I have had to take a different approach than Undefined.getUndefined() or ScriptRuntime.UNDEFINED since as you mention in that bug report the internal package cannot be accessed.

Thanks again,
Jesse

On Sun, Aug 27, 2017 at 9:59 PM Sundararajan Athijegannathan <sundararajan.athijegannat...@oracle.com <mailto:sundararajan.athijegannat...@oracle.com>> wrote:

    Hi,

    Thanks for the standalone test case! I reproduced the issue and
    filed a bug -> https://bugs.openjdk.java.net/browse/JDK-8186807

    Thanks,
    -Sundar


    On 24/08/17, 11:11 PM, Jesse Schulman wrote:
    The type is ScriptFunction, I've created a simple reproducer that
    I've pushed to
    https://github.com/jesseschulman/JSObject_gets_ScriptFunction
    <https://github.com/jesseschulman/JSObject_gets_ScriptFunction.git>

    Thanks!
    Jesse

    On Thu, Aug 24, 2017 at 1:05 AM Sundararajan Athijegannathan
    <sundararajan.athijegannat...@oracle.com
    <mailto:sundararajan.athijegannat...@oracle.com>> wrote:

        what is the type of args[0]? Can you print args[0].getClass()
        to check it?

        Thanks,
        -Sundar


        On 24/08/17, 9:14 AM, Jesse Schulman wrote:
        I did try running with -Dnashorn.apply2call=false when I saw
        the email for that fix but it did not resolve the issue.

        There is no exception thrown, but our JSObject.call method
        basically is no-op as a result of not getting a
        ScriptObjectMirror, it effectively looks like this:

                @Override
                public Object call(Object thiz, Object ... args) {
                    if (args.length < 2 || !(args[0] instanceof
        ScriptObjectMirror) || !((ScriptObjectMirror)
        args[0]).isFunction() || !(args[1] instanceof Integer))
                        return gScriptEnvironment.getUndefined();

                    // safely cast and call ScriptObjectMirror...
               }


        I am continuing to work on reproducing it outside our
        application in a simple way.  In the mean time if there's
        any other information I can share besides a reproducing
        example, or suggestions on workarounds to try let me know.

        Thanks!
        Jesse

        On Wed, Aug 23, 2017 at 7:10 PM Sundararajan Athijegannathan
        <sundararajan.athijegannat...@oracle.com
        <mailto:sundararajan.athijegannat...@oracle.com>> wrote:

            Hi,

            Sorry for the delayed response. We need more info to
            debug this - in
            particular, what is the exception (if any) thrown etc.

            I wonder if this is related to this recent apply-related
            fix ->

            
http://mail.openjdk.java.net/pipermail/nashorn-dev/2017-August/006998.html

            -Sundar

            On 22/08/17, 3:43 AM, Jesse Schulman wrote:
            > This does not happen on the first run of the code but
            is consistently
            > happening on the 17th run after a restart and from
            that point forward is
            > broken until we restart.
            >
            > Attached is a broken and working call stack.
            >
            > I have tried to replicate what we are doing in a basic
            java reproducer but
            > have not been able to do so, given that I can
            consistently reproduce this
            > locally I am happy to take any suggested steps to
            gather more information
            > or to workaround/resolve the issue.
            >
            > Environment:
            > Java version 1.8.144
            > Engine created with "--no-java", "-strict",
            "--no-syntax-extensions",
            > "--language=es6", "--optimistic-types=true"  (also
            tried with
            > optimistic-types=false)
            > All evaluation done on the same engine via
            engine.eval(String, Bindings)
            > using a Bindings that was returned from
            engine.createBindings, each of the
            > "runs" described above took place in a different
            Bindings instance
            >
            > Thanks!
            > Jesse

Reply via email to