Annotation of 43BSD/ucb/pascal/src/flvalue.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1980 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  */
                      6: 
                      7: #ifndef lint
                      8: static char sccsid[] = "@(#)flvalue.c  5.1 (Berkeley) 6/5/85";
                      9: #endif not lint
                     10: 
                     11: #include "whoami.h"
                     12: #include "0.h"
                     13: #include "tree.h"
                     14: #include "opcode.h"
                     15: #include "objfmt.h"
                     16: #include "tree_ty.h"
                     17: #ifdef PC
                     18: #   include "pc.h"
                     19: #   include <pcc.h>
                     20: #endif PC
                     21: #include "tmps.h"
                     22: 
                     23:     /*
                     24:      * flvalue generates the code to either pass on a formal routine,
                     25:      * or construct the structure which is the environment for passing.
                     26:      * it tells the difference by looking at the tree it's given.
                     27:      */
                     28: struct nl *
                     29: flvalue( r , formalp )
                     30:     struct tnode *r;   /* T_VAR */
                     31:     struct nl  *formalp;
                     32:     {
                     33:        struct nl       *p;
                     34:        struct nl       *tempnlp;
                     35:        char            *typename;
                     36: #ifdef PC
                     37:        char            extname[ BUFSIZ ];
                     38: #endif PC
                     39: 
                     40:        if ( r == TR_NIL ) {
                     41:            return NLNIL;
                     42:        }
                     43:        typename = formalp -> class == FFUNC ? "function":"procedure";
                     44:        if ( r->tag != T_VAR ) {
                     45:            error("Expression given, %s required for %s parameter %s" ,
                     46:                    typename , typename , formalp -> symbol );
                     47:            return NLNIL;
                     48:        }
                     49:        p = lookup(r->var_node.cptr);
                     50:        if (p == NLNIL) {
                     51:            return NLNIL;
                     52:        }
                     53:        switch ( p -> class ) {
                     54:            case FFUNC:
                     55:            case FPROC:
                     56:                    if ( r->var_node.qual != TR_NIL ) {
                     57:                        error("Formal %s %s cannot be qualified" ,
                     58:                                typename , p -> symbol );
                     59:                        return NLNIL;
                     60:                    }
                     61: #                  ifdef OBJ
                     62:                        (void) put(2, PTR_RV | bn << 8+INDX, (int)p->value[NL_OFFS]);
                     63: #                  endif OBJ
                     64: #                  ifdef PC
                     65:                        putRV( p -> symbol , bn , p -> value[ NL_OFFS ] , 
                     66:                                p -> extra_flags ,
                     67:                                p2type( p ) );
                     68: #                  endif PC
                     69:                    return p;
                     70:            case FUNC:
                     71:            case PROC:
                     72:                    if ( r->var_node.qual != TR_NIL ) {
                     73:                        error("%s %s cannot be qualified" , typename ,
                     74:                                p -> symbol );
                     75:                        return NLNIL;
                     76:                    }
                     77:                    if (bn == 0) {
                     78:                        error("Built-in %s %s cannot be passed as a parameter" ,
                     79:                                typename , p -> symbol );
                     80:                        return NLNIL;
                     81:                    }
                     82:                        /*
                     83:                         *      allocate space for the thunk
                     84:                         */
                     85:                    tempnlp = tmpalloc((long) (sizeof(struct formalrtn)), NLNIL, NOREG);
                     86: #                  ifdef OBJ
                     87:                        (void) put(2 , O_LV | cbn << 8 + INDX ,
                     88:                                (int)tempnlp -> value[ NL_OFFS ] );
                     89:                        (void) put(2, O_FSAV | bn << 8, (long)p->value[NL_ENTLOC]);
                     90: #                  endif OBJ
                     91: #                  ifdef PC
                     92:                        putleaf( PCC_ICON , 0 , 0 ,
                     93:                            PCCM_ADDTYPE( PCCTM_PTR , PCCM_ADDTYPE( PCCTM_FTN , PCCTM_PTR|PCCT_STRTY ) ) ,
                     94:                            "_FSAV" );
                     95:                        sprintf( extname , "%s" , FORMALPREFIX );
                     96:                        sextname( &extname[ strlen( extname ) ] ,
                     97:                                    p -> symbol , bn );
                     98:                        putleaf( PCC_ICON , 0 , 0 , p2type( p ) , extname );
                     99:                        putleaf( PCC_ICON , bn , 0 , PCCT_INT , (char *) 0 );
                    100:                        putop( PCC_CM , PCCT_INT );
                    101:                        putLV( (char *) 0 , cbn , tempnlp -> value[NL_OFFS] ,
                    102:                                tempnlp -> extra_flags , PCCT_STRTY );
                    103:                        putop( PCC_CM , PCCT_INT );
                    104:                        putop( PCC_CALL , PCCTM_PTR | PCCT_STRTY );
                    105: #                  endif PC
                    106:                    return p;
                    107:            default:
                    108:                    error("Variable given, %s required for %s parameter %s" ,
                    109:                            typename , typename , formalp -> symbol );
                    110:                    return NLNIL;
                    111:        }
                    112:     }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.