if (!top->flag_base) {
if (!top->flag_local || top->flag_is_global) {
bl = cobc_malloc(sizeof(struct base_list));
bl->f = top;
bl->curr_prog = excp_current_program_id;
bl->next = base_cache;
base_cache = bl;
} else {
if (current_prog->flag_global_use) {
joutput_local("unsigned char\t\t*%s%s = NULL;", CB_PREFIX_BASE, name);
joutput_local("\t/* %s */\n", top->name);
joutput_local("static unsigned char\t*save_%s%s;\n", CB_PREFIX_BASE,
name);
} else {
joutput_local("unsigned char\t*%s%s = NULL;", CB_PREFIX_BASE, name);
joutput_local("\t/* %s */\n", top->name);
}
}
top->flag_base = 1;
}
- 上記の
if (current_prog->flag_global_use) を通るプログラム。DECLARATIVES~END DECLARATIVESをコメントアウトすると else の方を通るようになる。
IDENTIFICATION DIVISION.
PROGRAM-ID. prog.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT SAMPLE-FILE
ASSIGN TO "sample.dat"
ORGANIZATION IS LINE SEQUENTIAL
FILE STATUS IS WS-FILE-STATUS.
DATA DIVISION.
FILE SECTION.
FD SAMPLE-FILE.
01 SAMPLE-RECORD PIC X(80).
WORKING-STORAGE SECTION.
01 WS-FILE-STATUS PIC XX.
LOCAL-STORAGE SECTION.
01 WS-LOCAL-VAR PIC X(10).
PROCEDURE DIVISION.
******************************************************************
DECLARATIVES.
ERROR-HANDLING SECTION.
USE GLOBAL AFTER STANDARD ERROR PROCEDURE
ON SAMPLE-FILE.
ERROR-PARA.
DISPLAY "File error: " WS-FILE-STATUS.
END DECLARATIVES.
******************************************************************
MAIN-SECTION.
MAIN-PARA.
DISPLAY WS-LOCAL-VAR.
STOP RUN.
./prog.java:180: error: cannot find symbol
f_WS_LOCAL_VAR.setDataStorage(b_WS_LOCAL_VAR);
^
symbol: variable b_WS_LOCAL_VAR
1 error
unsigned char ... は出力されなかった。joutput_local を見ると、if (current_prog->local_storage_file) がtrueのときに実行されるようになっているが、デバッグしたところ local_storage_file はnilだった。
static void joutput_local(const char *fmt, ...) {
// デバッグ用
printf("joutput_local: local_storage_file=%p\n", current_prog->local_storage_file);
if (current_prog->local_storage_file) {
va_list ap;
va_start(ap, fmt);
vfprintf(joutput_target, fmt, ap);
va_end(ap);
}
}
joutput_local: local_storage_file=(nil)
joutput_local を joutput_base に書き換えても出力されなかった。
if (current_prog->flag_global_use)を通るプログラム。DECLARATIVES~END DECLARATIVESをコメントアウトするとelseの方を通るようになる。unsigned char ...は出力されなかった。joutput_localを見ると、if (current_prog->local_storage_file)がtrueのときに実行されるようになっているが、デバッグしたところlocal_storage_fileはnilだった。joutput_localをjoutput_baseに書き換えても出力されなかった。