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

Nashorn Engine - Object.keys throws an TypeError exception "is not an Object"

XMLWordPrintable

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

      ADDITIONAL OS VERSION INFORMATION :
      Windows 8.1 pro - 64 Bit (Microsoft Windows [Version 6.3.9600])

      A DESCRIPTION OF THE PROBLEM :
      i returned a java bean from an javascript called java function.
      on this returned object i called "Object.keys" and an TypeError will be thrown

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      In the log one row will be displayed before the exception was thown:

      bar



      ACTUAL -
      bar
      object

      ERROR MESSAGES/STACK TRACES THAT OCCUR :
      bar
      Exception in thread "main" javax.script.ScriptException: TypeError: Main$MyObject@a1153bc is not an Object in <eval> at line number 6
      at jdk.nashorn.api.scripting.NashornScriptEngine.throwAsScriptException(NashornScriptEngine.java:467)
      at jdk.nashorn.api.scripting.NashornScriptEngine.invokeImpl(NashornScriptEngine.java:389)
      at jdk.nashorn.api.scripting.NashornScriptEngine.invokeFunction(NashornScriptEngine.java:190)
      at Main.main(Main.java:92)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:497)
      at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
      Caused by: <eval>:6 TypeError: Main$MyObject@a1153bc is not an Object
      at jdk.nashorn.internal.runtime.ECMAErrors.error(ECMAErrors.java:57)
      at jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:213)
      at jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:185)
      at jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:172)
      at jdk.nashorn.internal.objects.NativeObject.notAnObject(NativeObject.java:136)
      at jdk.nashorn.internal.objects.NativeObject.keys(NativeObject.java:439)
      at jdk.nashorn.internal.scripts.Script$Recompilation$1$17$\^eval\_.main(<eval>:6)
      at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:640)
      at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:228)
      at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:393)
      at jdk.nashorn.api.scripting.ScriptObjectMirror.callMember(ScriptObjectMirror.java:199)
      at jdk.nashorn.api.scripting.NashornScriptEngine.invokeImpl(NashornScriptEngine.java:383)
      ... 7 more

      Process finished with exit code 1


      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      Here is the Code:
      ==================== Java Start ====================
      public class Main {
          public static void main(String [ ] args) throws ScriptException, NoSuchMethodException {
              ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
              engine.eval(new BufferedReader(new InputStreamReader(Main.class.getResourceAsStream("/test.js"))));
              Invocable invocable = (Invocable) engine;
              invocable.invokeFunction("main");
          }

          public static MyObject getMyObject() {
              return new MyObject("bar");
          }

          public static class MyObject {
              private String foo;
              public MyObject(String foo) {
                  this.foo = foo;
              }
              public String getFoo() {
                  return foo;
              }
          }
      }
      ==================== Java End =====================

      ============= JavaScript (test.js) Start ====================
      function main () {
          var MyJavaClass = Java.type('Main');
          var test = MyJavaClass.getMyObject();
          print(test.foo);
          print(typeof Object.keys(test));
      }
      ============= JavaScript (test.js) End ====================
      ---------- END SOURCE ----------

        1. JI9033171.java
          0.9 kB
        2. mytest.js
          0.2 kB

            jlaskey Jim Laskey
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: