仮引数リストと実引数リストについて脱線する前に、現在の問題は、派生型を返す関数がモジュールに正しく保存されていないことに関係していました。派生型はインターフェイスに似ているようです。それらは他の名前空間に存在する可能性があり、保存する必要があります。解決策は、USE ステートメントの後に、他の名前空間のシンボルを名前空間のプライベート シンボルとして復元できるという点で、インターフェイスとほぼ同じです。
しかし、私はいくつかの粗悪品に脇道に追いやられました。モジュールの最近のオーバーホールの目的の 1 つは、モジュールの保存中に必要な二重トラバーサルを取り除くことでした。これらのトラバーサルは同じシンボルを見る必要があり、不必要でエラーが発生しやすかった. モジュールの作成時にモジュールのシリアル番号を-1に初期化することで、それを取り除きました。また、動的に割り当てられた配列を取り除く「書き込み済み」ビットフィールドを g95_symbol 構造体に追加しました。g95_new_symbol() 内でこれらを初期化することから逃れることができます。これは、シンボルはその存続期間中に 1 回しか書き込むことができないためです。
また、モジュールをロードする新しい方法もあります。ここで、シンボル テーブルをトラバースし、書き込む必要のあるシンボルを書き込みます。mio_symbol_ref() が変更され、以前に参照されていないシンボルが参照されると、新しいシンボルがスタックに置かれるようになりました。トラバーサルが完了したら、ループしてスタックの一番下をポップし、シンボルを書き込みます。これにより、後で書き込まれる他のシンボルが参照される可能性があります。スタックが空の場合、すべてがモジュールにあるはずです。
モジュールのフォーマットもわずかに変更されました。モジュール内のシンボル数がカウントされなくなりました。読み取りサブルーチンは、新しいシンボルのテーブルを設定する前に、最大のシンボル番号を把握する必要があります。追加するのは大したことではありません。
これらの変更をテストしようとしたとき、調査したいモジュールを生成したソース ファイルは何かという問題に遭遇しました。この種のものはモジュール自体にあるはずなので、モジュールが作成されたときのタイムスタンプとともに追加しました。
これが機能した後も、globsol で同じエラーが発生しましたが、別の理由でした。モジュール プロシージャには、同じシンボルを複数回ロードする冗長な USE ステートメントが含まれています。これを防ぐコードがありましたが、シンボルは別の名前空間にロードされていました。解決策は、現在の名前空間から親名前空間に検索を広げることです。仕事関数が単一の引数しか持てないという悪い性質を持つ g95_traverse_ns() を避けるために、トラバーサル コードを少しやり直しました。
最初の問題は、globsol の次のファイルに進みました。問題は、間違った型を持つ構造コンストラクターに関係していました。型を変換しようとする代わりに、文句を言ってエラーを出しました。すでに存在し、正常に動作することが知られているいくつかのサブルーチンを呼び出すことができるのは非常にクールでした。
次は、定義された割り当てインターフェイスのインテント チェックで誤ったエラーが発生しました。これらは他の演算子と同様に扱われ、定義された代入には異なる一連の必要なインテントがあります。
その後、コピーされていない RESULT 仕様があったため、関数型が設定されていないというバグハントが長く続きました。これを修正するには、解決におけるさまざまなアクションの順序をわずかに再配置する必要がありました。
次に、構造体コンストラクターのシンボル部分が保存されていないモジュールの非常に小さなバグが発生しました。これに対する修正は、1 行追加することでした。
さらに 2 つのファイルが正常にコンパイルされた後、別の不具合が発生しました。今回は実装されていないものです。定義された代入は、代入をサブルーチン呼び出しに変換しませんでした。それを追加しました。
次の問題は、構造コンストラクターを配列コンストラクターであるかのように展開することでした。修理済み。
Globsol は、470 個のファイルのうち約 80 個をコンパイルしていました。現在、約 110 に達しています。唯一の目に見えるエラーは 1 つのファイルにあり、その失敗により、約 360 のファイルをコンパイルできません…