以下の問題が発生しました(以下に簡単な例を示します)。これはバグでしょうか、それとも何か見落としているのでしょうか?
(Windows 11、JMP 18.0)
次のスクリプトは、単にエラーをスローするのではなく、JMP をクラッシュさせます。
Names Default To Here(1);
f = Function( {}, { sub_f },
sub_f = Function( {},
If( 1, Throw( "thrown", 1 ) );
Return( "ok" )
);
Return( sub_f() )
);
f()
上記とは対照的に、トレースバック フラグがない場合、通常は「thrown」エラーがスローされます。
Names Default To Here(1);
f = Function( {}, { sub_f },
sub_f = Function( {},
If( 1, Throw( "thrown" ) );
Return( "ok" )
);
Return( sub_f() )
);
f()
また、Return() を Try() にトラップすることでクラッシュを防止します。
Names Default To Here(1);
f = Function( {}, { sub_f },
sub_f = Function( {},
If( 1, Throw( "thrown", 1 ) );
Return( "ok" )
);
Try( Return( sub_f() ), Throw( "crash prevented" ) )
);
f()
JMPのバグを発見しました。このスレッドを報告します。sub_fのローカル変数をコメントアウトすることで回避できます。
f = Function( {}, // { sub_f },
(これはかなり正しい説明だと思いますが…)JMPがthrow()をキャッチする頃には、ローカル変数は破棄されており、トレースバックの情報は失われています。トレースバックを生成するコードはこれに対応しておらず、無効なメモリ参照でクラッシュします。関数内にtry()を追加した場合、JMPは関数内でthrowをキャッチするため、ローカル変数は破棄されません。あるいは、関数をグローバル変数に保持するだけでも動作します。
編集: TS-00250890