|
|
1.1 root 1: (include-if (null (get 'chead 'version)) "../chead.l")
2: (Liszt-file decl
3: "$Header: decl.l,v 1.9 87/12/15 17:00:21 sklower 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: #+(or for-vax for-tahoe)
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: #+(or for-vax for-tahoe) (putprop '+ 'addl3 'fixop)
117: #+for-68k (putprop '+ 'addl 'fixop)
118:
119: (compile-fcn - c-fixnumop fl-expr)
120: #+(or for-vax for-tahoe) (putprop '- 'subl3 'fixop)
121: #+for-68k (putprop '- 'subl 'fixop)
122:
123: #+(or for-vax for-tahoe)
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: #+for-tahoe
144: (progn 'compile
145: (compile-fcn fixnum-BitOr c-fixnumop fl-expr)
146: (putprop 'fixnum-BitOr 'orl3 'fixop)
147:
148: (compile-fcn fixnum-BitAnd c-fixnumop fl-expr)
149: (putprop 'fixnum-BitAnd 'andl3 'fixop)
150:
151: (compile-fcn fixnum-BitXor c-fixnumop fl-expr)
152: (putprop 'fixnum-BitXor 'xorl3 'fixop))
153:
154: (compile-fcn 1+ cc-oneplus fl-exprcc)
155: (compile-fcn 1- cc-oneminus fl-exprcc)
156:
157: #+(or for-vax for-tahoe)
158: (compile-fcn \\ c-\\ fl-expr) ; done in the old way, should be modified
159:
160: ; these have typically fixnum operands, but not always
161:
162:
163: ; these without the & can be both fixnum or both flonum
164: ;
165: (compile-fcn < cm-< fl-exprm)
166: (compile-fcn <& cc-<& fl-exprcc)
167:
168: (compile-fcn > cm-> fl-exprm)
169: (compile-fcn >& cc->& fl-exprcc)
170:
171: (compile-fcn = cm-= fl-exprm)
172: (compile-fcn =& cm-=& fl-exprm)
173:
174: ; functions which can only be compiled
175: (compile-fcn assembler-code c-assembler-code fl-expr)
176: (compile-fcn fixnum-cxr cm-fixnum-cxr fl-exprm)
177: (compile-fcn internal-fixnum-box c-internal-fixnum-box fl-expr)
178: (compile-fcn offset-cxr cc-offset-cxr fl-exprcc)
179: (compile-fcn internal-bind-vars c-internal-bind-vars fl-expr)
180: (compile-fcn internal-unbind-vars c-internal-unbind-vars fl-expr)
181:
182: ; functions which can be converted to fixnum functions if
183: ; proper declarations are done
184: (mapc
185: '(lambda (arg) (putprop (car arg) (cdr arg) 'if-fixnum-args))
186: '((lessp . <&) (greaterp . >&) (= . =&) (equal . =&)))
187:
188:
189: ;--- doevalwhen, process evalwhen directive. This is inadequate.
190: ;
191: (def doevalwhen
192: (lambda (v-f)
193: (prog (docom dolod)
194: (setq docom (memq 'compile (cadr v-f))
195:
196: dolod (memq 'load (cadr v-f)))
197: (mapc '(lambda (frm) (cond (docom (eval frm)))
198: (cond (dolod
199: ((lambda (internal-macros)
200: (liszt-form frm))
201: t))))
202: (cddr v-f)))))
203:
204:
205: ;---- declare - the compiler version of the declare function
206: ; process the declare forms given. We evaluate each arg
207: ;
208: (defun liszt-declare fexpr (forms)
209: (cond ((status feature complr)
210: (do ((i forms (cdr i)))
211: ((null i))
212: (cond ((and (atom (caar i))
213: (getd (caar i)))
214: (eval (car i))) ; if this is a function
215: (t (comp-warn "Unknown declare attribute: " (car i))))))))
216:
217: ;---> handlers for declare forms
218: ; declaration information for declarations which occur outside of
219: ; functions is stored on the property list for rapid access.
220: ; The indicator to look under is the value of one of the symbols:
221: ; g-functype, g-vartype, g-bindtype, or g-calltype
222: ; The value of the property is the declared function, declaration, binding
223: ; or call type for that variable.
224: ; For local declarations, the information is kept on the g-decls stack.
225: ; It is an assq list, the car of which is the name of the variable or
226: ; function name, the cdr of which is the particular type. To tell
227: ; whether the particular type is a function type declaration, check the
228: ; property list of the particular type for a 'functype' indicator.
229: ; Likewise, to see if a particular type is a variable declaration, look
230: ; for a 'vartype' indicator on the particular type's property list.
231: ;
232: (defmacro declare-handler (args name type toplevind)
233: `(mapc '(lambda (var)
234: (cond ((symbolp var)
235: (cond (g-compfcn ; if compiling a function
236: (Push g-decls (cons var ',name)))
237: (t ; if at top level
238: (putprop var ',name ,toplevind))))))
239: ,args))
240:
241:
242: (defun *fexpr fexpr (args)
243: (declare-handler args nlambda functype g-functype))
244:
245: (defun nlambda fexpr (args)
246: (declare-handler args nlambda functype g-functype))
247:
248: (defun *expr fexpr (args)
249: (declare-handler args lambda functype g-functype))
250:
251: (defun lambda fexpr (args)
252: (declare-handler args lambda functype g-functype))
253:
254: (defun *lexpr fexpr (args)
255: (declare-handler args lexpr functype g-functype))
256:
257: (defun special fexpr (args)
258: (declare-handler args special bindtype g-bindtype))
259:
260: (defun unspecial fexpr (args)
261: (declare-handler args unspecial bindtype g-bindtype))
262:
263: (defun fixnum fexpr (args)
264: (declare-handler args fixnum vartype g-vartype))
265:
266: (defun flonum fexpr (args)
267: (declare-handler args flonum vartype g-vartype))
268:
269: (defun notype fexpr (args)
270: (declare-handler args notype vartype g-vartype))
271:
272:
273:
274: ;--- special case, this is only allowed at top level. It will
275: ; be removed when vectors are fully supported
276: (def macarray
277: (nlambda (v-l)
278: (mapc '(lambda (x)
279: (if (dtpr x)
280: then (putprop (car x) (cdr x) g-arrayspecs)
281: (putprop (car x) 'array g-functype)
282: else (comp-err "Bad macerror form" x)))
283: v-l)))
284:
285:
286: (def macros
287: (nlambda (args) (setq macros (car args))))
288:
289: (def specials
290: (nlambda (args) (setq special (car args))))
291:
292: ;--- *args
293: ; form is (declare (*args minargs maxargs))
294: ; this must occur within a function definition or it is an error
295: ;
296: (def *args
297: (nlambda (args)
298: (if (not g-compfcn)
299: then (comp-err
300: " *args declaration not given within a function definition "
301: args))
302: (let (min max)
303: (if (not (= (length args) 2))
304: then (comp-err " *args declaration must have two args: "
305: args))
306: (setq min (car args) max (cadr args))
307: (if (not (and (or (null min) (fixp min))
308: (or (null max) (fixp max))))
309: then (comp-err " *args declaration has illegal values: "
310: args))
311: (setq g-arginfo (cons min max))
312: (putprop g-fname (list g-arginfo) 'fcn-info))))
313:
314: ;--- *arginfo
315: ; designed to be used at top level, but can be used within function
316: ; form: (declare (*arginfo (append 2 nil) (showstack 0 1)))
317: ;
318: (def *arginfo
319: (nlambda (args)
320: (do ((xx args (cdr xx))
321: (name)
322: (min)
323: (max))
324: ((null xx))
325: (if (and (dtpr (car xx))
326: (eq (length (car xx)) 3))
327: then (setq name (caar xx)
328: min (cadar xx)
329: max (caddar xx))
330: (if (not (and (symbolp name)
331: (or (null min) (fixp min))
332: (or (null max) (fixp max))))
333: then (comp-err " *arginfo, illegal declaration "
334: (car xx))
335: else (putprop name (list (cons min max)) 'fcn-info))))))
336:
337:
338: ;--- another top level only.
339: ;
340: (def localf
341: (nlambda (args)
342: (mapc '(lambda (ar)
343: (if (null (get ar g-localf))
344: then (putprop ar
345: (cons (d-genlab) -1)
346: g-localf))
347: (if (get ar g-stdref)
348: then (comp-err
349: "function " ar " is being declared local" N
350: " yet it has already been called in a non local way")))
351: args)))
352:
353: ; g-decls is a stack of forms like
354: ; ((foo . special) (bar . fixnum) (pp . nlambda))
355: ; there are 4 types of cdr's:
356: ; function types (lambda, nlambda, lexpr)
357: ; variable types (fixnum, flonum, notype)
358: ; call types (localf, <unspecified>)
359: ; bind types (special, unspecial)
360: ;
361: (mapc '(lambda (x) (putprop x t 'functype)) '(lambda nlambda lexpr))
362: (mapc '(lambda (x) (putprop x t 'vartype)) '(fixnum flonum notype))
363: (mapc '(lambda (x) (putprop x t 'calltype)) '(localf))
364: (mapc '(lambda (x) (putprop x t 'bindtype)) '(special unspecial))
365:
366: ;---> end declare form handlers
367:
368:
369:
370:
371:
372:
373: ;--- d-makespec :: declare a variable to be special
374: ;
375: (defun d-makespec (vrb)
376: (putprop vrb 'special g-bindtype))
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.