/* Copyright (c) 1980 Regents of the University of California */
static char sccsid
[] = "@(#)flvalue.c 1.11 %G%";
* flvalue generates the code to either pass on a formal routine,
* or construct the structure which is the environment for passing.
* it tells the difference by looking at the tree it's given.
typename
= formalp
-> class == FFUNC
? "function":"procedure";
error("Expression given, %s required for %s parameter %s" ,
typename
, typename
, formalp
-> symbol
);
error("Formal %s %s cannot be qualified" ,
typename
, p
-> symbol
);
put(2, PTR_RV
| bn
<< 8+INDX
, (int)p
->value
[NL_OFFS
]);
putRV( p
-> symbol
, bn
, p
-> value
[ NL_OFFS
] ,
error("%s %s cannot be qualified" , typename
,
error("Built-in %s %s cannot be passed as a parameter" ,
typename
, p
-> symbol
);
* allocate space for the thunk
tempnlp
= tmpalloc( sizeof ( struct formalrtn
) ,
put(2 , O_LV
| cbn
<< 8 + INDX
,
(int)tempnlp
-> value
[ NL_OFFS
] );
put(2, O_FSAV
| bn
<< 8, (long)p
->entloc
);
putleaf( P2ICON
, 0 , 0 ,
ADDTYPE( P2PTR
, ADDTYPE( P2FTN
, P2PTR
|P2STRTY
) ) ,
sprintf( extname
, "%s" , FORMALPREFIX
);
sextname( &extname
[ strlen( extname
) ] ,
putleaf( P2ICON
, 0 , 0 , p2type( p
) , extname
);
putleaf( P2ICON
, bn
, 0 , P2INT
, 0 );
putop( P2LISTOP
, P2INT
);
putLV( 0 , cbn
, tempnlp
-> value
[NL_OFFS
] ,
tempnlp
-> extra_flags
, P2STRTY
);
putop( P2LISTOP
, P2INT
);
putop( P2CALL
, P2PTR
| P2STRTY
);
error("Variable given, %s required for %s parameter %s" ,
typename
, typename
, formalp
-> symbol
);