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

Details

    • b25
    • generic
    • generic

    Backports

      Description

        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.

        Attachments

          Issue Links

            Activity

              People

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

                Dates

                  Created:
                  Updated:
                  Resolved: