CBL_GET_PROGRAM_INFO (PL/I)

指定されたプログラムや、現在の呼び出しスタック内の特定プログラムに関する情報を戻します。

COBOL では、CBL_GET_PROGRAM_INFO は、COBOL プログラム用に定義された保存領域を使用します。COBOL ランタイム システムは、.int.gnt をロードし、このようなタイプのプログラムに対して、関連する保存領域へのアクセスを提供します。

ただし、ネイティブ オブジェクト コードのプログラムは、COBOL ランタイム システムによってロードされているがまだ呼び出されていない状態になっていることがあります。呼び出されるまで、保存領域は存在しないため、ネイティブ オブジェクト コードのプログラム (共有オブジェクト、ダイナミック リンク ライブラリ、実行ファイル) で CBL_GET_PROGRAM_INFO を使用できません。

これを解決するには、コンパイラ (COBOL または PL/I) に基づいて、あらかじめ定義した構造体をプログラムの結果オブジェクトに埋め込むことができます。この構造体には既知のシンボルを含める必要があります。これにより、ランタイムが実行中にその構造体を容易に見つけることができます。ネイティブ オブジェクト コードのプログラムがロードされているがまだ実行されていない場合、またはオブジェクトが PL/I オブジェクトの場合、このシンボルを見つけることができ、埋め込まれた構造体からプログラム情報を抽出することができます。

コンパイラは、オブジェクト コードのプログラム用に以下の構造体を作成します。

struct
{
    unsigned int version;
    unsigned int flags;
    union
    {
        void * p_savarea;
        Unsigned int PLI_attributes;
    }x;
} _mFinfo_<NAME>;

/* PLI_attributes bit values        */
#define PLI_AMODE24           0x00000001
#define PLI_AMODE31           0x00000002
#define PLI_EBCDIC            0x00000004
#define RESERVED1             0x000000F8
#define LANGUAGE              0x00000700
#define LANGUAGE_SPECIFIC     0x01FFF800
#define PLI_LENDIAN           0x00000800
#define PLI_FUTURE            0x01FFF000
#define RESERVED2             0xFE000000

詳細は次のとおりです。

<NAME> メイン エントリ ポイントまたはメイン プログラムの名前
version 構造体のバージョン (初期設定値は 1)
flags

0 = COBOL プログラム

1 = PL/I プログラム

p_savarea COBOL プログラムの savarea へのポインター
PLI_attributes 返される PL/I 属性

必要な場合にランタイムが _mFinfo_<NAME> シンボルを見つけることができるように、このシンボルを認識できるようにしておく必要があります。COBOL ランタイムでは、CBL_GET_PROGRAM_INFO は、指定されたプログラムが見つかったが保存領域が存在しない場合を除いて、通常通りに動作します。指定されたプログラムが見つかったが保存領域が存在しない状況で _mFinfo_<NAME> シンボルが見つかると、バージョンとフラグに基づいて、関連付けられた構造体が解読されます。COBOL の場合、プログラムの保存領域へのポインター (p_savarea) を使用して、指定したプログラムに関連するすべての情報にアクセスし、それらの情報を返すことができます。PL/I の場合、PLI_attributes データ項目から、関連するプログラム情報を抽出して返します。

PL/I の CBL_GET_PROGRAM_INFO では、COBOL プログラムの場合と同じようにプログラムの属性が返されます。PL/I プログラムに返されるビットの意味を次に示します。

ビット 0
0 プログラムが AMODE"24" コンパイラ指令を使ってコンパイルされていない。
1 プログラムが AMODE"24" コンパイラ指令を使ってコンパイルされている。
ビット 1
0 プログラムが AMODE"31" コンパイラ指令を使ってコンパイルされていない。
1 プログラムが AMODE"31" コンパイラ指令を使ってコンパイルされている。
ビット 2
0 プログラムが CHARSET(ASCII) コンパイラ指令を使ってコンパイルされている。
1 プログラムが CHARSET(EBCDIC) コンパイラ指令を使ってコンパイルされている。
ビット 3-5
将来のために予約されています。
ビット 6
0 プログラムが DATA(24) コンパイラ指令を使ってコンパイルされていない。
1 プログラムが DATA(24) コンパイラ指令を使ってコンパイルされている。
ビット 7
0 プログラムが DATA-CONTEXT コンパイラ指令を使ってコンパイルされていない。
1 プログラムが DATA-CONTEXT コンパイラ指令を使ってコンパイルされている。
ビット 8-10
0 言語が不明です。
1 PL/I。
2~7 予約済み。
ビット 11
言語固有のフラグ。
0 PL/I 固有 (リトルエンディアン)。
1 PL/I 固有 (ビッグエンディアン)。
ビット 12-24
言語固有のフラグ。
ビット 25
0 プログラムがアプリケーション コントローラではない。
1 プログラムがアプリケーション コントローラである。
ビット 26
将来のために予約されています。
ビット 27
0 プログラムが .390 アセンブラー プログラムではない。
1 プログラムが .390 アセンブラー プログラムである。
ビット 28-30
将来のために予約されています。
ビット 31
PL/I プログラム用に設定されます。
0 COBOL。
1 非 COBOL。

CBL_GET_PROGRAM_INFO ルーチンでは、PL/I 言語を設定するようにビット 8-10 が変更され、非 COBOL を示すようにビット 31 が設定されます。残りのデータ項目は説明の通りに返されます。ビット 3-7 と 25-30 は、ビット 31 を適切にチェックしない既存のプログラムと競合しないよう予約されています。

スタック内の PL/I では、現在のプログラムの情報を取得した後、スタックを繰り返し処理して呼び出し元プログラムの情報を取得することはできません。