Nashornエンジンで何らかのバグが発生する可能性があるような問題が発生しましたが、それを実証するテストケースを抽出する良い方法を見つけることはできません。NashornでReferenceErrorを追跡する方法
私は、コードのブロックしているおおよそ次のようになりた:残念ながら、jss --language=es6 -strict
でこの例を実行するとクラッシュしない
'use strict';
function Dummy() {
this.val = 'I am fubar';
this.aContainer = [];
}
Dummy.prototype.toString = function() { return JSON.stringify(this);};
let obj = {};
obj.aMethod = function(arg) {
let fubar = new Dummy();
print('Okay so far');
fubar.aContainer.push({"some":"thing"});
print('Still okay');
fubar.aContainer.push({"==": [{"var": "something_else"}, fubar.val]});
return fubar;
};
print(obj.aMethod(null));
(働いていました!)。次のように私は、コードを変更した場合
jdk.nashorn.internal.runtime.ECMAException: ReferenceError: "fubar" is not defined
が、それがうまく実行されます:私は楽器にしようとする何かできることは
'use strict';
function Dummy() {
this.val = 'I am fubar';
this.aContainer = [];
}
Dummy.prototype.toString = function() { return JSON.stringify(this);};
let obj = {};
obj.aMethod = function(arg) {
let fubar = new Dummy();
print('Okay so far');
fubar.aContainer.push({"some":"thing"});
print('Still okay');
let x = fubar.val;
fubar.aContainer.push({"==": [{"var": "something_else"}, x]});
return fubar;
};
print(obj.aMethod(null));
ありますが、私の実際のコードでは、私は次の取得します実際のコードをさらに進めるか、そうでなければこの問題を追跡しますか?奇妙なことは、エラーは実行の非常に早い段階で起こることです。メソッドのどこにでもprint()呼び出しを置くと、決して印刷には到達しません。コールスタック内の私のコードの最後の行は、実際にはメソッドを呼び出す行です。
私は、自動更新によって新しいバージョンのJavaを選択しましたが、このコードがその下で実行されているかどうかを確認する必要があります。コンソールからの私の現在のバージョンは次のとおりです。
jdk8u-dev/nashorn/file/tip/docs/DEVELOPER_README
それは内部で使用されるシステム・プロパティについて説明します。
➜ ~ java -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)
Javaバージョン「1.8.0_121」で最初のコードを問題なく実行しました。これは出力です: '{" val ":"私はfubar "、" aContainer ":[{" some ":" thing "}、{" == ":[{" var ":" something_else "}、私はfubarです "]}]}'。あなたはどのようにエンジンを工場から手に入れますか?これは私がそれを得る方法です:\t \t \t 'NashornScriptEngineFactory factory = new NashornScriptEngineFactory(); ScriptEngine engine = \t factory.getScriptEngine(new String [] {"--language = es6"}); ' – Aris2World
ありがとうございました。残念ながら、私は問題を示す簡単な事例を作成できませんでした。これは、特定のメソッド呼び出しやプロパティセットが作成されたときに、アプリケーションのメモリ使用量によって変数が収集されたり、不適切に持ち上げられたりすると考えられます。変数を新しいインスタンスにコピーすることは不適切な処理を避けているようですが、Nashornチームと関連情報を共有する方法を理解しようとしています。 – deinspanjer
トレースを有効にしようとしましたか?こちらを参照してくださいhttps://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions#Nashornextensions-callsite_tracing – Aris2World