1 /* Copyright (c) 1980 Regents of the University of California */ 2 3 static char sccsid[] = "@(#)flvalue.c 1.2 10/03/80"; 4 5 #include "whoami.h" 6 #include "0.h" 7 #include "tree.h" 8 #include "opcode.h" 9 #include "objfmt.h" 10 #ifdef PC 11 # include "pc.h" 12 # include "pcops.h" 13 #endif PC 14 #ifdef OBJ 15 /* 16 * define the display structure for purposes of allocating 17 * a temporary 18 */ 19 struct dispsave { 20 char *ptr; 21 }; 22 #endif OBJ 23 24 /* 25 * flvalue generates the code to either pass on a formal routine, 26 * or construct the structure which is the environment for passing. 27 * it tells the difference by looking at the tree it's given. 28 */ 29 struct nl * 30 flvalue( r , formalp ) 31 int *r; 32 struct nl *formalp; 33 { 34 struct nl *p; 35 long tempoff; 36 char *typename; 37 38 if ( r == NIL ) { 39 return NIL; 40 } 41 typename = formalp -> class == FFUNC ? "function":"procedure"; 42 if ( r[0] != T_VAR ) { 43 error("Expression given, %s required for %s parameter %s" , 44 typename , typename , formalp -> symbol ); 45 return NIL; 46 } 47 p = lookup(r[2]); 48 if (p == NIL) { 49 return NIL; 50 } 51 switch ( p -> class ) { 52 case FFUNC: 53 case FPROC: 54 if ( r[3] != NIL ) { 55 error("Formal %s %s cannot be qualified" , 56 typename , p -> symbol ); 57 return NIL; 58 } 59 # ifdef OBJ 60 put( 2 , PTR_RV | bn << 8+INDX , p -> value[NL_OFFS] ); 61 # endif OBJ 62 # ifdef PC 63 putRV( p -> symbol , bn , p -> value[ NL_OFFS ] , 64 p2type( p ) ); 65 # endif PC 66 return p -> type; 67 case FUNC: 68 case PROC: 69 if ( r[3] != NIL ) { 70 error("%s %s cannot be qualified" , typename , 71 p -> symbol ); 72 return NIL; 73 } 74 if (bn == 0) { 75 error("Built-in %s %s cannot be passed as a parameter" , 76 typename , p -> symbol ); 77 return NIL; 78 } 79 /* 80 * formal routine structure: 81 * 82 * struct formalrtn { 83 * long (*entryaddr)(); 84 * long cbn; 85 * struct dispsave disp[2*MAXLVL]; 86 * }; 87 */ 88 sizes[ cbn ].om_off -= sizeof (long (*)()) 89 + sizeof (long) 90 + 2*bn*sizeof (struct dispsave); 91 tempoff = sizes[ cbn ].om_off; 92 if ( sizes[ cbn ].om_off < sizes[ cbn ].om_max ) { 93 sizes[ cbn ].om_max = tempoff; 94 } 95 # ifdef OBJ 96 put( 2 , O_LV | cbn << 8 + INDX , tempoff ); 97 put( 2 , O_FSAV | bn << 8 + INDX , p -> entloc ); 98 # endif OBJ 99 # ifdef PC 100 putlbracket( ftnno , -tempoff ); 101 putleaf( P2ICON , 0 , 0 , 102 ADDTYPE( P2PTR , ADDTYPE( P2FTN , P2PTR|P2STRTY ) ) , 103 "_FSAV" ); 104 { 105 char extname[ BUFSIZ ]; 106 char *starthere; 107 int i; 108 109 starthere = &extname[0]; 110 for ( i = 1 ; i < bn ; i++ ) { 111 sprintf( starthere , EXTFORMAT , enclosing[ i ] ); 112 starthere += strlen( enclosing[ i ] ) + 1; 113 } 114 sprintf( starthere , EXTFORMAT , p -> symbol ); 115 starthere += strlen( p -> symbol ) + 1; 116 if ( starthere >= &extname[ BUFSIZ ] ) { 117 panic( "flvalue namelength" ); 118 } 119 putleaf( P2ICON , 0 , 0 , p2type( p ) , extname ); 120 } 121 putleaf( P2ICON , bn , 0 , P2INT , 0 ); 122 putop( P2LISTOP , P2INT ); 123 putLV( 0 , cbn , tempoff , P2STRTY ); 124 putop( P2LISTOP , P2INT ); 125 putop( P2CALL , P2PTR | P2STRTY ); 126 # endif PC 127 return p -> type; 128 default: 129 error("Variable given, %s required for %s parameter %s" , 130 typename , typename , formalp -> symbol ); 131 return NIL; 132 } 133 } 134