31.2.1 そとPERFORM文のインライン展開
そとPERFORM文のインライン展開の規則について説明します。
なお,PERFORM文については,マニュアル「COBOL2002 言語 標準仕様編」 「10.8.31 PERFORM文」を参照してください。
- 〈この項の構成〉
(1) 対象となる節,段落
手続き部分で定義された節と段落であることが必要です。宣言節で定義された節,段落はインライン化の対象となりません。
(2) THRU指定のあるPERFORM文
THRU指定のあるPERFORM文の場合,次のどちらかの条件を満たしていなければなりません。
-
手続き名1と手続き名2の両方が節である
-
手続き名1と手続き名2の両方が段落である
例1のPERFORM文は,SECT-1が節,PARG-2-1が段落であるため,インライン化の対象となりません。
- (例1)
: PROCEDURE DIVISION. : PERFORM SECT-1 THRU PARG-2-1. SECT-1 SECTION. PARG-1-1. : SECT-2 SECTION. PARG-2-1. :
-
手続き名1と手続き名2が節の場合,手続き名2の節は手続き名1の節の直後に定義された節である
例2のPERFORM文は,SECT-2がSECT-1の直後に定義されています。
- (例2)
: PROCEDURE DIVISION. : PERFORM SECT-1 THRU SECT-2. SECT-1 SECTION. PARG-1-1. : SECT-2 SECTION. PARG-2-1. :
-
手続き名1と手続き名2が段落の場合,手続き名2の段落は手続き名1の段落の直後に定義された段落である
例3のPERFORM文は,PARG-1-3がPARG-1-1の直後に定義された段落ではないため,インライン化の対象となりません。
- (例3)
: PROCEDURE DIVISION. : PERFORM PARG-1-1 THRU PARG-1-3. SECT-1 SECTION. PARG-1-1. : PARG-1-2. : PARG-1-3. :
(3) 呼ばれる節と段落
呼ばれる節と段落が次の(a)(b)の条件を満たしていることが必要です。
(a) THRU指定がある場合
-
手続き名1と手続き名2が節の場合,節または節に従属する段落を分岐文や複数のPERFORM文で参照してはなりません。
-
手続き名1と手続き名2が段落の場合,段落を分岐文や複数のPERFORM文で参照してはなりません。
例1のPERFORM文は,PARG-2-1がGO TO文によって参照されているため,インライン化の対象となりません。
- (例1)
: PROCEDURE DIVISION. : PERFORM SECT-1 THRU SECT-2. : GO TO PARG-2-1. : SECT-1 SECTION. PARG-1-1. : SECT-2 SECTION. PARG-2-1. :
例2の(1)のPERFORM文は,PARG-1-2とPARG-1-3が(2)のPERFORM文と(3)のGO TO文によって参照されているため,インライン化の対象となりません。
- (例2)
: PROCEDURE DIVISION. : PERFORM PARG-1-2 THRU PARG-1-3. …(1) : PERFORM PARG-1-1 THRU PARG-1-4. …(2) : GO TO SECT-1. …(3) : SECT-1 SECTION. PARG-1-1. : PARG-1-2. : PARG-1-3. : PARG-1-4. :
(b) THRU指定がない場合
-
手続き名1が節の場合,節または節に従属する段落を分岐文や複数のPERFORM文で参照してはなりません。
-
手続き名1が段落の場合,段落を分岐文や複数のPERFORM文で参照してはなりません。
例1のPERFORM文は,PARG-1-2がGO TO文によって参照されているため,インライン化の対象となりません。
- (例1)
: PROCEDURE DIVISION. : PERFORM SECT-1. : GO TO PARG-1-2. : SECT-1 SECTION. PARG-1-1. : PARG-1-2. : SECT-2 SECTION. :
例2の(1)のPERFORM文は,PARG-1-2が(2)のPERFORM文と(3)のGO TO文によって参照されているため,インライン化の対象となりません。
- (例2)
: PROCEDURE DIVISION. : PERFORM PARG-1-2. …(1) : PERFORM PARG-1-1 THRU PARG-1-3. …(2) : GO TO SECT-1. …(3) : SECT-1 SECTION. PARG-1-1. : PARG-1-2. : PARG-1-3. : PARG-1-4. :
(4) PERFORM文の位置
PERFORM文が記述されている位置が次の(a)(b)の条件を満たしていることが必要です。
(a) THRU指定がある場合
-
手続き名1と手続き名2が節の場合,節または節に従属する段落の中に呼び出し元のPERFORM文があってはなりません。
-
手続き名1と手続き名2が段落の場合,段落の中に呼び出し元のPERFORM文があってはなりません。
例1のPERFORM文は,SECT-2の中に書かれているため,インライン化の対象となりません。
- (例1)
: PROCEDURE DIVISION. : SECT-1 SECTION. : SECT-2 SECTION. PARG-2-1. : PERFORM SECT-1 THRU SECT-2. : SECT-3 SECTION. :
例2のPERFORM文は,PARG-1-2中に書かれているため,インライン化の対象となりません。
- (例2)
: PROCEDURE DIVISION. : SECT-1 SECTION. PARG-1-1. : PARG-1-2. : PERFORM PARG-1-1 THRU PARG-1-2. : PARG-1-3. :
(b) THRU指定がない場合
-
手続き名1が節の場合,節または節に従属する段落の中に呼び出し元のPERFORM文があってはなりません。
-
手続き名1が段落の場合,段落の中に呼び出し元のPERFORM文があってはなりません。
例1のPERFORM文はSECT-1中に書かれているため,インライン化の対象となりません。
- (例1)
: PROCEDURE DIVISION. : SECT-1 SECTION. PARG-1-1. : PERFORM SECT-1. : SECT-2 SECTION. :
例2のPERFORM文はPARG-1-1中に書かれているため,インライン化の対象となりません。
- (例2)
: PROCEDURE DIVISION. : SECT-1 SECTION. PARG-1-1. : PERFORM PARG-1-1. : SECT-2 SECTION. :
(5) 呼ばれる節と段落までの間にある文
呼び出し元のPERFORM文または手続き部先頭から(「(7) 注意事項」を参照),呼ばれる節と段落までの間にある文が次の二つの条件を満たしていることが必要です。
-
最上位レベルのSTOP RUN文(「(7) 注意事項」を参照)など,プログラムの実行を終了する文がなければなりません。
例1では,STOP RUN文が文のレベルの最上位でないため,インライン化の対象とはなりません。
(例1)
: PROCEDURE DIVISION. : PERFORM SECT-1. : IF FLAG = 'ON' THEN STOP RUN. : SECT-1 SECTION. :
-
文のレベルに関係なく,ENTRY文があってはなりません。
例1ではENTRY文があるため,インライン化の対象となりません。
(例1)
: PROCEDURE DIVISION. : PERFORM SECT-1. : IF FLAG = 'ON' THEN ENTRY 'SUB01'. : SECT-1 SECTION. :
(6) 呼ばれる節と段落までの間にある節と段落
呼び出し元のPERFORM文または手続き部先頭から(「(7) 注意事項」を参照),呼ばれる節と段落までの間にある節と段落がGO TO文とALTER文の飛び先で参照されてはなりません。
例のPERFORM文は,1.のGO TO文によってSECT-1が参照されているため,インライン化の対象となりません。
- (例)
: PROCEDURE DIVISION. : GO TO SECT-1. *> 1. : PERFORM SECT-2. : SECT-1 SECTION. : SECT-2 SECTION. :
(7) 注意事項
-
(5),(6)の適用範囲を次の図に示します。
-
PERFORM文の方が節と段落の定義より前に書かれたときは1.の範囲。
-
節と段落の定義の方がPERFORM文より前に書かれたときは2.の範囲。
-
-
STOP RUN文,-MainNotCBLオプションの指定,または内側のプログラムのEXIT PROGRAM文,EXIT METHOD文,EXIT FUNCTION文,GOBACK文を示します。宣言節中の節と段落は対象外となるため,EXIT USE文,GO TO MORE-LABELS文は対象となりません。
-
インライン展開された個所で例外が発生した場合,EXCEPTION-LOCATION関数で返される手続き名の値は,インライン展開されていない場合と相違があります。詳細については,「21.7.1 組み込み関数を使用した例外情報の参照」の「(2) EXCEPTION-LOCATION関数」の注を参照してください。