2017-07-14 1 views
3

Quand j'appelle eval (en mode strict) sur un moteur nashorn avec le script suivant je reçois une exception:Pourquoi le moteur Nashorn de Java 8 en mode strict lance-t-il une exception java.lang.ClassCastException lors de l'appel de apply() et en passant directement l'objet arguments?

var yfunc = function() { 
    (null).apply(null, arguments); 
}; 
yfunc(); 

J'ai tronqué ma situation personnelle lourdement. Le "(null)" sur la ligne 2 peut être remplacé par quelque chose entre parenthèses ou une variable locale, de toute façon quelque chose qui ne devrait pas jeter une erreur de compilation, et il donnera le même résultat.

Le problème semble être explicitement que «arguments» est passé directement comme le deuxième argument de l'appel d'une méthode appelée «appliquer». Tout des modifications suivantes annuler la jetée exception:

  1. Mettre « arguments » dans une première variable
  2. appel autre chose que d'appliquer
  3. Passing (mais envelopper simplement entre parenthèses ne fonctionne pas!) "arguments" dans un argument différent lors de l'appel.
  4. Appeler print() (avec ou sans passer d'arguments) comme une ligne de code précédente dans yfunc() (étrange hein?)
  5. Définir plus de 0 paramètres pour yfunc()
  6. Reliure yfunc d'abord, puis d'appeler la méthode liée
  7. Appel yfunc via Function.apply

L'exception est cette jetée (pas tellement avec Function.call!):

Exception in thread "main" java.lang.ClassCastException: Cannot cast jdk.nashorn.internal.runtime.Undefined to jdk.nashorn.internal.runtime.ScriptFunction 
at java.lang.invoke.MethodHandleImpl.newClassCastException(MethodHandleImpl.java:361) 
at java.lang.invoke.MethodHandleImpl.castReference(MethodHandleImpl.java:356) 
at jdk.nashorn.internal.scripts.Script$\^eval\_.:program(<eval>:4) 
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) 

Quand je appelez cette méthode avec un propriétaire, l'exception lancée est modifiée. Exemple de code:

var yfunc = { 
    method: function() { 
      (null).apply(null, arguments); 
    } 
}; 
var x = yfunc.method(); 

Puis l'exception jetée ressemble à ceci:

Exception in thread "main" java.lang.ClassCastException: Cannot cast jdk.nashorn.internal.scripts.JO4 to jdk.nashorn.internal.runtime.ScriptFunction 
at java.lang.invoke.MethodHandleImpl.newClassCastException(MethodHandleImpl.java:361) 
at java.lang.invoke.MethodHandleImpl.castReference(MethodHandleImpl.java:356) 
at jdk.nashorn.internal.scripts.Script$\^eval\_.:program(<eval>:5) 
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) 

J'ai reproduit la question jusqu'à présent sur spécifiquement ces environnements:

  • windows 7 64bits -> jdk 1.8.0_60 64bit
  • fenêtres 8 64bit -> jdk 1.8.0_131 64bit

Je n'arrive pas à trouver quelque chose sur Internet sur des problèmes similaires. Ai-je besoin de signaler ceci à Oracle/OpenJDK?

Mise à jour mineure

articles 6 et 7 Ajouté à la liste des « modifications suivantes annule l'exception lancée ».

mise à jour finale

Bug déposé: JDK-8184720

Répondre

2

Oui, il semble y avoir un bug. S'il vous plaît déposer un bug.