|
|
1.1 root 1: (include-if (null (get 'chead 'version)) "../chead.l")
2: (Liszt-file decl
3: "$Header: decl.l,v 1.8 83/08/28 17:13:00 layer Exp $")
4:
5: ;;; ---- d e c l declaration handling
6: ;;;
7: ;;; -[Sat Aug 6 23:58:35 1983 by layer]-
8:
9:
10: (setq original-readtable readtable)
11: (setq raw-readtable (makereadtable t))
12:
13: ;--- compile-fcn :: declare a open coded function
14: ; name - name of the function
15: ; fcnname - function to be funcall'ed to handle the open coding
16: ; indicator - describes what the fcnname will do, one of
17: ; fl-expr : will compile the expression and leave the
18: ; result in r0. Will ignore g-cc and g-loc
19: ; fl-exprcc: will compile the expression and leave the
20: ; result in g-loc. Will handle g-cc
21: ; fl-exprm: will just return another form to be d-exp'ed
22: ; args - (optional) description of the arguments to this function.
23: ; form: (min-args . max-args) . If max-args is nil, then there is
24: ; no max. This is usually done in /usr/lib/lisp/fcninfo.l.
25: ;
26: (defmacro compile-fcn (name fcnname indicator &optional (args nil args-p))
27: `(progn (putprop ',name ',fcnname ',indicator)
28: ;; don't do this here, done in fcn-info
29: ,@(cond (args-p `((putprop ',name (list ',args) 'fcn-info))))))
30:
31:
32: ;--- special handlers
33: (compile-fcn and cc-and fl-exprcc)
34: (compile-fcn arg cc-arg fl-exprcc)
35: (compile-fcn assq cm-assq fl-exprm)
36: (compile-fcn atom cc-atom fl-exprcc)
37: (compile-fcn bigp cc-bigp fl-exprcc)
38: (compile-fcn bcdcall c-bcdcall fl-expr)
39: (compile-fcn Internal-bcdcall c-Internal-bcdcall fl-expr)
40: (compile-fcn bcdp cc-bcdp fl-exprcc)
41: #+for-vax
42: (compile-fcn boole c-boole fl-expr)
43: (compile-fcn *catch c-*catch fl-expr)
44: (compile-fcn comment cc-ignore fl-exprcc)
45: (compile-fcn cond c-cond fl-expr)
46: (compile-fcn cons c-cons fl-expr)
47: (compile-fcn cxr cc-cxr fl-exprcc)
48: (compile-fcn declare c-declare fl-expr)
49: (compile-fcn do c-do fl-expr)
50: (compile-fcn liszt-internal-do c-do fl-expr)
51: (compile-fcn dtpr cc-dtpr fl-exprcc)
52: (compile-fcn eq cc-eq fl-exprcc)
53: (compile-fcn equal cc-equal fl-exprcc)
54: (compile-fcn errset c-errset fl-expr)
55: (compile-fcn fixp cc-fixp fl-exprcc)
56: (compile-fcn floatp cc-floatp fl-exprcc)
57: (compile-fcn funcall c-funcall fl-expr)
58: (compile-fcn function cc-function fl-exprcc)
59: (compile-fcn get c-get fl-expr)
60: (compile-fcn getaccess cm-getaccess fl-exprm)
61: (compile-fcn getaux cm-getaux fl-exprm)
62: (compile-fcn getd cm-getd fl-exprm)
63: (compile-fcn getdata cm-getdata fl-exprm)
64: (compile-fcn getdisc cm-getdisc fl-exprm)
65: (compile-fcn go c-go fl-expr)
66: (compile-fcn list c-list fl-expr)
67: (compile-fcn map cm-map fl-exprm)
68: (compile-fcn mapc cm-mapc fl-exprm)
69: (compile-fcn mapcan cm-mapcan fl-exprm)
70: (compile-fcn mapcar cm-mapcar fl-exprm)
71: (compile-fcn mapcon cm-mapcon fl-exprm)
72: (compile-fcn maplist cm-maplist fl-exprm)
73: (compile-fcn memq cc-memq fl-exprcc)
74: (compile-fcn ncons cm-ncons fl-exprm)
75: (compile-fcn not cc-not fl-exprcc)
76: (compile-fcn null cc-not fl-exprcc)
77: (compile-fcn numberp cc-numberp fl-exprcc)
78: (compile-fcn or cc-or fl-exprcc)
79: (compile-fcn prog c-prog fl-expr)
80: (compile-fcn progn cm-progn fl-exprm)
81: (compile-fcn prog1 cm-prog1 fl-exprm)
82: (compile-fcn prog2 cm-prog2 fl-exprm)
83: (compile-fcn progv c-progv fl-expr)
84: (compile-fcn quote cc-quote fl-exprcc)
85: (compile-fcn return c-return fl-expr)
86: (compile-fcn rplaca c-rplaca fl-expr)
87: (compile-fcn rplacd c-rplacd fl-expr)
88: (compile-fcn rplacx c-rplacx fl-expr)
89: (compile-fcn *rplacx c-rplacx fl-expr)
90: (compile-fcn setarg c-setarg fl-expr)
91: (compile-fcn setq cc-setq fl-exprcc)
92: (compile-fcn stringp cc-stringp fl-exprcc)
93: (compile-fcn symbolp cc-symbolp fl-exprcc)
94: (compile-fcn symeval cm-symeval fl-exprm)
95: (compile-fcn *throw c-*throw fl-expr)
96: (compile-fcn typep cc-typep fl-exprcc)
97: (compile-fcn vectorp cc-vectorp fl-exprcc)
98: (compile-fcn vectorip cc-vectorip fl-exprcc)
99: (compile-fcn vset cc-vset fl-exprcc)
100: (compile-fcn vseti-byte cc-vseti-byte fl-exprcc)
101: (compile-fcn vseti-word cc-vseti-word fl-exprcc)
102: (compile-fcn vseti-long cc-vseti-long fl-exprcc)
103: (compile-fcn vref cc-vref fl-exprcc)
104: (compile-fcn vrefi-byte cc-vrefi-byte fl-exprcc)
105: (compile-fcn vrefi-word cc-vrefi-word fl-exprcc)
106: (compile-fcn vrefi-long cc-vrefi-long fl-exprcc)
107: (compile-fcn vsize c-vsize fl-expr)
108: (compile-fcn vsize-byte c-vsize-byte fl-expr)
109: (compile-fcn vsize-word c-vsize-word fl-expr)
110:
111: (compile-fcn zerop cm-zerop fl-exprm)
112: ; functions which expect fixnum operands
113:
114:
115: (compile-fcn + c-fixnumop fl-expr)
116: #+for-vax (putprop '+ 'addl3 'fixop)
117: #+for-68k (putprop '+ 'addl 'fixop)
118:
119: (compile-fcn - c-fixnumop fl-expr)
120: #+for-vax (putprop '- 'subl3 'fixop)
121: #+for-68k (putprop '- 'subl 'fixop)
122:
123: #+for-vax
124: (progn 'compile
125: (compile-fcn * c-fixnumop fl-expr)
126: (putprop '* 'mull3 'fixop)
127:
128: (compile-fcn / c-fixnumop fl-expr)
129: (putprop '/ 'divl3 'fixop))
130:
131: ;-- boole's derivatives
132: #+for-vax
133: (progn 'compile
134: (compile-fcn fixnum-BitOr c-fixnumop fl-expr)
135: (putprop 'fixnum-BitOr 'bisl3 'fixop)
136:
137: (compile-fcn fixnum-BitAndNot c-fixnumop fl-expr)
138: (putprop 'fixnum-BitAndNot 'bicl3 'fixop)
139:
140: (compile-fcn fixnum-BitXor c-fixnumop fl-expr)
141: (putprop 'fixnum-BitXor 'xorl3 'fixop))
142:
143: (compile-fcn 1+ cc-oneplus fl-exprcc)
144: (compile-fcn 1- cc-oneminus fl-exprcc)
145:
146: #+for-vax
147: (compile-fcn \\ c-\\ fl-expr) ; done in the old way, should be modified
148:
149: ; these have typically fixnum operands, but not always
150:
151:
152: ; these without the & can be both fixnum or both flonum
153: ;
154: (compile-fcn < cm-< fl-exprm)
155: (compile-fcn <& cc-<& fl-exprcc)
156:
157: (compile-fcn > cm-> fl-exprm)
158: (compile-fcn >& cc->& fl-exprcc)
159:
160: (compile-fcn = cm-= fl-exprm)
161: (compile-fcn =& cm-=& fl-exprm)
162:
163: ; functions which can only be compiled
164: (compile-fcn assembler-code c-assembler-code fl-expr)
165: (compile-fcn fixnum-cxr cm-fixnum-cxr fl-exprm)
166: (compile-fcn internal-fixnum-box c-internal-fixnum-box fl-expr)
167: (compile-fcn offset-cxr cc-offset-cxr fl-exprcc)
168: (compile-fcn internal-bind-vars c-internal-bind-vars fl-expr)
169: (compile-fcn internal-unbind-vars c-internal-unbind-vars fl-expr)
170:
171: ; functions which can be converted to fixnum functions if
172: ; proper declarations are done
173: (mapc
174: '(lambda (arg) (putprop (car arg) (cdr arg) 'if-fixnum-args))
175: '((lessp . <&) (greaterp . >&) (= . =&) (equal . =&)))
176:
177:
178: ;--- doevalwhen, process evalwhen directive. This is inadequate.
179: ;
180: (def doevalwhen
181: (lambda (v-f)
182: (prog (docom dolod)
183: (setq docom (memq 'compile (cadr v-f))
184:
185: dolod (memq 'load (cadr v-f)))
186: (mapc '(lambda (frm) (cond (docom (eval frm)))
187: (cond (dolod
188: ((lambda (internal-macros)
189: (liszt-form frm))
190: t))))
191: (cddr v-f)))))
192:
193:
194: ;---- declare - the compiler version of the declare function
195: ; process the declare forms given. We evaluate each arg
196: ;
197: (defun liszt-declare fexpr (forms)
198: (cond ((status feature complr)
199: (do ((i forms (cdr i)))
200: ((null i))
201: (cond ((and (atom (caar i))
202: (getd (caar i)))
203: (eval (car i))) ; if this is a function
204: (t (comp-warn "Unknown declare attribute: " (car i))))))))
205:
206: ;---> handlers for declare forms
207: ; declaration information for declarations which occur outside of
208: ; functions is stored on the property list for rapid access.
209: ; The indicator to look under is the value of one of the symbols:
210: ; g-functype, g-vartype, g-bindtype, or g-calltype
211: ; The value of the property is the declared function, declaration, binding
212: ; or call type for that variable.
213: ; For local declarations, the information is kept on the g-decls stack.
214: ; It is an assq list, the car of which is the name of the variable or
215: ; function name, the cdr of which is the particular type. To tell
216: ; whether the particular type is a function type declaration, check the
217: ; property list of the particular type for a 'functype' indicator.
218: ; Likewise, to see if a particular type is a variable declaration, look
219: ; for a 'vartype' indicator on the particular type's property list.
220: ;
221: (defmacro declare-handler (args name type toplevind)
222: `(mapc '(lambda (var)
223: (cond ((symbolp var)
224: (cond (g-compfcn ; if compiling a function
225: (Push g-decls (cons var ',name)))
226: (t ; if at top level
227: (putprop var ',name ,toplevind))))))
228: ,args))
229:
230:
231: (defun *fexpr fexpr (args)
232: (declare-handler args nlambda functype g-functype))
233:
234: (defun nlambda fexpr (args)
235: (declare-handler args nlambda functype g-functype))
236:
237: (defun *expr fexpr (args)
238: (declare-handler args lambda functype g-functype))
239:
240: (defun lambda fexpr (args)
241: (declare-handler args lambda functype g-functype))
242:
243: (defun *lexpr fexpr (args)
244: (declare-handler args lexpr functype g-functype))
245:
246: (defun special fexpr (args)
247: (declare-handler args special bindtype g-bindtype))
248:
249: (defun unspecial fexpr (args)
250: (declare-handler args unspecial bindtype g-bindtype))
251:
252: (defun fixnum fexpr (args)
253: (declare-handler args fixnum vartype g-vartype))
254:
255: (defun flonum fexpr (args)
256: (declare-handler args flonum vartype g-vartype))
257:
258: (defun notype fexpr (args)
259: (declare-handler args notype vartype g-vartype))
260:
261:
262:
263: ;--- special case, this is only allowed at top level. It will
264: ; be removed when vectors are fully supported
265: (def macarray
266: (nlambda (v-l)
267: (mapc '(lambda (x)
268: (if (dtpr x)
269: then (putprop (car x) (cdr x) g-arrayspecs)
270: (putprop (car x) 'array g-functype)
271: else (comp-err "Bad macerror form" x)))
272: v-l)))
273:
274:
275: (def macros
276: (nlambda (args) (setq macros (car args))))
277:
278: (def specials
279: (nlambda (args) (setq special (car args))))
280:
281: ;--- *args
282: ; form is (declare (*args minargs maxargs))
283: ; this must occur within a function definition or it is an error
284: ;
285: (def *args
286: (nlambda (args)
287: (if (not g-compfcn)
288: then (comp-err
289: " *args declaration not given within a function definition "
290: args))
291: (let (min max)
292: (if (not (= (length args) 2))
293: then (comp-err " *args declaration must have two args: "
294: args))
295: (setq min (car args) max (cadr args))
296: (if (not (and (or (null min) (fixp min))
297: (or (null max) (fixp max))))
298: then (comp-err " *args declaration has illegal values: "
299: args))
300: (setq g-arginfo (cons min max))
301: (putprop g-fname (list g-arginfo) 'fcn-info))))
302:
303: ;--- *arginfo
304: ; designed to be used at top level, but can be used within function
305: ; form: (declare (*arginfo (append 2 nil) (showstack 0 1)))
306: ;
307: (def *arginfo
308: (nlambda (args)
309: (do ((xx args (cdr xx))
310: (name)
311: (min)
312: (max))
313: ((null xx))
314: (if (and (dtpr (car xx))
315: (eq (length (car xx)) 3))
316: then (setq name (caar xx)
317: min (cadar xx)
318: max (caddar xx))
319: (if (not (and (symbolp name)
320: (or (null min) (fixp min))
321: (or (null max) (fixp max))))
322: then (comp-err " *arginfo, illegal declaration "
323: (car xx))
324: else (putprop name (list (cons min max)) 'fcn-info))))))
325:
326:
327: ;--- another top level only.
328: ;
329: (def localf
330: (nlambda (args)
331: (mapc '(lambda (ar)
332: (if (null (get ar g-localf))
333: then (putprop ar
334: (cons (d-genlab) -1)
335: g-localf))
336: (if (get ar g-stdref)
337: then (comp-err
338: "function " ar " is being declared local" N
339: " yet it has already been called in a non local way")))
340: args)))
341:
342: ; g-decls is a stack of forms like
343: ; ((foo . special) (bar . fixnum) (pp . nlambda))
344: ; there are 4 types of cdr's:
345: ; function types (lambda, nlambda, lexpr)
346: ; variable types (fixnum, flonum, notype)
347: ; call types (localf, <unspecified>)
348: ; bind types (special, unspecial)
349: ;
350: (mapc '(lambda (x) (putprop x t 'functype)) '(lambda nlambda lexpr))
351: (mapc '(lambda (x) (putprop x t 'vartype)) '(fixnum flonum notype))
352: (mapc '(lambda (x) (putprop x t 'calltype)) '(localf))
353: (mapc '(lambda (x) (putprop x t 'bindtype)) '(special unspecial))
354:
355: ;---> end declare form handlers
356:
357:
358:
359:
360:
361:
362: ;--- d-makespec :: declare a variable to be special
363: ;
364: (defun d-makespec (vrb)
365: (putprop vrb 'special g-bindtype))
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.