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

Nashorn: "duplicate code" assertion when binding a vararg function that just passes arguments along

XMLWordPrintable

    • b25
    • generic
    • generic

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

        ADDITIONAL OS VERSION INFORMATION :
        Microsoft Windows [Version 10.0.14393]

        A DESCRIPTION OF THE PROBLEM :
        If a varargs function that only passes the arguments to another function rather than using them directly is bound after the first time it is called, binding fails with a "duplicate code" assertion if assertions are enabled.

        REGRESSION. Last worked in version 8u121

        ADDITIONAL REGRESSION INFORMATION:
        The code does not assert in version 1.8.0_40; however, that is before the assertion was added, so I do not know if the underlying issue of generating duplicate function specializations is a regression.

        java version "1.8.0_40"
        Java(TM) SE Runtime Environment (build 1.8.0_40-b26)
        Java HotSpot(TM) 64-Bit Server VM (build 25.40-b25, mixed mode)

        STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
        Run the code listed in the "Source code for an executable test case" field with assertions enabled.

        EXPECTED VERSUS ACTUAL BEHAVIOR :
        EXPECTED -
        Only one function specialization should be generated when binding.
        ACTUAL -
        Two identical function specializations were generated, resulting in a "duplicate code" assertion.

        ERROR MESSAGES/STACK TRACES THAT OCCUR :
        Exception in thread "main" java.lang.AssertionError: duplicate code
        at jdk.nashorn.internal.runtime.RecompilableScriptFunctionData.addCode(RecompilableScriptFunctionData.java:831)
        at jdk.nashorn.internal.runtime.RecompilableScriptFunctionData.addCode(RecompilableScriptFunctionData.java:848)
        at jdk.nashorn.internal.runtime.RecompilableScriptFunctionData.getBest(RecompilableScriptFunctionData.java:922)
        at jdk.nashorn.internal.runtime.ScriptFunctionData.getGeneric(ScriptFunctionData.java:384)
        at jdk.nashorn.internal.runtime.ScriptFunctionData.createGenericConstructor(ScriptFunctionData.java:298)
        at jdk.nashorn.internal.runtime.ScriptFunctionData.getGenericConstructor(ScriptFunctionData.java:292)
        at jdk.nashorn.internal.runtime.ScriptFunctionData.makeBoundFunctionData(ScriptFunctionData.java:429)
        at jdk.nashorn.internal.runtime.ScriptFunction.createBound(ScriptFunction.java:392)
        at jdk.nashorn.internal.runtime.linker.Bootstrap.bindCallable(Bootstrap.java:384)
        at jdk.nashorn.internal.objects.NativeFunction.bind(NativeFunction.java:219)
        at jdk.nashorn.internal.scripts.Script$\^eval\_.:program(<eval>:8)
        at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:637)
        at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:494)
        at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:393)
        at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:449)
        at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:406)
        at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:402)
        at jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:155)
        at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264)
        at BindErrorTest.main(BindErrorTest.java:7)


        REPRODUCIBILITY :
        This bug can be reproduced always.

        ---------- BEGIN SOURCE ----------
        import javax.script.ScriptEngine;
        import javax.script.ScriptEngineManager;

        public class BindErrorTest {
            public static void main(String[] args) throws Exception {
                ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
                engine.eval("var fn2 = function () {};\n" +
                        "\n" +
                        "var fn = function () {\n" +
                        " fn2.apply(null, arguments);\n" +
                        "};\n" +
                        "\n" +
                        "fn();\n" +
                        "fn.bind();\n");
            }
        }
        ---------- END SOURCE ----------

        CUSTOMER SUBMITTED WORKAROUND :
        Create a new function that calls the desired function with the correct "this" and arguments instead of binding. Alternatively, don't enable assertions.

              hannesw Hannes Wallnoefer
              webbuggrp Webbug Group
              Votes:
              0 Vote for this issue
              Watchers:
              4 Start watching this issue

                Created:
                Updated:
                Resolved: