This section describes how to build a Smalltalk stub object, then compile and link edit your HLL program.
To build the appropriate stub object module appropriate for your application, use one of the supplied JCL procs, along with the correct symbolic parameters for the target environment and language you are using. Use the following guidelines to decide which proc and parameters to use.
These procs are located in ABT.V4R5M0.SABTJLIB.
Once you have built the correct Smalltalk stub object module, you can compile your application as you normally do, using standard compile JCL.
The compiled HLL load module must then be link edited with the Smalltalk stub object module to create the final load module. Use the SYSLIN dd concatenation statement to ensure correct external name resolution. (This resolves the VASTART, VARUN, and VASTOP functions.)
The following sample JCL builds a sample load module using the Load From Memory Smalltalk model, the COBOL HLL, and the IMS execution environment. You can adapt this sample code for your application by substituting the correct proc names and parameters.
This example first builds the correct Smalltalk stub object module, using the ABTCALM proc with the correct symbolic parameters for the COBOL HLL and the IMS execution environment. It then compiles the COBOL program, and finally link edits the COBOL object module with the Smalltalk stub object module to create the final load module.
//COBCALL JOB ... //* //PROCLIB JCLLIB ORDER=(ABT.V4R5M0.SABTJLIB) //*==================================================================== //* CALLIN EXAMPLE: COBOL CALLING SMALLTALK //* SMALLTALK MODEL = LOAD FROM MEMORY (STATIC LINK) //* ENVIRONMENT = IMS //* LANGUAGE = COBOL //*==================================================================== //* //*-------------------------------------------------------------------- // CREATE SMALLTALK CALLIN STUB //* STUB OUTPUT OBJECT MODULE = COBCALL //* SMALLTALK MODE = LOAD FROM MEMORY //*-------------------------------------------------------------------- //CALLSTUB EXEC PROC=ABTXCALM,OBJMOD=COBCALL, // INFILE=USER.IMAGE.LIBRARY, // OUTFILE=USER.LOADLIB, // STAKDUMP=USER.STAKDUMP, // IMAGE=COBCALL, // ENV=I, // LANG=COB //*-------------------------------------------------------------------- //* COMPILE & LINKEDIT COBOL PROGRAM (COBSAMP) //*-------------------------------------------------------------------- //COBCOMP EXEC PGM=IGYCRCTL, ... // . // . // . //SYSLIB DD DSN=ABT.V4R5M0.SABTJLIB,DISP=SHR // . // . // . //SYSIN DD DISP=SHR,DSN=USER.COBOL.SOURCE(COBSAMP) //SYSLIN DD DSN=&&LOADSET,DISP=(MOD,PASS), // UNIT=VIO,SPACE=(80,(250,100)) // . // . // . //*-------------------------------------------------------------------- //* LINKEDIT COBOL LOAD MODULE //* OUTPUT LOAD MODULE = COBSAMP //* SYSLIN INPUT = &&LOADSET //* COBCALL //*-------------------------------------------------------------------- //LKED EXEC PGM=IEWL,PARM='LIST,AMODE=31,RMODE=ANY', ... // . // . //SYSLIB DD DSN=CEE.V1R5M0.SCEELKED,DISP=SHR // . // . //SYSLMOD DD DSN=USER.LOADLIB(COBSAMP),DISP=SHR //SYSLIN DD DSN=&&LOADSET,DISP=(OLD,DELETE) // DD DISP=SHR,DSN=USER.LOADLIB(COBCALL) // . // . // .
This section provides sample code illustrating how the Smalltalk VM should be called from each supported HLL. Note the calling conventions and associated parameters.
***************************************************************** * SMALLTALK CALLIN SAMPLE PROGRAM (COBOL) * ***************************************************************** IDENTIFICATION DIVISION. PROGRAM-ID. COBSAMP. ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. ***************************************************************** * REQUIRED SMALLTALK VM CALLIN COPYBOOK * ***************************************************************** COPY ABTXSCOB. * 01 IOAREALENGTH PIC S9(9) BINARY VALUE 18. 01 IOAREA PIC X(18) VALUE "This is the IOAREA". * PROCEDURE DIVISION. ***************************************************************** * INITIALIZE REQUIRED SMALLTALK VM CALLIN PARAMETERS * ***************************************************************** MOVE "CALLINXX " TO IMAGENAME. MOVE "TestCallin " TO RECEIVER. MOVE "run " TO SELECTOR. ***************************************************************** * SMALLTALK VM STARTUP * ***************************************************************** CALL "VASTART" USING BY REFERENCE IMAGENAME BY REFERENCE VHANDLE BY REFERENCE VSTATUS. DISPLAY "VASTART_____________________________________". DISPLAY "VHANDLE = " VHANDLE. IF VSTATUS NOT EQUAL TO ZERO PERFORM ERROR-ROUTINE THRU END-ERROR-ROUTINE. ***************************************************************** * SMALLTALK VM RUN IMAGE * ***************************************************************** CALL "VARUN" USING BY REFERENCE VHANDLE BY REFERENCE RECEIVER BY REFERENCE SELECTOR BY CONTENT IOAREALENGTH BY REFERENCE IOAREA BY REFERENCE VSTATUS BY REFERENCE VRESULT. DISPLAY "VARUN_______________________________________". DISPLAY "IOAREA = " IOAREA. DISPLAY "VRESULT = " VRESULT. IF VSTATUS NOT EQUAL TO ZERO PERFORM ERROR-ROUTINE THRU END-ERROR-ROUTINE. ***************************************************************** * SMALLTALK VM STOP * ***************************************************************** CALL "VASTOP" USING BY REFERENCE VHANDLE BY REFERENCE VSTATUS. DISPLAY "VASTOP______________________________________". DISPLAY "VHANDLE = " VHANDLE. IF VSTATUS NOT EQUAL TO ZERO PERFORM ERROR-ROUTINE THRU END-ERROR-ROUTINE. * COMPUTE RETURN-CODE = 0. GOBACK. * ERROR-ROUTINE. DISPLAY "VSTATUS = " VSTATUS. COMPUTE RETURN-CODE = VSTATUS. GOBACK. END-ERROR-ROUTINE. * END PROGRAM COBSAMP.
*PROCESS LC(101),OPT(0),S,MAP,LIST,STMT,A(F),AG,INCLUDE; /********************************************************************/ /* SMALLTALK CALLIN SAMPLE PROGRAM (PLI) */ /********************************************************************/ PLISAMP: PROC OPTIONS(MAIN,REENTRANT); %INCLUDE ABTXSPLI; /* REQUIRED SMALLTALK VM CALLIN COOKBOOK */ DCL ADDR BUILTIN; DCL PLIRETC BUILTIN; DCL RC FIXED BINARY(31,0); DCL IOAREALENGTH FIXED BINARY(31,0) INIT(18); DCL IOAREA CHAR(18) INIT('This is the IOAREA'); /********************************************************************/ /* INITIALIZE REQUIRED SMALLTALK VM CALLIN PARAMETERS */ /********************************************************************/ IMAGENAME = 'CALLINXX '; RECEIVER = 'TestCallin '; SELECTOR = 'run '; /********************************************************************/ /* SMALLTALK VM STARTUP */ /********************************************************************/ CALL VASTART(ADDR(IMAGENAME),VHANDLE,VSTATUS); DISPLAY('VSTART________________________________________________'); DISPLAY('VHANDLE = ' || VHANDLE); IF VSTATUS > 0 THEN CALL ERROR_RTN; /********************************************************************/ /* SMALLTALK VM RUN IMAGE */ /********************************************************************/ CALL VARUN(VHANDLE,ADDR(RECEIVER),ADDR(SELECTOR),(IOAREALENGTH), ADDR(IOAREA),VSTATUS,VRESULT); DISPLAY('VSRUN_________________________________________________'); DISPLAY('IOAREA = ' || IOAREA); DISPLAY('VRESULT = ' || VRESULT); IF VSTATUS > 0 THEN CALL ERROR_RTN; /********************************************************************/ /* SMALLTALK VM STOP */ /********************************************************************/ CALL VASTOP(VHANDLE,VSTATUS); DISPLAY('VASTOP________________________________________________'); DISPLAY('VHANDLE = ' || VHANDLE); IF VSTATUS > 0 THEN CALL ERROR_RTN; CALL PLIRETC(VSTATUS); RETURN; ERROR_RTN: PROC; DISPLAY('ERROR - VSTATUS = ' || VSTATUS); CALL PLIRETC(VSTATUS); EXIT; END ERROR_RTN; END PLISAMP;
/********************************************************************/ /* Smalltalk Callin Sample Program (C/390) */ /********************************************************************/ #pragma csect(code,"C390SAMP") #pragma csect(static,"$C390") #include "abtxscxx.h" /* Required Smalltalk VM Callin Header */ char ioarea??(18??) = "This is the IOAREA"; long ioareaLength = 18; void errorRtn(void); int main(int argc, char *argv??(??) ) { /********************************************************************/ /* Initialize required Smalltalk VM Callin parameters */ /********************************************************************/ memcpy(imageName,"CALLINXX ",9); memcpy(receiver,"TestCallin ",11); memcpy(selector,"run ",5); /********************************************************************/ /* Smalltalk VM Startup */ /********************************************************************/ vastart(imageName,&vhandle,&vstatus); printf("\n> vastart()__________________________________________\n"); printf(" vhandle = %d\n",vhandle); if (vstatus != 0 && vhandle !=0 ) errorRtn(); /********************************************************************/ /* Smalltalk VM Run Image */ /********************************************************************/ varun(&vhandle,receiver,selector,ioareaLength,&ioarea, &vstatus,&vresult); printf("\n> varun()____________________________________________\n"); printf(" ioarea = '%s'\n",ioarea); printf(" vresult = %d\n",vresult); if (vstatus != 0) errorRtn(); /********************************************************************/ /* Smalltalk VM Stop */ /********************************************************************/ vastop(&vhandle,&vstatus); printf("\n> vastop()___________________________________________\n"); printf(" vhandle = %d\n",vhandle); if (vstatus != 0) errorRtn(); return(vstatus); } void errorRtn() { printf("Error - VSTATUS = %d\n",vstatus); exit(vstatus); }
Use the following copybooks and headers to properly map the required variable definitions for call-in support.
***************************************************************** * COBOL - SMALLTALK CALLIN COPYBOOK (ABTXSCOB) * ***************************************************************** 01 IMAGENAME PIC X(64). 01 RECEIVER PIC X(64). 01 SELECTOR PIC X(64). 01 VHANDLE PIC S9(9) BINARY. 01 VSTATUS PIC S9(9) BINARY. 01 VRESULT PIC S9(9) BINARY. *
/********************************************************************/ /* PL/I - SMALLTALK CALLIN COPYBOOK (ABTXSPLI) */ /********************************************************************/ DCL (VASTART,VARUN,VASTOP) EXTERNAL ENTRY; DCL IMAGENAME CHAR(64); DCL RECEIVER CHAR(64); DCL SELECTOR CHAR(64); DCL VHANDLE FIXED BINARY(31,0) INIT(0); DCL VSTATUS FIXED BINARY(31,0) INIT(0); DCL VRESULT FIXED BINARY(31,0) INIT(0);
#ifndef _VAST_ABTXSCXX /********************************************************************/ /* C370 - Smalltalk Callin Header (ABTXSCXX) */ /********************************************************************/ typedef long VAST_HANDLE; typedef long VAST_STATUS; typedef long VAST_RESULT; char imageName??(64??) = {0}; char receiver??(64??) = {0}; char selector??(64??) = {0}; VAST_HANDLE vhandle; VAST_STATUS vstatus; VAST_RESULT vresult; #ifdef __cplusplus extern "C" { #endif extern void vastart (char *imageName, VAST_HANDLE *vhandle, VAST_STATUS *vastrc); extern void varun (VAST_HANDLE *vhandle, char *receiver, char *selector, int ioarea_length, void *ioarea, VAST_STATUS *vastrc, VAST_RESULT *vares); extern void vastop (VAST_HANDLE *vhandle, VAST_STATUS *vastrc); #ifdef __cplusplus } #endif #define _VAST_ABTXSCXX #endif