Skip to content

joutput_baseflag_global_use が有効になっているときの処理 #786

@tsh-hashimoto

Description

@tsh-hashimoto
  • 以下の部分でC言語のソースが出力される
  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_localjoutput_base に書き換えても出力されなかった。

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