aiscript
aiscript copied to clipboard
enhance: add callstack
What
インタプリタのエラーにコールスタックを追加。 posと違って機械的に抽出する需要がなさそうなのでmessageに追加するのみとしました。
以下のソースを実行すると
@function1() { a }
@function2() {
[0].map(@() {
function1()
})
}
@function3() { function2() }
function3()
このようなエラーになります。
Runtime: No such variable 'a' in scope '<anonymous>'
at function1 (Line 1, Column 16)
at <anonymous> (Line 4, Column 14)
at <native>
at function2 (Line 3, Column 10)
at function3 (Line 7, Column 25)
at <root> (Line 8, Column 10)
Why
Close #807
Additional info (optional)
~~関数の値(VFn型)に関数名がないので、callノードのcalleeを参照して変数名を表示しています。~~
~~callee.typeが'identifier'か'prop'ならそのnameを参照、それ以外のときは<anonymous>としましたが、これは匿名関数とは限らないので別の方法があれば変えたい。~~
VUserFn型に関数名を追加しました。
関数が(Promise.allによって)非同期的に呼ばれるためグローバルにコールスタックを持てないので、すべての箇所で引数で渡しています。
nativeな関数のcallはそのまま引き継ぎ、topCallはコールスタックを引き継がないようにしましたが、せっかく引数で渡しているので、topCallを挟んでいることをわかるようにしたうえで引き継いだほうが良いかも。
nativeな関数の呼び出しは、今のところ全て<native>と表示されます
:warning: Please install the to ensure uploads and comments are reliably processed by Codecov.
Codecov Report
Attention: Patch coverage is 99.31507% with 1 line in your changes missing coverage. Please review.
| Files with missing lines | Patch % | Lines |
|---|---|---|
| src/interpreter/index.ts | 99.29% | 1 Missing :warning: |
:exclamation: Your organization needs to install the Codecov GitHub app to enable full functionality.
| Files with missing lines | Coverage Δ | |
|---|---|---|
| src/interpreter/scope.ts | 93.69% <100.00%> (+3.15%) |
:arrow_up: |
| src/interpreter/value.ts | 100.00% <ø> (ø) |
|
| src/interpreter/index.ts | 93.98% <99.29%> (+8.17%) |
:arrow_up: |
「エラーが発生した処理の行番号」と「その処理が含まれる関数名」を各行に出す方が一般的なように思います。
例
Runtime: No such variable 'a' in scope 'function1' (Line 1, Column 16)
at <anonymous> (Line 4, Column 14)
at function2 (Line 3, Column 10)
at function3 (Line 7, Column 25)
at <global> (Line 8, Column 10)
関数値に名前を持たせる方がいいかも?
VUserFn型のnameで関数名を持つようにしてそれを使用するようにしました。
関数名とその関数内で関数呼び出しした位置をあわせて表示するようにしました。
nativeな関数の呼び出しも見えるようになりました(今のところ全て<native>と表示されます)
今のところ名前空間の情報は消えるんですがあったほうがいいですかね?
「エラーが発生した処理の行番号」と「その処理が含まれる関数名」を各行に出す方が一般的なように思います。
一旦これ実装してみたんですが、エラーが発生した関数名が消えるんですよね。
例として使ったのが参照のエラーだったので、今実装されてないながらスコープ名があるので実装すればいいですけど、Arr:create(-1)とかにしてみると一見<anonymous>関数内で起きているように見えます。
エラーの位置も一行目じゃなくてコールスタックに移せば解決はしそう?
Runtime: Arr:create expected non-negative number, got negative (Line 1, Column 26)
at <anonymous> (Line 4, Column 14)
at <native>
at function2 (Line 3, Column 10)
at function3 (Line 7, Column 25)
at <root> (Line 8, Column 10)
エラーが発生した関数名が消える問題があったので、一行目から位置情報を消してコールスタックに追加しました。
今のところ名前空間の情報は消えるんですがあったほうがいいですかね?
ScopeのnsNameが名前を持ってるようなのでparentをたどって:で繋げれば反映できると思います。
https://github.com/aiscript-dev/aiscript/blob/7a96bcf8387a1c88b3dfd199dfd46382b8c3313d/src/interpreter/scope.ts#L117
名前空間対応しました。
このPRの主旨からは外れますが、
関数が名前を保持するようになるのでScopeのnameに渡してあげるとメッセージがより分かりやすくなるかもしれません。
https://github.com/aiscript-dev/aiscript/blob/7a96bcf8387a1c88b3dfd199dfd46382b8c3313d/src/interpreter/scope.ts#L17-L22
このPRの主旨からは外れますが、 関数が名前を保持するようになるので
Scopeのnameに渡してあげるとメッセージがより分かりやすくなるかもしれません。
現状のコードだとfn以外の構文のcreateChildScopeでスコープ名が引き継がれないようなので余計に混乱するかなと思います。 別PRで直しますかね?
現状のコードだとfn以外の構文のcreateChildScopeでスコープ名が引き継がれないようなので余計に混乱するかなと思います。 別PRで直しますかね?
やるかどうかも含めてまた別の機会でいいと思います