1910Speter /* Copyright (c) 1980 Regents of the University of California */ 2910Speter 3*3298Smckusic static char sccsid[] = "@(#)flvalue.c 1.7 03/18/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 /* 162069Smckusic * runtime display structure 171202Speter */ 181202Speter struct dispsave { 192069Smckusic char *locvars; /* pointer to local variables */ 202069Smckusic 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 603074Smckusic put(2, PTR_RV | bn << 8+INDX, (int)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 66*3298Smckusic return p; 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 */ 883223Smckusic tempoff = tmpalloc(sizeof (long (*)()) + sizeof (long) 893223Smckusic + 2*bn*sizeof (struct dispsave), nl+TSTR, NOREG); 90910Speter # ifdef OBJ 913074Smckusic put(2 , O_LV | cbn << 8 + INDX , (int)tempoff ); 923074Smckusic put(2, O_FSAV | bn << 8, (long)p->entloc); 93910Speter # endif OBJ 94910Speter # ifdef PC 95910Speter putleaf( P2ICON , 0 , 0 , 961202Speter ADDTYPE( P2PTR , ADDTYPE( P2FTN , P2PTR|P2STRTY ) ) , 97910Speter "_FSAV" ); 98910Speter { 99910Speter char extname[ BUFSIZ ]; 100910Speter char *starthere; 101910Speter int i; 102910Speter 103910Speter starthere = &extname[0]; 104910Speter for ( i = 1 ; i < bn ; i++ ) { 105910Speter sprintf( starthere , EXTFORMAT , enclosing[ i ] ); 106910Speter starthere += strlen( enclosing[ i ] ) + 1; 107910Speter } 108910Speter sprintf( starthere , EXTFORMAT , p -> symbol ); 109910Speter starthere += strlen( p -> symbol ) + 1; 110910Speter if ( starthere >= &extname[ BUFSIZ ] ) { 111910Speter panic( "flvalue namelength" ); 112910Speter } 113910Speter putleaf( P2ICON , 0 , 0 , p2type( p ) , extname ); 114910Speter } 115910Speter putleaf( P2ICON , bn , 0 , P2INT , 0 ); 116910Speter putop( P2LISTOP , P2INT ); 1171202Speter putLV( 0 , cbn , tempoff , P2STRTY ); 118910Speter putop( P2LISTOP , P2INT ); 119910Speter putop( P2CALL , P2PTR | P2STRTY ); 120910Speter # endif PC 121*3298Smckusic return p; 122910Speter default: 1231202Speter error("Variable given, %s required for %s parameter %s" , 1241202Speter typename , typename , formalp -> symbol ); 1251202Speter return NIL; 126910Speter } 127910Speter } 128