Rational Developer for System z
Enterprise PL/I for z/OS, Version 3.8, プログラミング・ガイド

Enterprise PL/I ルーチンのフェッチ

旧 PL/I コンパイラーによって課せられた、フェッチされたモジュールの制限は、 ほぼすべて除去されました。 したがって、FETCH されたモジュールは次のことが行えます。

しかし、フェッチの対象である Enterprise PL/I モジュールに対するいくつかの 制限があります。 それらは次のとおりです。

  1. OPTIONS(FETCHABLE) は、フェッチされる側のモジュール内のエントリー・ポイント を提供するルーチンの PROCEDURE ステートメントに指定する必要があります。 あるいは DLLINIT コンパイラー・オプションを使用して、そのプロシージャーに OPTIONS(FETCHABLE) を適用する必要があります。
  2. ENTRY カードには、PL/I エントリー・ポイントの名前を指定する必要があります。
  3. フェッチされる側のコードのいずれかをコンパイルするために RENT コンパイラー・オプション が使用された場合、そのモジュールは DLL としてリンクする必要があります。
  4. フェッチする側のコードのコンパイルに NORENT コンパイラー・オプション が使用された場合、フェッチされる側のすべてのモジュールが NORENT コードのみで 構成されていなければなりません。
  5. フェッチする側のコードのコンパイルに RENT コンパイラー・オプション が使用された場合、FETCH される側の ENTRY が、フェッチする側のモジュールに OPTIONS(COBOL) または OPTIONS(ASM) として宣言されていてはなりません。 この状態で記述子を渡すのを避けたい場合には、ENTRY 宣言に OPTIONS(NODESCRIPTOR) 属性を指定する必要があります。

NORENT WRITABLE コードは逐次使用可能です。そのため、FFETCHABLE 定数を示すために使用されるポインターは、 すべての NORENT WRITABLE ルーチンのプロローグ・コードで、ゼロにリセットされます。 これによって、コードが正しい PL/I セマンティクスも提供しながら逐次再使用可能になることが保証されますが、 NORENT WRITABLE コードにおいて TITLE を指定した FETCH の使用に制限が課されます。 この制限によって、FETCH A TITLE('B') を行ったルーチンでは、終了して再入した場合、 CALL A ステートメントを実行する前に FETCH A TITLE('B') を再実行する必要があります (そうしなければ、CALL の実行前に暗黙の (TITLE のない) A の FETCH が実行されます)。

これらの制限を説明するために、コンパイラー・ユーザー出口 を考えてみます。 EXIT コンパイル時オプションを指定すると、コンパイラーは IBMUEXIT とい う名前の Enterprise PL/I モジュールをフェッチして呼び出します。

まず、RENT オプションを指定してコンパイラー・ユーザー出口を コンパイルする必要があるので注意してください。 コンパイラーは、このユーザー出口が DLL であることを前提としているからです。

上の項目 1 により、このルーチンに関するコンパイラーの PROCEDURE ステートメント は次のようになります。

ibmuexit:
  proc ( addr_Userexit_Interface_Block,
         addr_Request_Area )
  options( fetchable  );

  dcl addr_Userexit_Interface_Block  pointer byvalue;

  dcl addr_Request_Area              pointer byvalue;

上の項目 3 により、ユーザー出口を DLL にリンクするときに、 リンカー・オプション DYNAM=DLL を指定する必要があります。 DLL は、PDSE または一時データ・セットのどちらかにリンクする 必要があります (一次データ・セットにリンクする場合は、DSNTYPE=LIBRARY を SYSLMOD DD ステートメントに指定する必要があります)。

ユーザー出口のコンパイル、リンク、および呼び出しを行うため の JCL ステートメントはすべて、図 16 の JCL に示されています。 下記のサンプル・コードでは、フェッチされたユーザー出口は 構造体を指す 2 つの BYVALUE ポインターを受け取らず、代わりに 2 つの構造体 BYADDR を 受け取ります。これが上のコード抜粋との大きな相違です。 この変更を有効にするために、コードではその PROCEDURE ステートメントの それぞれに OPTIONS(NODESCRIPTOR) を指定しています。


Terms of use | Feedback

This information center is powered by Eclipse technology. (http://www.eclipse.org)