|
|
1.1 ! root 1: (include-if (null (get 'chead 'version)) "../chead.l") ! 2: (Liszt-file datab ! 3: "$Header: datab.l,v 1.5 83/08/28 17:14:27 layer Exp $") ! 4: ! 5: ;;; ---- d a t a b data base ! 6: ;;; ! 7: ;;; -[Sat Aug 6 23:59:11 1983 by layer]- ! 8: ! 9: ;--- d-tranloc :: locate a function in the transfer table ! 10: ; ! 11: ; return the offset we should use for this function call ! 12: ; ! 13: (defun d-tranloc (fname) ! 14: (cond ((get fname g-tranloc)) ! 15: (t (Push g-tran fname) ! 16: (let ((newval (* 8 g-trancnt))) ! 17: (putprop fname newval g-tranloc) ! 18: (incr g-trancnt) ! 19: newval)))) ! 20: ! 21: ! 22: ;--- d-loc :: return the location of the variable or value in IADR form ! 23: ; - form : form whose value we are to locate ! 24: ; ! 25: ; if we are given a xxx as form, we check yyy; ! 26: ; xxx yyy ! 27: ; -------- --------- ! 28: ; nil Nil is always returned ! 29: ; symbol return the location of the symbols value, first looking ! 30: ; in the registers, then on the stack, then the bind list. ! 31: ; If g-ingorereg is t then we don't check the registers. ! 32: ; We would want to do this if we were interested in storing ! 33: ; something in the symbol's value location. ! 34: ; number always return the location of the number on the bind ! 35: ; list (as a (lbind n)) ! 36: ; other always return the location of the other on the bind ! 37: ; list (as a (lbind n)) ! 38: ; ! 39: (defun d-loc (form) ! 40: (if (null form) then 'Nil ! 41: elseif (numberp form) then ! 42: (if (and (fixp form) (greaterp form -1025) (lessp form 1024)) ! 43: then `(fixnum ,form) ; small fixnum ! 44: else (d-loclit form nil)) ! 45: elseif (symbolp form) ! 46: then (if (and (null g-ignorereg) (car (d-bestreg form nil))) thenret ! 47: else (if (d-specialp form) then (d-loclit form t) ! 48: else (do ((ll g-locs (cdr ll)) ; check stack ! 49: (n g-loccnt)) ! 50: ((null ll) ! 51: (comp-warn (or form) ! 52: " declared special by compiler") ! 53: (d-makespec form) ! 54: (d-loclit form t)) ! 55: (if (atom (car ll)) ! 56: then (if (eq form (car ll)) ! 57: then (return `(stack ,n)) ! 58: else (setq n (1- n))))))) ! 59: else (d-loclit form nil))) ! 60: ! 61: ! 62: ;--- d-loclit :: locate or add litteral to bind list ! 63: ; - form : form to check for and add if not present ! 64: ; - flag : if t then if we are given a symbol, return the location of ! 65: ; its value, else return the location of the symbol itself ! 66: ; ! 67: ; scheme: we share the locations of atom (symbols,numbers,string) but always ! 68: ; create a fresh copy of anything else. ! 69: (defun d-loclit (form flag) ! 70: (prog (loc onplist symboltype) ! 71: (if (null form) ! 72: then (return 'Nil) ! 73: elseif (symbolp form) ! 74: then (setq symboltype t) ! 75: (cond ((setq loc (get form g-bindloc)) ! 76: (setq onplist t))) ! 77: elseif (atom form) ! 78: then (do ((ll g-lits (cdr ll)) ; search for atom on list ! 79: (n g-litcnt (1- n))) ! 80: ((null ll)) ! 81: (if (eq form (car ll)) ! 82: then (setq loc n) ; found it ! 83: (return)))) ; leave do ! 84: (if (null loc) ! 85: then (Push g-lits form) ! 86: (setq g-litcnt (1+ g-litcnt) ! 87: loc g-litcnt) ! 88: (cond ((and symboltype (null onplist)) ! 89: (putprop form loc g-bindloc)))) ! 90: ! 91: (return (if (and flag symboltype) then `(bind ,loc) ! 92: else `(lbind ,loc))))) ! 93: ! 94: ! 95: ! 96: ;--- d-locv :: find the location of a value cell, and dont return a register ! 97: ; ! 98: (defun d-locv (sm) ! 99: (let ((g-ignorereg t)) ! 100: (d-loc sm))) ! 101: ! 102: ! 103: ;--- d-simple :: see of arg can be addresses in one instruction ! 104: ; we define simple and really simple as follows ! 105: ; <rsimple> ::= number ! 106: ; quoted anything ! 107: ; local symbol ! 108: ; t ! 109: ; nil ! 110: ; <simple> ::= <rsimple> ! 111: ; (cdr <rsimple>) ! 112: ; global symbol ! 113: ; ! 114: (defun d-simple (arg) ! 115: (let (tmp) ! 116: (if (d-rsimple arg) thenret ! 117: elseif (atom arg) then (d-loc arg) ! 118: elseif (and (memq (car arg) '(cdr car cddr cdar)) ! 119: (setq tmp (d-rsimple (cadr arg)))) ! 120: then (if (eq 'Nil tmp) then tmp ! 121: elseif (atom tmp) ! 122: then #+for-vax ! 123: (if (eq 'car (car arg)) ! 124: then `(racc 4 ,tmp) ! 125: elseif (eq 'cdr (car arg)) ! 126: then `(racc 0 ,tmp) ! 127: elseif (eq 'cddr (car arg)) ! 128: then `(racc * 0 ,tmp) ! 129: elseif (eq 'cdar (car arg)) ! 130: then `(racc * 4 ,tmp)) ! 131: #+for-68k ! 132: (if (eq 'car (car arg)) ! 133: then `(racc 4 ,tmp) ! 134: elseif (eq 'cdr (car arg)) ! 135: then `(racc 0 ,tmp)) ! 136: elseif (not (eq 'cdr (car arg))) ! 137: then nil ! 138: elseif (eq 'lbind (car tmp)) ! 139: then `(bind ,(cadr tmp)) ! 140: elseif (eq 'stack (car tmp)) ! 141: then `(vstack ,(cadr tmp)) ! 142: elseif (eq 'fixnum (car tmp)) ! 143: then `(immed ,(cadr tmp)) ! 144: elseif (atom (car tmp)) ! 145: then `(0 ,(cadr tmp)) ! 146: else (comp-err "bad arg to d-simple: " (or arg)))))) ! 147: ! 148: (defun d-rsimple (arg) ! 149: (if (atom arg) then ! 150: (if (null arg) then 'Nil ! 151: elseif (eq t arg) then 'T ! 152: elseif (or (numberp arg) ! 153: (memq arg g-locs)) ! 154: then (d-loc arg) ! 155: else (car (d-bestreg arg nil))) ! 156: elseif (eq 'quote (car arg)) then (d-loclit (cadr arg) nil))) ! 157: ! 158: ;--- d-specialp :: check if a variable is special ! 159: ; a varible is special if it has been declared as such, or if ! 160: ; the variable special is t ! 161: (defun d-specialp (vrb) ! 162: (or special ! 163: (eq 'special (d-findfirstprop vrb 'bindtype)) ; local special decl ! 164: (eq 'special (get vrb g-bindtype)))) ! 165: ! 166: (defun d-fixnump (vrb) ! 167: (and (symbolp vrb) ! 168: (or (eq 'fixnum (d-findfirstprop vrb 'vartype)) ! 169: (eq 'fixnum (get vrb g-vartype))))) ! 170: ! 171: ;--- d-functyp :: return the type of function ! 172: ; - name : function name ! 173: ; ! 174: ; If name had a macro function definition, we return `macro'. Otherwise ! 175: ; we see if name as a declared type, if so we return that. Otherwise ! 176: ; we see if name is defined and we return that if so, and finally if ! 177: ; we have no idea what this function is, we return lambda. ! 178: ; This is not really satisfactory, but will handle most cases. ! 179: ; ! 180: ; If macrochk is nil then we don't check for the macro case. This ! 181: ; is important to prevent recursive macroexpansion. ! 182: ; ! 183: (defun d-functyp (name macrochk) ! 184: (let (func ftyp) ! 185: (if (atom name) ! 186: then ! 187: (setq func (getd name)) ! 188: (setq ftyp (if (and macrochk (get name 'cmacro)) ;compiler macro ! 189: then 'cmacro ! 190: elseif (bcdp func) ! 191: then (let ((type (getdisc func))) ! 192: (if (memq type '(lambda nlambda macro)) ! 193: then type ! 194: elseif (stringp type) ! 195: then 'lambda ; foreign function ! 196: else (comp-warn ! 197: "function " ! 198: name ! 199: " has a strange discipline " ! 200: type) ! 201: 'lambda ; assume lambda ! 202: )) ! 203: elseif (dtpr func) ! 204: then (car func) ! 205: elseif (and macrochk (get name 'macro-autoload)) ! 206: then 'macro)) ! 207: (if (memq ftyp '(macro cmacro)) then ftyp ! 208: elseif (d-findfirstprop name 'functype) thenret ! 209: elseif (get name g-functype) thenret ; check if declared first ! 210: elseif ftyp thenret ! 211: else 'lambda) ! 212: else 'lambda))) ; default is lambda ! 213: ! 214: ;--- d-allfixnumargs :: check if all forms are fixnums ! 215: ; make sure all forms are fixnums or symbols whose declared type are fixnums ! 216: ; ! 217: (defun d-allfixnumargs (forms) ! 218: (do ((xx forms (cdr xx)) ! 219: (arg)) ! 220: ((null xx) t) ! 221: (cond ((and (fixp (setq arg (car xx))) (not (bigp arg)))) ! 222: ((d-fixnump arg)) ! 223: (t (return nil))))) ! 224: ! 225: ! 226: (defun d-findfirstprop (name type) ! 227: (do ((xx g-decls (cdr xx)) ! 228: (rcd)) ! 229: ((null xx)) ! 230: (if (and (eq name (caar xx)) ! 231: (get (setq rcd (cdar xx)) type)) ! 232: then (return rcd)))) ! 233: ! 234: ! 235: ! 236:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.