「なでしこv3」開発掲示板

なでしこ3を改善するための掲示板
[一覧へ] > (@94) [高] [解決]
@94■ (#342) 関数を並行して実行するとおかしい - TKI (2024-10-29 21:47) /低 未処理
以下のプログラムを貯蔵庫でバージョンを変えながら実行したところ、異なる結果になりました
v3.5.1、v3.6.1、v3.6.25で試しました

//-------ここから
●test1():
 xとは変数= 1
 1秒待つ
 xを表示
●test2():
 xとは変数= 2
 1秒待つ
 xを表示

0.1秒後には:
 test1
0.5秒後には:
 test2
//-------ここまで

実行結果
・v3.5.1(期待する動作)
1
2

・v3.6.1
2
2

・v3.6.25
2
undefined
編集

(#343) 検証ありがとうございます - クジラ飛行机 (2024-10-30 19:02) /高 調査中
非同期処理で問題続出ですね。
やはり、非同期かどうかを個別に判断するのは、無理があるので
すべてのユーザー関数を非同期処理として処理するのが解決の近道の気がしてきました。

根っこが先日の報告と同じ問題と思いますので、まとめて処理したいと思います。
https://github.com/kujirahand/nadesiko3/issues/1758
編集

(#344) ローカル変数のスタック - TKI (2024-10-31 21:14) /高 調査中
v3.6.xで、関数に入った時に前のローカル変数をスタックに積み、終了時にスタックから戻す処理が追加されたかと思います

このスタックが1つしかないため「秒待つ」の間に別のイベントが発生するとスタックの整合性がヤバくなります(語彙力なし)

動作確認
//------v3.6.25
0.1秒後には:
 //スタックに積む①
 「A開始」を表示 //1
 1秒待つ
 「A再開」を表示 //3
 //スタックおろす (①ではなく②をおろしている)

0.5秒後には:
 //スタックに積む②
 「B開始」を表示 //2
 1秒待つ //待っている間にAのほうの処理に戻る
 「B再開」を表示 //4
 //スタックおろす
//------
実行結果
A開始
B開始
A再開
B再開


時系列
↓「0.1秒後には」でスタックに積む①
↓「0.5秒後には」でスタックに積む②
↓積んだままAの処理が再開する(ローカル変数がおかしくなる)
↓「0.1秒後には」でスタックおろす(①ではなく②をおろしている)
↓「0.5秒後には」でスタックおろす
編集

(#429) 修正済み - クジラ飛行机 (2026-08-12 11:22) /高 解決
こちらの問題 v3.7.23で確認すると、既に解決しています。
https://github.com/kujirahand/nadesiko3/issues/1758

さらに並行実行終了時のローカル変数復元が修正され(PR #2382、commit df080ca6)、現在の v3.7.23にも含まれています。
報告例そのものが[回帰テスト (line 207)](/Users/kujirahand/repos/nadesiko3/core/test/func_call.mjs:207)になっており、期待結果 1\n2 を確認しています。
編集

✏️ (#342)へ返信する

編集時に使うキーを入力(省略可能)

画像ファイル(最大300KB)を添付可能