-
Notifications
You must be signed in to change notification settings - Fork 38
Fix the bug about EXTERNAL data item #747
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix the bug about EXTERNAL data item #747
Conversation
* Fix a bug about data items with EXTERNAL
* Enable the skipped tests about EXTERNAL
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
This PR fixes bugs related to EXTERNAL data items in COBOL code generation. The changes enable previously skipped tests and refactor how external data items are handled in the Java code generator.
Key changes:
- Enables two previously skipped tests for EXTERNAL data items by removing
AT_CHECK([${SKIP_TEST}])and fixing test commands - Refactors external data item handling to treat them more uniformly with non-external items
- Moves external item initialization from early stages to the init method
Reviewed Changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 9 comments.
| File | Description |
|---|---|
| tests/run.src/miscellaneous.at | Enables EXTERNAL data item tests and corrects test execution commands from java prog to ${RUN_MODULE} caller |
| cobj/codegen.c | Refactors external data item handling by removing conditional branches, moving initialization logic, and preventing duplicate initialization |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
yutaro-sakamoto
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
opensourcecobol4j/tests/i18n_sjis.src/user-defined-word.at
Lines 428 to 455 in 5f52306
AT_SETUP([Nihongo field name in extaddr test msg.]) AT_CHECK([${SKIP_TEST}]) AT_DATA([prog.cob], [ IDENTIFICATION DIVISION. PROGRAM-ID. check1. DATA DIVISION. WORKING-STORAGE SECTION. 01 X項目 PIC X(5) EXTERNAL. PROCEDURE DIVISION. CALL 'check2'. IDENTIFICATION DIVISION. PROGRAM-ID. check2. DATA DIVISION. WORKING-STORAGE SECTION. 01 X項目 PIC X(6) EXTERNAL. PROCEDURE DIVISION. END PROGRAM check2. END PROGRAM check1. ]) AT_CHECK([${COMPILE} -debug prog.cob]) AT_CHECK([java prog], [1], [], [prog.cob:8: libcobj: EXTERNAL item 'X項目' has size > 6 ]) AT_CLEANUP opensourcecobol4j/tests/cobol_utf8.src/user-defined-word.at
Lines 380 to 409 in 5f52306
AT_SETUP([Nihongo field name in extaddr test msg.]) export LC_ALL='' AT_CHECK([${SKIP_TEST}]) AT_DATA([prog.cob], [ IDENTIFICATION DIVISION. PROGRAM-ID. check1. DATA DIVISION. WORKING-STORAGE SECTION. 01 X項目 PIC X(5) EXTERNAL. PROCEDURE DIVISION. CALL 'check2'. IDENTIFICATION DIVISION. PROGRAM-ID. check2. DATA DIVISION. WORKING-STORAGE SECTION. 01 X項目 PIC X(6) EXTERNAL. PROCEDURE DIVISION. END PROGRAM check2. END PROGRAM check1. ]) AT_CHECK([${COMPILE} -debug prog.cob]) AT_CHECK([java prog 2> out1.txt], [1]) AT_CHECK([echo "prog.cob:8: libcobj: EXTERNAL item 'X項目' has size > 6" | nkf --ic=UTF-8 --oc=Shift_JIS > out2.txt]) AT_CHECK([diff out1.txt out2.txt]) AT_CLEANUP
上記2つのスキップしているテストケースでも一部データにEXTERNALが使われていますが、今回の修正では解消しない不具合ということで合っていますか?
|
#747 (review) テストプログラムを見ると、prog.cobというプログラムの中にcheck1, check2という2つのPROGRAM-IDが書かれていますが、cobjでこれをコンパイルすると この失敗自体はEXTERNALに問題があるわけではないので、プログラムをcheck1.cblとcheck2.cblの2つに分ければ通るような気はします。 |
|
@tsh-hashimoto |
|
スキップしたテストについて この件については新たにIssueを作成します。 |
事象
何が問題か
変更点
主要な変更点を以下に書く。
まず、EXTERNAL付きの集団項目の下位項目が出力されるように以下の条件分岐を無効にした。
これは、
NullpointerExceptionを引き起こす。init()メソッドでAbstractCobolField型の変数(f_~~~)にCobolDataStorage型の変数(b_~~~)をsetDataStorageでセットしているが、CobolDataStorage型の変数はこの時点ではnullなので、この例外が発生してしまう。実際、CobolExternal.getStorageAddress()はrun_module()で実行されるが、これはinit()メソッドの後に実行される。これを解消するために、CobolExternal.getStorageAddress()もinit()メソッドで出力されるようにした。joutput_init_method... else if節を追加して、ここでCobolExternal.getStorageAddressを出力するようにした。joutput_initialize...run_module関数にCobolExternal.getStorageAddressを出力する以下の処理を削除した。また、base_cacheにEXTERNALの変数が加えられていなかったため、そこも修正した。
if(!top->flag_external)の分岐を無効にした。ここまでの修正だと、
CobolDataStorage型の変数が重複して宣言されてしまっていたので、これを修正した。joutput_declare_member_variables... 以下の記述をコメントアウトrun_module関数の初期化処理でfillBytesを使用してスペース埋めや0埋めをしているが、複数のプログラムでEXTERNALの変数を共有しているときに、ここで初期化されてしまうと想定外の値になってしまうので、EXTERNALの値はfillBytesが実行されないようにした。joutput_initial_values... EXTERNALのときは処理をスキップするようにした。テスト
run/miscellaneous.atEXTERNAL data item/EXTERNAL AS data itemEXTERNAL group data item