2011-08-09 6 views
6

Rhinoがjavax.script.ScriptEngine API経由でRhinoを実行しているときにRhinoが"Encountered code generation error while compiling script: generated bytecode for method exceeds 64K limit"例外をスローする問題に取り掛かりました。受け入れられた解決策は、sun.org.mozilla.javascript.ContextsetOptimizationLevel(-1)を呼び出すように見えます。Java 6でRhinoScriptEngineの最適化レベルを設定することはできますか?

残念ながら、ContextFactoryによって作成されたContextにアクセスできないようです。私はをContextFactory.getGlobal()に追加しようとしましたが、それは作成後にContextを変更しますが、リスナーが呼び出されることはありません。私はまた、RhinoScriptEngine source from Java 6を見て、ContextFactoryが最適化レベルの値を決定するために読み込むプロパティを設定できるかどうかを確認しました。私の知る限りrhino.opt.levelプロパティを使用して最適化レベルを設定することが可能となり、デフォルトによって-1に最適化レベルを設定しRhinoScriptEngine、Javaの7に、言うことができるように

Java 7 versionmakeContext()メソッドとJava 6 versionmakeContext()メソッドを比較して、どういう意味かを確認してください。

私の知る限りでは、in this example of using Rhino to run the CoffeeScript compilerのようにRhinoを直接実行することをお勧めします。ご覧のとおり、コードはかなり複雑ですので、可能であればjavax.script.ScriptEngine APIを使用してJava 6をサポートしていきたいと思います。他のオプションはありますか?

+0

もう一つのオプションに設定することはできませんJDK6とそれを束ねるために除外されているcom.sun.scriptからすべてのコードをコピーすることです。 javascriptパッケージを新しいパッケージ(あるいは、パッケージプライベートメンバにアクセスするために名前を変更したクラスを持つものと同じもの)にコピーし、makeContext()の実装を変更して最適化レベルを設定します。 – bolinfest

+0

私は同じ問題に遭遇しました。 JDK8の「Nashorn」はより高度なJSエンジンであり、Nashornは64Kの問題を解決することができます。 –

答えて

2

、:http://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html#jsengine

それは言う:

いくつかのコンポーネントが原因フットプリントとセキュリティ上の理由に除外されています:

  1. JavaScriptの-へ(「オプティマイザ」とも呼ばれる)バイトコードのコンパイル。この の機能は、クラス生成ライブラリによって異なります。この の機能を削除すると、JavaScriptは常にと解釈されます。 オプティマイザはトランスペアレントであるため、この機能の削除はスクリプト実行に影響しません。

オプティマイザクラスは、したがって、最適化レベルは、Java 6

+0

しかしISN OPの最適化レベル-1に相当するものは何ですか?確かにコード生成のコンパイルエラーは、常にJava 6で解釈されるべきではありません。 – bacar

1

私は6で動作しており、デフォルトでは-1に設定されているようです。または、むしろ、sun.org.mozilla.javascript.internal.optimizer.Codegenがクラスパス上にない場合、-1に設定されます。マニュアルに従って

+0

うーん、一つの問題は、私はOpenJDKの使用しているということがあります $のJava -version Javaのバージョン "1.6.0_22" OpenJDKのランタイム環境(IcedTea6 1.10.2)(6b22-1.10.2-0ubuntu1〜11.04.1 ) OpenJDK 64ビットサーバーVM(ビルド20。0-b11、混合モード) Sun JDKにはRhinoのいくつかの違いがあるようです。 我々は物事が私のプロジェクトのために、両方のJDK上で動作するように取得するにはかなり奇妙なことをしなければならなかった、plovr: http://code.google.com/p/plovr/source/detail?r=7e3cad7f1b9d – bolinfest

関連する問題