LOCAL-STORAGE SECTIONのサポート
概要
#815 でLOCAL-STORAGE SECTIONの使用に対してコンパイルエラーを報告するようにしたが、将来的には正式にLOCAL-STORAGE SECTIONをサポートすることを目指す。
opensource COBOL 4Jは現在LOCAL-STORAGE SECTIONをサポートしていない。LOCAL-STORAGE SECTIONを使用したCOBOLプログラムをコンパイルすると、有効なJavaコードではなく不正なC言語スタイルの変数宣言が生成され、Javaのコンパイルエラーとなる。
暫定対応として、パーサーの段階で明示的なエラー(LOCAL-STORAGE SECTION is not supported)を報告するようにした。
本IssueはLOCAL-STORAGE SECTIONの正式なサポートを追跡するものである。
原因
cobj/codegen.cのjoutput_base関数(865〜884行目)において、LOCAL-STORAGE SECTIONに属するフィールドは以下の問題のあるコードパスを通る:
base_cacheに登録されない — そのため、生成されるJavaクラスにCobolDataStorage型のメンバ変数宣言が出力されない。
- C言語の宣言(
unsigned char *)がjoutput_localで出力される — Javaとして不正なコードとなる。
これはcobj/field.c(986〜992行目)におけるflag_localとflag_baseの設定ロジックに起因する:
LINKAGE SECTION / BASED項目 → flag_local=1, flag_base=1 → 正常に動作(問題のパスをスキップ)
LOCAL-STORAGE SECTION項目 → flag_local=1, flag_base=0 → 問題のパスに入る
問題のパス内はさらにflag_global_use(USE GLOBAL AFTER ERROR PROCEDUREの有無)で分岐するが、いずれのサブパスでも不正なJava出力となる。
期待される動作
LOCAL-STORAGE SECTIONはCOBOL標準に従い、以下のように動作すべきである:
LOCAL-STORAGE SECTIONの変数はプログラムの呼び出しごとに割り当てられ、毎回VALUE句の値で初期化される。
- これは
WORKING-STORAGE SECTIONとは異なり、WORKING-STORAGEの変数は呼び出し間で値が保持され、初回呼び出し時のみ初期化される。
LOCAL-STORAGE SECTIONはネストプログラムでは使用できない。
再現手順
IDENTIFICATION DIVISION.
PROGRAM-ID. prog.
DATA DIVISION.
LOCAL-STORAGE SECTION.
01 WS-LOCAL-VAR PIC X(10) VALUE "HELLO".
PROCEDURE DIVISION.
DISPLAY WS-LOCAL-VAR
STOP RUN.
cobj prog.cob
# 現在の動作: "LOCAL-STORAGE SECTION is not supported" エラー
# 暫定対応前の動作: 不正なJavaコードが生成され、javacコンパイルエラーとなる
実装に向けたメモ
LOCAL-STORAGE SECTIONを実装するにあたり、少なくとも以下の箇所の変更が必要となる:
cobj/codegen.c(joutput_base) — LOCAL-STORAGEフィールドをbase_cacheに登録し、CobolDataStorage宣言が生成されるようにする。C言語のunsigned char *出力を適切なJavaコードに置き換える。
cobj/codegen.c(初期化コード生成) — LOCAL-STORAGE変数を初回呼び出し時だけでなく、プログラムに入るたびにVALUE句の値で再初期化するコードを生成する。
cobj/parser.y — サポート実装後、LOCAL-STORAGE SECTIONに対するcb_errorを削除する。
- ランタイム(
libcobj) — 呼び出しごとの割り当て・初期化セマンティクスをサポートするための変更が必要になる可能性がある。
- テスト —
tests/run.src/miscellaneous.atのコメントアウトされたテストケースを有効化し、拡充する。
LOCAL-STORAGE SECTIONのサポート
概要
#815 で
LOCAL-STORAGE SECTIONの使用に対してコンパイルエラーを報告するようにしたが、将来的には正式にLOCAL-STORAGE SECTIONをサポートすることを目指す。opensource COBOL 4Jは現在
LOCAL-STORAGE SECTIONをサポートしていない。LOCAL-STORAGE SECTIONを使用したCOBOLプログラムをコンパイルすると、有効なJavaコードではなく不正なC言語スタイルの変数宣言が生成され、Javaのコンパイルエラーとなる。暫定対応として、パーサーの段階で明示的なエラー(
LOCAL-STORAGE SECTION is not supported)を報告するようにした。本Issueは
LOCAL-STORAGE SECTIONの正式なサポートを追跡するものである。原因
cobj/codegen.cのjoutput_base関数(865〜884行目)において、LOCAL-STORAGE SECTIONに属するフィールドは以下の問題のあるコードパスを通る:base_cacheに登録されない — そのため、生成されるJavaクラスにCobolDataStorage型のメンバ変数宣言が出力されない。unsigned char *)がjoutput_localで出力される — Javaとして不正なコードとなる。これは
cobj/field.c(986〜992行目)におけるflag_localとflag_baseの設定ロジックに起因する:LINKAGE SECTION/BASED項目 →flag_local=1,flag_base=1→ 正常に動作(問題のパスをスキップ)LOCAL-STORAGE SECTION項目 →flag_local=1,flag_base=0→ 問題のパスに入る問題のパス内はさらに
flag_global_use(USE GLOBAL AFTER ERROR PROCEDUREの有無)で分岐するが、いずれのサブパスでも不正なJava出力となる。期待される動作
LOCAL-STORAGE SECTIONはCOBOL標準に従い、以下のように動作すべきである:LOCAL-STORAGE SECTIONの変数はプログラムの呼び出しごとに割り当てられ、毎回VALUE句の値で初期化される。WORKING-STORAGE SECTIONとは異なり、WORKING-STORAGEの変数は呼び出し間で値が保持され、初回呼び出し時のみ初期化される。LOCAL-STORAGE SECTIONはネストプログラムでは使用できない。再現手順
実装に向けたメモ
LOCAL-STORAGE SECTIONを実装するにあたり、少なくとも以下の箇所の変更が必要となる:cobj/codegen.c(joutput_base) — LOCAL-STORAGEフィールドをbase_cacheに登録し、CobolDataStorage宣言が生成されるようにする。C言語のunsigned char *出力を適切なJavaコードに置き換える。cobj/codegen.c(初期化コード生成) — LOCAL-STORAGE変数を初回呼び出し時だけでなく、プログラムに入るたびにVALUE句の値で再初期化するコードを生成する。cobj/parser.y— サポート実装後、LOCAL-STORAGE SECTIONに対するcb_errorを削除する。libcobj) — 呼び出しごとの割り当て・初期化セマンティクスをサポートするための変更が必要になる可能性がある。tests/run.src/miscellaneous.atのコメントアウトされたテストケースを有効化し、拡充する。