1910Speter /* Copyright (c) 1980 Regents of the University of California */ 2910Speter 3*3364Speter static char sccsid[] = "@(#)flvalue.c 1.8 03/24/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; 37*3364Speter #ifdef PC 38*3364Speter char extname[ BUFSIZ ]; 39*3364Speter #endif PC 40910Speter 41910Speter if ( r == NIL ) { 42910Speter return NIL; 43910Speter } 441202Speter typename = formalp -> class == FFUNC ? "function":"procedure"; 451202Speter if ( r[0] != T_VAR ) { 461202Speter error("Expression given, %s required for %s parameter %s" , 471202Speter typename , typename , formalp -> symbol ); 481202Speter return NIL; 491202Speter } 50910Speter p = lookup(r[2]); 51910Speter if (p == NIL) { 521202Speter return NIL; 53910Speter } 541202Speter switch ( p -> class ) { 551202Speter case FFUNC: 561202Speter case FPROC: 57910Speter if ( r[3] != NIL ) { 581202Speter error("Formal %s %s cannot be qualified" , 591202Speter typename , p -> symbol ); 60910Speter return NIL; 61910Speter } 62910Speter # ifdef OBJ 633074Smckusic put(2, PTR_RV | bn << 8+INDX, (int)p->value[NL_OFFS]); 64910Speter # endif OBJ 65910Speter # ifdef PC 66910Speter putRV( p -> symbol , bn , p -> value[ NL_OFFS ] , 67910Speter p2type( p ) ); 68910Speter # endif PC 693298Smckusic return p; 701202Speter case FUNC: 711202Speter case PROC: 72910Speter if ( r[3] != NIL ) { 731202Speter error("%s %s cannot be qualified" , typename , 741202Speter p -> symbol ); 75910Speter return NIL; 76910Speter } 771202Speter if (bn == 0) { 781202Speter error("Built-in %s %s cannot be passed as a parameter" , 791202Speter typename , p -> symbol ); 80910Speter return NIL; 81910Speter } 82910Speter /* 83910Speter * formal routine structure: 84910Speter * 85910Speter * struct formalrtn { 86910Speter * long (*entryaddr)(); 87910Speter * long cbn; 88910Speter * struct dispsave disp[2*MAXLVL]; 89910Speter * }; 90910Speter */ 913223Smckusic tempoff = tmpalloc(sizeof (long (*)()) + sizeof (long) 923223Smckusic + 2*bn*sizeof (struct dispsave), nl+TSTR, NOREG); 93910Speter # ifdef OBJ 943074Smckusic put(2 , O_LV | cbn << 8 + INDX , (int)tempoff ); 953074Smckusic put(2, O_FSAV | bn << 8, (long)p->entloc); 96910Speter # endif OBJ 97910Speter # ifdef PC 98910Speter putleaf( P2ICON , 0 , 0 , 991202Speter ADDTYPE( P2PTR , ADDTYPE( P2FTN , P2PTR|P2STRTY ) ) , 100910Speter "_FSAV" ); 101*3364Speter sextname( extname , p -> symbol , bn ); 102*3364Speter putleaf( P2ICON , 0 , 0 , p2type( p ) , extname ); 103910Speter putleaf( P2ICON , bn , 0 , P2INT , 0 ); 104910Speter putop( P2LISTOP , P2INT ); 1051202Speter putLV( 0 , cbn , tempoff , P2STRTY ); 106910Speter putop( P2LISTOP , P2INT ); 107910Speter putop( P2CALL , P2PTR | P2STRTY ); 108910Speter # endif PC 1093298Smckusic return p; 110910Speter default: 1111202Speter error("Variable given, %s required for %s parameter %s" , 1121202Speter typename , typename , formalp -> symbol ); 1131202Speter return NIL; 114910Speter } 115910Speter } 116