1 /* Copyright (c) 1980 Regents of the University of California */
2 
3 static	char sccsid[] = "@(#)flvalue.c 1.1 09/24/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 
15     /*
16      *	flvalue generates the code to either pass on a formal routine,
17      *	or construct the structure which is the environment for passing.
18      *	it tells the difference by looking at the tree it's given.
19      */
20 struct nl *
21 flvalue( r )
22     int	*r;
23     {
24 	struct nl	*p;
25 	long		tempoff;
26 
27 	if ( r == NIL ) {
28 	    return NIL;
29 	}
30 	p = lookup(r[2]);
31 	if (p == NIL) {
32 		return NIL;
33 	}
34 	switch ( r[0] ) {
35 	    case T_FFUNC:
36 		    if ( r[3] != NIL ) {
37 			error("Formal function %s cannot be qualified" ,
38 				p -> symbol );
39 			return NIL;
40 		    }
41 		    goto froutine;
42 	    case T_FPROC:
43 		    if ( r[3] != NIL ) {
44 			error("Formal procedure %s cannot be qualified" ,
45 				p -> symbol );
46 			return NIL;
47 		    }
48 	    froutine:
49 #		    ifdef OBJ
50 			put( 2 , PTR_RV | bn << 8+INDX , p -> value[NL_OFFS] );
51 #		    endif OBJ
52 #		    ifdef PC
53 			putRV( p -> symbol , bn , p -> value[ NL_OFFS ] ,
54 				p2type( p ) );
55 #		    endif PC
56 		    return p -> type;
57 	    case T_FUNC:
58 		    if ( r[3] != NIL ) {
59 			error("Function %s cannot be qualified" , p -> symbol );
60 			return NIL;
61 		    }
62 		    goto routine;
63 	    case T_PROC:
64 		    if ( r[3] != NIL ) {
65 			error("Procedure %s cannot be qualified", p -> symbol );
66 			return NIL;
67 		    }
68 	    routine:
69 			/*
70 			 *	formal routine structure:
71 			 *
72 			 *	struct formalrtn {
73 			 *		long		(*entryaddr)();
74 			 *		long		cbn;
75 			 *		struct dispsave	disp[2*MAXLVL];
76 			 *	};
77 			 */
78 		    sizes[ cbn ].om_off -=	  sizeof (long (*()))
79 						+ sizeof (long)
80 						+ 2*bn*sizeof (struct dispsave);
81 		    tempoff = sizes[ cbn ].om_off;
82 		    if ( sizes[ cbn ].om_off < sizes[ cbn ].om_max ) {
83 			sizes[ cbn ].om_max = tempoff;
84 		    }
85 #		    ifdef OBJ
86 			put( 2 , PTR_LV | cbn << 8 + INDX , tempoff );
87 			put( 2 , O_FSAV | bn << 8 + INDX , p -> entloc );
88 #		    endif OBJ
89 #		    ifdef PC
90 			putlbracket( ftnno , -tempoff );
91 			putleaf( P2ICON , 0 , 0 ,
92 			    ADDTYPE( P2PTR , ADDTYPE( P2FTN , P2PTR|P2STR ) ) ,
93 			    "_FSAV" );
94 			{
95 			    char	extname[ BUFSIZ ];
96 			    char	*starthere;
97 			    int		i;
98 
99 			    starthere = &extname[0];
100 			    for ( i = 1 ; i < bn ; i++ ) {
101 				sprintf( starthere , EXTFORMAT , enclosing[ i ] );
102 				starthere += strlen( enclosing[ i ] ) + 1;
103 			    }
104 			    sprintf( starthere , EXTFORMAT , p -> symbol );
105 			    starthere += strlen( p -> symbol ) + 1;
106 			    if ( starthere >= &extname[ BUFSIZ ] ) {
107 				panic( "flvalue namelength" );
108 			    }
109 			    putleaf( P2ICON , 0 , 0 , p2type( p ) , extname );
110 			}
111 			putleaf( P2ICON , bn , 0 , P2INT , 0 );
112 			putop( P2LISTOP , P2INT );
113 			putLV( 0 , cbn , tempoff , P2STR );
114 			putop( P2LISTOP , P2INT );
115 			putop( P2CALL , P2PTR | P2STRTY );
116 #		    endif PC
117 		    return p -> type;
118 	    default:
119 		    panic("flvalue");
120 	}
121     }
122