Annotation of 3BSD/cmd/lisp/lib/trace.l, revision 1.1

1.1     ! root        1: ;---- The Joseph Lister Trace Package, v1
        !             2: ;         John Foderaro, Sept 1979
        !             3: ;------------------------------------------------------------------;
        !             4: ; Copyright (c) 1979 The Regents of the University of California   ;
        !             5: ;      All rights reserved.                                       ;
        !             6: ;------------------------------------------------------------------;
        !             7: (eval-when (eval)
        !             8:   (setq old-read-table-trace readtable)
        !             9:   (setq readtable (makereadtable t))
        !            10:   (load 'backquote))
        !            11: (cond ((null (boundp '$$traced-functions$$)) (setq $$traced-functions$$ nil)))
        !            12: (setq $$trace-indent$$ 0)
        !            13: 
        !            14: ;----> It is important that the trace package not use traced functions
        !            15: ;      thus we give the functions the trace package uses different
        !            16: ;      names and make them equivalent at this time to their 
        !            17: ;      traceable counterparts.  
        !            18: 
        !            19: (do ((i '( (add1 T-add1)(append T-append)
        !            20:           (apply T-apply)(atom T-atom)(bcdp T-bcdp)
        !            21:           (car T-car)(cadr T-cadr)(cdr T-cdr)(cons T-cons) (delq T-delq)
        !            22:           (drain T-drain)
        !            23:           (dtpr T-dtpr) (eq T-eq) (eval T-eval)(funcall T-funcall)
        !            24:           (get T-get) (getd T-getd)(getdisc T-getdisc)
        !            25:           (greaterp T-greaterp)(memq T-memq)(not T-not)
        !            26:           (null T-null) (patom T-patom) (print T-print) 
        !            27:           (prog T-prog)
        !            28:           (or T-or) (patom T-patom)(putd T-putd) 
        !            29:           (putprop T-putprop)
        !            30:           (read T-read)(remprop T-remprop) (reverse T-reverse)
        !            31:           (set T-set)
        !            32:           (setq T-setq) (sub1 T-sub1) (terpr T-terpr)
        !            33:           (zerop T-zerop))
        !            34:        (cdr i)))
        !            35:     ((null i))
        !            36:     (putd (cadar i) (getd (caar i)))
        !            37:     (putprop (cadar i) t 'Untraceable))
        !            38: 
        !            39: ;--- trace - arg1,arg2, ... names of functions to trace
        !            40: ;      This is the main user callable trace routine. 
        !            41: ; work in progress, documentation incomplete since im not sure exactly
        !            42: ; where this is going. 
        !            43: ;
        !            44: (def trace
        !            45:   (nlambda (argl)
        !            46:    (prog (if ifnot evalin evalout funnm funcd did break)
        !            47: 
        !            48:     ; process each argument     
        !            49: 
        !            50:     (do ((ll argl (cdr ll))
        !            51:         (funnm) 
        !            52:         (funcd))
        !            53:        ((T-null ll))
        !            54:        (T-setq funnm (car ll)
        !            55:                if t
        !            56:                break nil
        !            57:                ifnot nil
        !            58:                evalin nil
        !            59:                evalout nil)
        !            60: 
        !            61:        ; a list as an argument means that the user is specifying
        !            62:        ; conditions on the trace
        !            63:        (cond ((T-not (atom funnm))
        !            64:               (cond ((T-not (T-atom (T-setq funnm (car funnm))))
        !            65:                      (T-print (car funnm))
        !            66:                      (T-patom '" is non an function name")
        !            67:                      (go botloop)))
        !            68:               (do ((rr (cdar ll) (cdr rr)))
        !            69:                   ((T-null rr))
        !            70:                   (cond ((T-memq (T-car rr) '(if ifnot evalin evalout))
        !            71:                          (T-set (T-car rr) (T-cadr rr))
        !            72:                          (T-setq rr    (T-cdr rr)))
        !            73:                         ((T-eq (T-car rr) 'evalinout)
        !            74:                          (T-setq evalin (T-setq evalout (T-cadr rr))
        !            75:                                rr (T-cdr rr)))
        !            76:                         ((T-eq (T-car rr) 'break)
        !            77:                          (T-setq break t))
        !            78:                         (t (T-patom '"bad request ")
        !            79:                            (T-print (T-car rr)))))))
        !            80: 
        !            81: 
        !            82:         ; if function is already traced, untrace it first
        !            83:         (cond ((get funnm 'T-original) 
        !            84:                (apply 'untrace `(,funnm))
        !            85:                (T-setq did (T-cons `(,funnm untraced) did))))
        !            86: 
        !            87:         ; we must determine the type of function being traced
        !            88:         ; in order to create the correct replacement function  
        !            89: 
        !            90:         (cond ((T-setq funcd (T-getd funnm))
        !            91:               (cond ((T-bcdp funcd)            ; machine code
        !            92:                      (cond ((T-eq 'lambda (T-getdisc funcd))
        !            93:                             (T-setq typ 'lambda))
        !            94:                            ((T-eq 'nlambda (T-getdisc funcd))
        !            95:                             (T-setq typ 'nlambda))
        !            96:                            (t (T-patom '"Unknown type of compiled function")
        !            97:                               (T-print funnm)
        !            98:                               (T-setq typ nil))))
        !            99: 
        !           100:                     ((T-dtpr funcd)            ; lisp coded
        !           101:                      (cond ((T-or (T-eq 'lambda (T-car funcd))
        !           102:                                 (T-eq 'lexpr (T-car funcd)))
        !           103:                             (T-setq typ 'lambda))
        !           104:                            ((T-or (T-eq 'nlambda (T-car funcd))
        !           105:                                   (T-eq 'macro (T-car funcd)))
        !           106:                             (T-setq typ 'nlambda))
        !           107:                            (t (T-patom '"Bad function definition: ")
        !           108:                               (T-print funnm)
        !           109:                               (T-setq typ nil))))
        !           110:                     (t (T-patom '"Bad function defintion: ")
        !           111:                        (T-print funnm)))
        !           112:               
        !           113:               ; now that the arguments have been examined for this
        !           114:               ; function, do the tracing stuff.
        !           115:               ; First save the old function on the property list
        !           116: 
        !           117:               (T-putprop funnm funcd 'T-original)
        !           118: 
        !           119:               ; now build a replacement
        !           120: 
        !           121:               (cond ((T-eq typ 'lambda)
        !           122:                      (T-eval 
        !           123:                           `(def ,funnm
        !           124:                              (lexpr (nargs)
        !           125:                                (prog (T-arglst T-res T-rslt)    
        !           126:                                      (do ((i nargs (T-sub1 i)))
        !           127:                                          ((T-zerop i))
        !           128:                                          (T-setq T-arglst 
        !           129:                                                  (T-cons (arg i) T-arglst)))
        !           130:                                      (cond ((T-setq T-res 
        !           131:                                                   (and ,if
        !           132:                                                        (not ,ifnot)))
        !           133:                                             (T-traceenter ,funnm)
        !           134:                                             (T-print T-arglst)
        !           135:                                             (T-terpr)
        !           136:                                             ,evalin
        !           137:                                             (cond (,break (trace-break)))))
        !           138:                                      (T-setq T-rslt 
        !           139:                                            (T-apply ',funcd T-arglst))
        !           140:                                      (cond (T-res 
        !           141:                                             ,evalout 
        !           142:                                             (T-traceexit ',funnm T-rslt)
        !           143:                                             (T-terpr)))
        !           144:                                      (return T-rslt)))))
        !           145:                      (T-setq did (T-cons funnm did)
        !           146:                              $$traced-functions$$ (cons funnm
        !           147:                                                         $$traced-functions$$)))
        !           148: 
        !           149:                     ((T-eq typ 'nlambda)
        !           150:                      (T-eval 
        !           151:                       `(def ,funnm
        !           152:                            (nlambda (T-arglst)
        !           153:                                     (prog ( T-res T-rslt)       
        !           154:                                           (cond ((T-setq T-res 
        !           155:                                                          (and ,if
        !           156:                                                               (not ,ifnot)))
        !           157:                                                  (T-traceenter ,funnm)
        !           158:                                                  (T-print T-arglst)
        !           159:                                                  (T-terpr)
        !           160:                                                  ,evalin
        !           161:                                                  (cond (,break (trace-break)))))
        !           162:                                           (T-setq T-rslt 
        !           163:                                                   (T-apply ',funcd T-arglst))
        !           164:                                           (cond (T-res 
        !           165:                                                  ,evalout 
        !           166:                                                  (T-traceexit ',funnm T-rslt)
        !           167:                                                  (T-terpr)))
        !           168:                                           (return T-rslt)))))
        !           169:                      (T-setq did (T-cons funnm did)
        !           170:                              $$traced-functions$$ (T-cons funnm
        !           171:                                                           $$traced-functions$$)))
        !           172:                     
        !           173:                     (t (T-patom '"No such function as: ")
        !           174:                        (T-print funnm)
        !           175:                        (T-terpr))))))
        !           176:         (return (nreverse did)))))
        !           177: 
        !           178: 
        !           179: 
        !           180: (def untrace
        !           181:   (nlambda (argl)
        !           182:           (cond ((T-null argl) (T-setq argl $$traced-functions$$)))
        !           183: 
        !           184:           (do ((i argl (T-cdr i))
        !           185:                (curf)
        !           186:                (res))
        !           187:               ((T-null i)  
        !           188:                (cond ((T-null $$traced-functions$$)
        !           189:                       (T-setq $$trace-indent$$ 0)))
        !           190:                res)
        !           191:               (cond ((T-setq tmp (T-get (T-setq curf (T-car i)) 'T-original))
        !           192:                      (T-putd curf tmp)
        !           193:                      (T-remprop curf 'T-original)
        !           194:                      (T-remprop curf 'entercount)
        !           195:                      (T-setq $$traced-functions$$ 
        !           196:                              (T-delq curf $$traced-functions$$))
        !           197:                      (T-setq res (T-cons curf res)))
        !           198:                     (t (T-setq res (T-cons `(,curf not traced) res)))))))
        !           199: 
        !           200: 
        !           201: ;--- T-traceenter - funnm : name of function just entered
        !           202: ;                - count : count to print out
        !           203: ;      This routine is called to print the entry banner for a
        !           204: ;      traced function.
        !           205: ;
        !           206: (def T-traceenter
        !           207:   (nlambda (nm)
        !           208:           (T-prog (name count)
        !           209:                 (T-setq name (T-car nm))
        !           210:                 (cond ((T-null (T-setq count (T-get name 'entercount)))
        !           211:                        (T-setq count 1)))
        !           212:                 (T-putprop name (add1 count) 'entercount)
        !           213: 
        !           214:                 (do ((i 1 (T-add1 i)))
        !           215:                     ((T-greaterp i $$trace-indent$$))
        !           216:                     (T-patom '" "))
        !           217:                 (T-setq $$trace-indent$$ (T-add1 $$trace-indent$$))
        !           218:                 (T-print count)
        !           219:                 (T-patom '" <Enter> ")
        !           220:                 (T-print name)
        !           221:                 (T-patom '" "))))
        !           222: 
        !           223: (def T-traceexit
        !           224:   (lambda (name retval)
        !           225:          (T-prog (count)
        !           226:                (T-putprop name 
        !           227:                         (T-setq count (T-sub1 (T-get name 'entercount)))
        !           228:                         'entercount)
        !           229:                (do ((i 1 (T-add1 i))
        !           230:                     (over (T-setq $$trace-indent$$ (T-sub1 $$trace-indent$$))))
        !           231:                    ((T-greaterp i over))
        !           232:                    (T-patom '" "))
        !           233: 
        !           234:                (T-print count)
        !           235:                (T-patom '" <EXIT>  ")
        !           236:                (T-print name)
        !           237:                (T-patom '"  ")
        !           238:                (T-print retval)
        !           239:                (return retval))))
        !           240: 
        !           241: ; trace-break  - this is the trace break loop
        !           242: (def trace-break
        !           243:   (lambda nil
        !           244:         (prog (tracevalread)
        !           245:               (T-terpr) (T-patom '"[tracebreak]")
        !           246:        loop   (T-terpr)
        !           247:               (T-patom '"T>")
        !           248:               (T-drain)
        !           249:               (cond ((eq '<EOF> (T-setq tracevalread
        !           250:                                         (car
        !           251:                                          (errset (T-read nil '<EOF>)))))
        !           252:                      (return nil)))
        !           253:               (T-print (car (errset (T-eval tracevalread))))
        !           254:               (go loop))))
        !           255: 
        !           256: (eval-when (eval)
        !           257:   (setq readtable old-read-table-trace))

unix.superglobalmegacorp.com

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