Skip to content

LOCAL-STORAGE SECTIONが未サポート #816

@tsh-hashimoto

Description

@tsh-hashimoto

LOCAL-STORAGE SECTIONのサポート

概要

#815LOCAL-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.cjoutput_base関数(865〜884行目)において、LOCAL-STORAGE SECTIONに属するフィールドは以下の問題のあるコードパスを通る:

  1. base_cacheに登録されない — そのため、生成されるJavaクラスにCobolDataStorage型のメンバ変数宣言が出力されない。
  2. C言語の宣言(unsigned char *)がjoutput_localで出力される — Javaとして不正なコードとなる。

これはcobj/field.c(986〜992行目)におけるflag_localflag_baseの設定ロジックに起因する:

  • LINKAGE SECTION / BASED項目 → flag_local=1, flag_base=1 → 正常に動作(問題のパスをスキップ)
  • LOCAL-STORAGE SECTION項目 → flag_local=1, flag_base=0 → 問題のパスに入る

問題のパス内はさらにflag_global_useUSE 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を実装するにあたり、少なくとも以下の箇所の変更が必要となる:

  1. cobj/codegen.cjoutput_base — LOCAL-STORAGEフィールドをbase_cacheに登録し、CobolDataStorage宣言が生成されるようにする。C言語のunsigned char *出力を適切なJavaコードに置き換える。
  2. cobj/codegen.c(初期化コード生成) — LOCAL-STORAGE変数を初回呼び出し時だけでなく、プログラムに入るたびにVALUE句の値で再初期化するコードを生成する。
  3. cobj/parser.y — サポート実装後、LOCAL-STORAGE SECTIONに対するcb_errorを削除する。
  4. ランタイム(libcobj — 呼び出しごとの割り当て・初期化セマンティクスをサポートするための変更が必要になる可能性がある。
  5. テストtests/run.src/miscellaneous.atのコメントアウトされたテストケースを有効化し、拡充する。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions