1910Speter /* Copyright (c) 1980 Regents of the University of California */ 2910Speter 3*2069Smckusic static char sccsid[] = "@(#)flvalue.c 1.3 01/06/81"; 4910Speter 5910Speter #include "whoami.h" 6910Speter #include "0.h" 7910Speter #include "tree.h" 8910Speter #include "opcode.h" 9910Speter #include "objfmt.h" 10910Speter #ifdef PC 11910Speter # include "pc.h" 12910Speter # include "pcops.h" 13910Speter #endif PC 141202Speter #ifdef OBJ 151202Speter /* 16*2069Smckusic * runtime display structure 171202Speter */ 181202Speter struct dispsave { 19*2069Smckusic char *locvars; /* pointer to local variables */ 20*2069Smckusic struct stack *stp; /* pointer to local stack frame */ 211202Speter }; 221202Speter #endif OBJ 23910Speter 24910Speter /* 25910Speter * flvalue generates the code to either pass on a formal routine, 26910Speter * or construct the structure which is the environment for passing. 27910Speter * it tells the difference by looking at the tree it's given. 28910Speter */ 29910Speter struct nl * 301202Speter flvalue( r , formalp ) 311202Speter int *r; 321202Speter struct nl *formalp; 33910Speter { 34910Speter struct nl *p; 35910Speter long tempoff; 361202Speter char *typename; 37910Speter 38910Speter if ( r == NIL ) { 39910Speter return NIL; 40910Speter } 411202Speter typename = formalp -> class == FFUNC ? "function":"procedure"; 421202Speter if ( r[0] != T_VAR ) { 431202Speter error("Expression given, %s required for %s parameter %s" , 441202Speter typename , typename , formalp -> symbol ); 451202Speter return NIL; 461202Speter } 47910Speter p = lookup(r[2]); 48910Speter if (p == NIL) { 491202Speter return NIL; 50910Speter } 511202Speter switch ( p -> class ) { 521202Speter case FFUNC: 531202Speter case FPROC: 54910Speter if ( r[3] != NIL ) { 551202Speter error("Formal %s %s cannot be qualified" , 561202Speter typename , p -> symbol ); 57910Speter return NIL; 58910Speter } 59910Speter # ifdef OBJ 60910Speter put( 2 , PTR_RV | bn << 8+INDX , p -> value[NL_OFFS] ); 61910Speter # endif OBJ 62910Speter # ifdef PC 63910Speter putRV( p -> symbol , bn , p -> value[ NL_OFFS ] , 64910Speter p2type( p ) ); 65910Speter # endif PC 66910Speter return p -> type; 671202Speter case FUNC: 681202Speter case PROC: 69910Speter if ( r[3] != NIL ) { 701202Speter error("%s %s cannot be qualified" , typename , 711202Speter p -> symbol ); 72910Speter return NIL; 73910Speter } 741202Speter if (bn == 0) { 751202Speter error("Built-in %s %s cannot be passed as a parameter" , 761202Speter typename , p -> symbol ); 77910Speter return NIL; 78910Speter } 79910Speter /* 80910Speter * formal routine structure: 81910Speter * 82910Speter * struct formalrtn { 83910Speter * long (*entryaddr)(); 84910Speter * long cbn; 85910Speter * struct dispsave disp[2*MAXLVL]; 86910Speter * }; 87910Speter */ 881202Speter sizes[ cbn ].om_off -= sizeof (long (*)()) 89910Speter + sizeof (long) 90910Speter + 2*bn*sizeof (struct dispsave); 91910Speter tempoff = sizes[ cbn ].om_off; 92910Speter if ( sizes[ cbn ].om_off < sizes[ cbn ].om_max ) { 93910Speter sizes[ cbn ].om_max = tempoff; 94910Speter } 95910Speter # ifdef OBJ 961202Speter put( 2 , O_LV | cbn << 8 + INDX , tempoff ); 97910Speter put( 2 , O_FSAV | bn << 8 + INDX , p -> entloc ); 98910Speter # endif OBJ 99910Speter # ifdef PC 100910Speter putlbracket( ftnno , -tempoff ); 101910Speter putleaf( P2ICON , 0 , 0 , 1021202Speter ADDTYPE( P2PTR , ADDTYPE( P2FTN , P2PTR|P2STRTY ) ) , 103910Speter "_FSAV" ); 104910Speter { 105910Speter char extname[ BUFSIZ ]; 106910Speter char *starthere; 107910Speter int i; 108910Speter 109910Speter starthere = &extname[0]; 110910Speter for ( i = 1 ; i < bn ; i++ ) { 111910Speter sprintf( starthere , EXTFORMAT , enclosing[ i ] ); 112910Speter starthere += strlen( enclosing[ i ] ) + 1; 113910Speter } 114910Speter sprintf( starthere , EXTFORMAT , p -> symbol ); 115910Speter starthere += strlen( p -> symbol ) + 1; 116910Speter if ( starthere >= &extname[ BUFSIZ ] ) { 117910Speter panic( "flvalue namelength" ); 118910Speter } 119910Speter putleaf( P2ICON , 0 , 0 , p2type( p ) , extname ); 120910Speter } 121910Speter putleaf( P2ICON , bn , 0 , P2INT , 0 ); 122910Speter putop( P2LISTOP , P2INT ); 1231202Speter putLV( 0 , cbn , tempoff , P2STRTY ); 124910Speter putop( P2LISTOP , P2INT ); 125910Speter putop( P2CALL , P2PTR | P2STRTY ); 126910Speter # endif PC 127910Speter return p -> type; 128910Speter default: 1291202Speter error("Variable given, %s required for %s parameter %s" , 1301202Speter typename , typename , formalp -> symbol ); 1311202Speter return NIL; 132910Speter } 133910Speter } 134