JVM COBOL がネイティブ COBOL を呼び出す場合のパラメーター モードの渡し方

JVM COBOL では、標準モード (by content、by reference、by value) を使用してネイティブ COBOL のエントリ ポイントにパラメーターを渡します。JVM COBOL とのネイティブな相互運用では、パラメーター渡しは、CALL 文の USING BY 句で制御されます。JVM COBOL では、ネイティブ COBOL のエントリ ポイントの USING 情報は調べられません。次に例を示します。

JVM COBOL:

    call "x" using by reference y

ネイティブ COBOL:

    entry "x" using by value y

上記の例では、「entry x」は、エントリ定義の by value 句にもかかわらず、値 y ではなく y のリファレンスを受け取ります。このため、結果は不明確なものになります。

その他の例

JVM COBOL:

    call "x" using by value y

C:

    int x(int* y)
    {...}

この例では、C は y へのポインターを予測し、値 y を受け取ります。

注:

JVM COBOL からネイティブ COBOL を呼び出す場合は、by content と by reference を使用することを推奨します。by value 機能は、C や C++ などの他の言語との相互運用が対象になります。

By Reference

パラメーターが by reference で渡される場合、JVM COBOL の項目のコピーがネイティブ コードに渡されます。ネイティブの呼び出しが完了すると、ネイティブ コードに加えられた情報の変更のコピーが JVM COBOL に戻されます。ただし、JVM 環境とネイティブ環境でメモリが共有されるわけではありません。つまり、ネイティブ コードに実際に渡される内容は、コピーされたデータのポインターになります。これは、COBOL 以外のプログラムを呼び出す場合に役立ちます。

この操作に対する影響は、特にマルチスレッド環境でかなり重要です。リファレンス パラメーターの変更は、呼び出しが完了するまで JVM COBOL 呼び出しプログラムには表示されません。

(メモリ制限内の) 複雑なグループ項目を by reference で適宜渡すことができます。グループ定義は、ネイティブと JVM COBOL ソース コードで同一にする必要があり、定義に USAGE POINTER 項目が含まれないようにします。

文字列 (java.lang.Strings) とテーブル (java.lang.byte arrays) は、by reference で渡すことができます。その他のオブジェクト (java.lang.Object から継承するタイプ、valuetypes など) は、by reference (または by value、下記参照) で渡すことはできません。

By Content

by content によるパラメーターの渡し方は、by reference と同じです。ただし、呼び出しが完了してもデータのコピーは JVM COBOL メモリに戻されません。

by reference で渡すことができる項目は、by content で渡すことができます。

By Value

JVM COBOLでは、by value で渡すことができるのは次の項目のみです。

  • binary-long - by value で渡す場合に推奨されるタイプ
  • pic x(4) comp-x
  • pic (9)9 comp
  • pic s(9)9 comp
  • pic (9)9 comp-5
  • pic s(9)9 comp-5

RETURNING 項目

RETURNING 項目でサポートされるのは、32 ビット タイプのみです。推奨されるタイプは binary-long です。

たとえば、ネイティブ コードが GOBACK RETURNING x を使用する場合、x は 32 ビット タイプにします。x は、CALL 文で定義するように、RETURNING 項目の RETURN-VALUE 専用レジスタに配置されます。