aiscript icon indicating copy to clipboard operation
aiscript copied to clipboard

enhance: add callstack

Open uzmoi opened this issue 1 year ago • 11 comments
trafficstars

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>と表示されます

uzmoi avatar Oct 13 '24 10:10 uzmoi

:warning: Please install the 'codecov app svg image' 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:

... and 27 files with indirect coverage changes

codecov-commenter avatar Oct 13 '24 10:10 codecov-commenter

「エラーが発生した処理の行番号」と「その処理が含まれる関数名」を各行に出す方が一般的なように思います。

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)

salano-ym avatar Oct 13 '24 18:10 salano-ym

関数値に名前を持たせる方がいいかも?

salano-ym avatar Oct 13 '24 18:10 salano-ym

VUserFn型のnameで関数名を持つようにしてそれを使用するようにしました。 関数名とその関数内で関数呼び出しした位置をあわせて表示するようにしました。 nativeな関数の呼び出しも見えるようになりました(今のところ全て<native>と表示されます)

今のところ名前空間の情報は消えるんですがあったほうがいいですかね?

uzmoi avatar Oct 15 '24 14:10 uzmoi

「エラーが発生した処理の行番号」と「その処理が含まれる関数名」を各行に出す方が一般的なように思います。

一旦これ実装してみたんですが、エラーが発生した関数名が消えるんですよね。 例として使ったのが参照のエラーだったので、今実装されてないながらスコープ名があるので実装すればいいですけど、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)

uzmoi avatar Oct 15 '24 14:10 uzmoi

エラーが発生した関数名が消える問題があったので、一行目から位置情報を消してコールスタックに追加しました。

uzmoi avatar Oct 15 '24 15:10 uzmoi

今のところ名前空間の情報は消えるんですがあったほうがいいですかね?

ScopensNameが名前を持ってるようなのでparentをたどって:で繋げれば反映できると思います。

https://github.com/aiscript-dev/aiscript/blob/7a96bcf8387a1c88b3dfd199dfd46382b8c3313d/src/interpreter/scope.ts#L117

salano-ym avatar Oct 16 '24 17:10 salano-ym

名前空間対応しました。

uzmoi avatar Oct 17 '24 13:10 uzmoi

このPRの主旨からは外れますが、 関数が名前を保持するようになるのでScopenameに渡してあげるとメッセージがより分かりやすくなるかもしれません。 https://github.com/aiscript-dev/aiscript/blob/7a96bcf8387a1c88b3dfd199dfd46382b8c3313d/src/interpreter/scope.ts#L17-L22

salano-ym avatar Oct 17 '24 14:10 salano-ym

このPRの主旨からは外れますが、 関数が名前を保持するようになるのでScopenameに渡してあげるとメッセージがより分かりやすくなるかもしれません。

現状のコードだとfn以外の構文のcreateChildScopeでスコープ名が引き継がれないようなので余計に混乱するかなと思います。 別PRで直しますかね?

uzmoi avatar Oct 17 '24 14:10 uzmoi

現状のコードだとfn以外の構文のcreateChildScopeでスコープ名が引き継がれないようなので余計に混乱するかなと思います。 別PRで直しますかね?

やるかどうかも含めてまた別の機会でいいと思います

salano-ym avatar Oct 17 '24 15:10 salano-ym