# 2.11BSD#431 - /usr/src/ucb/PORT/pascal/pdx/runtime/address.c

##### Functions

    address           X
    findbeginning     X
    firstline         X
    lastaddr          X
    runtofirst        X

       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[] = "@(#)address.c	5.1 (Berkeley) 6/6/85";
       9: #endif not lint
      10:
      11: /*
      12:  * Some machine and runtime dependent manipulation of a symbol.
      13:  */
      14:
      15: #include "defs.h"
      16: #include "runtime.h"
      17: #include "sym.h"
      18: #include "machine.h"
      19: #include "process.h"
      20: #include "object.h"
      21: #include "mappings.h"
      22: #include "sym/classes.h"
      23: #include "frame.rep"
      24: #include "sym/sym.rep"
      25:
      26: /*
      27:  * Calculate the address of a symbol.
      28:  * If frame is not NIL, then it is the frame associated with the
      29:  * activation in which the symbol we're interested in is defined.
      30:  */
      31:
      32: ADDRESS address(s, frame)
      33: register SYM *s;
      34: FRAME *frame;
      35: {
      36:     SYM *f;
      37:     FRAME *frp;
      38:     ADDRESS r, *dp, *disp;
      39:     short offs;
      40:
      41:     f = s->func;
      42:     if (s->class == FVAR) {
      43:     offs = f->symvalue.offset;
      44:     } else {
      45:     offs = s->symvalue.offset;
      46:     }
      47:     if (f == program) {
      48:     r = (ADDRESS) dispval(MAINBLK) + offs;
      49:     } else if (f == curfunc && frame == NIL) {
      50:     dp = curdp();
      51:     disp = contents(dp);
      52:     r = (ADDRESS) disp + offs;
      53:     } else {
      54:     if (frame == NIL) {
      55:         frp = findframe(s->func);
      56:         if (frp == NIL) {
      57:         panic("address: findframe returned NIL");
      58:         }
      59:     } else {
      60:         frp = frame;
      61:     }
      62:     r = stkaddr(frp, s->blkno) + offs;
      63:     }
      64:     return r;
      65: }
      66:
      67: /*
      68:  * The next three routines assume the procedure entry code is
      69:  *
      70:  *      f:  tra4    A
      71:  *          ...
      72:  *      A:  beg
      73:  *      B:  <code for first line>
      74:  *
      75:  * Pi gives f, we compute and store A with "findbeginning(f)",
      76:  * (retrieved by "codeloc(f)"), B is computed by "firstline(f)".
      77:  *
      78:  * The procedure "runtofirst" assumes you're at A and want to step to B.
      79:  * It should be changed to a nop if A is equal to B.
      80:  */
      81:
      82: /*
      83:  * Find the beginning of a procedure or function.  This is a destructive
      84:  * routine, it changes the value associated with the procedure symbol.
      85:  * Should only be called once per symbol.
      86:  */
      87:
      88: findbeginning(f)
      89: SYM *f;
      90: {
      91:     f->symvalue.funcv.codeloc = nextaddr(f->symvalue.funcv.codeloc, FALSE);
      92: }
      93:
      94: /*
      95:  * Find the object code associated with the first line of a block.
      96:  */
      97:
      98: ADDRESS firstline(f)
      99: SYM *f;
     100: {
     101:     ADDRESS addr;
     102:
     103:     addr = codeloc(f);
     104:     while (linelookup(addr) == 0) {
     105:     if (isendofproc(addr)) {
     106:         return -1;
     107:     }
     108:     addr = nextaddr(addr, FALSE);
     109:     }
     110:     return addr;
     111: }
     112:
     113: /*
     114:  * Catcher drops strike three ...
     115:  */
     116:
     117: runtofirst()
     118: {
     119:     stepto(firstline(curfunc));
     120: }
     121:
     122: /*
     123:  * Calculate the address of the last line in the program.
     124:  * This is assumed to be at the physical end.
     125:  */
     126:
     127: ADDRESS lastaddr()
     128: {
     129:     if (objsize == 0) {
     130:     panic("lastaddr: objsize = 0!");
     131:     }
     132:     return(objsize - sizeof(short));
     133: }

#### Defined functions

address defined in line 32; never used
findbeginning defined in line 88; never used
firstline defined in line 98; used 2 times

- in line 119
- in /usr/src/ucb/PORT/pascal/pdx/runtime/callproc.c line 46

lastaddr defined in line 127; used 1 times

- in /usr/src/ucb/PORT/pascal/pdx/runtime/entry.c line 77

runtofirst defined in line 117; never used

#### Defined variables

sccsid defined in line 8; never used

Last modified: 1985-06-06 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 723 |