Annotation of 43BSD/contrib/icon/lib/efail.s, revision 1.1.1.1

1.1       root        1: #include "../h/config.h"
                      2: 
                      3: /*
                      4:  * efail - handles the failure of an expression.  efail is used
                      5:  *  by a number of routines.  Its task to resume the newest
                      6:  *  inactive generator in the current expression frame.  If
                      7:  *  no such generator exists, the expression frame is exited
                      8:  *  and execution continues at the point indicated in the
                      9:  *  expression marker.  If the marker has a 0 address for
                     10:  *  the point to continue at, efail is called to fail again.
                     11:  */
                     12: 
                     13: Global(_interp)                /* interpreter loop */
                     14: Global(_atrace)                /* trace generator reactivations */
                     15: Global(_boundary)      /* Icon/C boundary address */
                     16: Global(_line)          /* current line number */
                     17: Global(_file)          /* current file name */
                     18: Global(_k_level)       /* value of &level */
                     19: Global(_k_trace)       /* value of &trace */
                     20: 
                     21: Global(_efail)
                     22: /*
                     23:  * Note that efail is jumped to.
                     24:  */
                     25: #ifdef VAX
                     26: _efail:
                     27:        tstl    gfp             # gfp points to the most recent generator
                     28:                                #  frame.  If it's 0, there is no inactive
                     29:        jeql    nogen           #  generator in this expression frame and
                     30:                                #  the frame is exited.
                     31: 
                     32: /*
                     33:  * There is an inactive generator in this expression frame. It
                     34:  *  must be reactivated.
                     35:  */
                     36:        movl    (gfp),_boundary # Restore boundary address from that
                     37:                                #  stored in the generator frame.
                     38:        movl    fp,r0           # Save fp value for testing later.
                     39:                                # The fp must be restored.  gfp points
                     40:        movl    gfp,fp          #  at the word before the former top
                     41:        tstl    (fp)+           #  of stack.  The fp is loaded from
                     42:                                #  gfp and then incremented by 4.
                     43: /*
                     44:  * Trace resumption if &trace is set and if generator is an Icon procedure.
                     45:  */
                     46:        tstl    _k_trace        # If &trace is 0,
                     47:        jeql    tracedone       #  no tracing.
                     48:        cmpl    _boundary,fp    # If the boundary is not the same as the
                     49:        jneq    tracedone       #  fp, the generator is not an Icon procedure.
                     50:        movl    12(fp),efp      # Point efp at saved fp in generator frame.
                     51:                                #  If efp is the same as the fp was upon
                     52:        cmpl    efp,r0          #  entry to efail, then generator is 
                     53:        jeql    tracedone       #  control regime
                     54:                                #
                     55:                                # Otherwise, an Icon procedure is to be
                     56:                                #  resumed.  atrace handles the tracing,
                     57:                                #  and takes the address of the procedure
                     58:                                #  block as it's only argument.  arg0 is
                     59:                                #  is the descriptor for the block.  It is
                     60:                                #  located using:
                     61:                                #   &arg0 = (ap + 8 + 8*nargs)
                     62:        movl    8(fp),r4        # r4 = old ap
                     63:        ashl    $3,4(r4),r2     # r2 = nargs * 8
                     64:        addl2   r4,r2           # ... + old ap
                     65:        addl2   $8,r2           # ... + 8
                     66:        pushl   4(r2)           # r2 points to descriptor, push address
                     67:                                #  residing in second word.
                     68:        calls   $1,_atrace      # atrace(&arg0)
                     69: /*
                     70:  * Resume the generator.
                     71:  */
                     72: tracedone:
                     73:        movl    -(gfp),_k_level # Restore &level
                     74:        movl    -(gfp),_line    # Restore _line and
                     75:        movl    -(gfp),_file    #  _file from the generator frame.
                     76: 
                     77:        cmpl    _boundary,fp    # If the boundary is the same as the
                     78:        bneq    f3              #  fp, the return if from Icon to C
                     79:        clrl    _boundary       #  and the boundary is cleared.
                     80: f3:
                     81:        ret                     # All set, return.  This return
                     82:                                #  will sweep off the generator frame
                     83:                                #  on the top of the stack and resume
                     84:                                #  execution after point where the
                     85:                                #  suspension that created this generator
                     86:                                #  was performed.
                     87: 
                     88: /* 
                     89:  * There are no inactive generators in the expression frame, thus
                     90:  *  the expression fails.  If the failure label in the expression
                     91:  *  frame marker is not 0, execution resumes at the indicated address.
                     92:  *  Otherwise, failure in the surrounding expression is signaled by
                     93:  *  looping back to efail.
                     94:  */
                     95: nogen:
                     96:        movl    -8(efp),ipc     # Point ipc at failure label from expression
                     97:                                #  frame.  Note that this is always a
                     98:                                #  ucode address.
                     99:        movl    -4(efp),gfp     # Restore old generator frame pointer from
                    100:                                #  expression frame marker.
                    101:        movl    efp,sp          # Move sp back to point at expression frame
                    102:                                #  marker.
                    103:        movl    (sp)+,efp       # Restore old expression frame pointer and
                    104:                                #  move sp up to previous word.  Moving
                    105:                                #  the sp up effectively removes the
                    106:                                #  expression marker from the stack.
                    107:        tstl    ipc             # If the failure label in the expression
                    108:                                #  frame is 0, this expression fails
                    109:        jeql    _efail          #  by branching back to efail.
                    110:        jmp     _interp         # Otherwise, execution continues. (at
                    111:                                #  address in ipc)
                    112: 
                    113: #endif VAX
                    114: 
                    115: #ifdef PORT
                    116: DummyFcn(_efail)
                    117: #endif PORT
                    118: 
                    119: #ifdef PDP11
                    120: / efail - reactivate newest inactive generator within current
                    121: / expression frame.  If there are none, exit the expression
                    122: / frame and take the failure branch (stored in the expression
                    123: / frame marker).
                    124: Global(cret)
                    125: _efail:
                    126:        tst     r3              / test for inactive generators,
                    127:        beq     1f              /   branch if none
                    128: 
                    129: / Reactivate newest inactive generator.
                    130: 
                    131:        mov     (r3),_boundary  / restore Icon/C boundary address
                    132:        mov     r5,r0           / save procedure frame pointer
                    133:        mov     r3,r5           / restore procedure frame pointer
                    134:        add     $8.,r5
                    135: 
                    136: / Trace reactivation if &trace is set and if generator is an Icon procedure.
                    137: 
                    138:        tst     _k_trace
                    139:        beq     2f
                    140:        cmp     _boundary,r5    / if boundary == r5, then
                    141:        bne     2f              /   generator is an Icon procedure
                    142:        mov     (r5),r4         / r4 <- address of procedure frame
                    143:        cmp     r4,r0           / if hidden procedure frame is same as current,
                    144:        beq     2f              /   then generator is control regime
                    145:        mov     4(r4),r2        / r2 <- nargs * 4
                    146:        asl     r2
                    147:        asl     r2
                    148:        add     r4,r2           / push address of procedure block,
                    149:        mov     8.(r2),-(sp)    /   which is pointer field of arg0
                    150:        jsr     pc,_atrace
                    151:        
                    152: / Restore &level, line number, and file name, and return to generator.
                    153: 
                    154: 2:
                    155:        mov     -(r3),_k_level
                    156:        mov     -(r3),_line
                    157:        mov     -(r3),_file
                    158:        jmp     cret
                    159: 
                    160: / Exit expression frame and signal failure again.
                    161: 
                    162: 1:
                    163:        mov     -4(r4),r2       / get failure label
                    164:        mov     -2(r4),r3       / exit current expression frame
                    165:        mov     r4,sp           
                    166:        mov     (sp)+,r4
                    167:        tst     r2              / is failure label zero?
                    168:        beq     _efail          /   yes, pass failure to outer expression
                    169:        jmp     _interp         /   no, resume interpreting at failure label
                    170: 
                    171: #endif PDP11

unix.superglobalmegacorp.com

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