]> gitweb.factorcode.org Git - factor.git/blob - basis/stack-checker/known-words/known-words.factor
4a9ff93179c21247986f0a5f8c3a699b6a325922
[factor.git] / basis / stack-checker / known-words / known-words.factor
1 ! Copyright (C) 2004, 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: fry accessors alien alien.accessors arrays byte-arrays
4 classes sequences.private continuations.private effects generic
5 hashtables hashtables.private io io.backend io.files
6 io.files.private io.streams.c kernel kernel.private math
7 math.private memory namespaces namespaces.private parser
8 quotations quotations.private sbufs sbufs.private
9 sequences sequences.private slots.private strings
10 strings.private system threads.private classes.tuple
11 classes.tuple.private vectors vectors.private words definitions
12 assocs summary compiler.units system.private
13 combinators combinators.short-circuit locals locals.backend locals.types
14 quotations.private combinators.private stack-checker.values
15 generic.single generic.single.private
16 alien.libraries
17 stack-checker.alien
18 stack-checker.state
19 stack-checker.errors
20 stack-checker.visitor
21 stack-checker.backend
22 stack-checker.branches
23 stack-checker.transforms
24 stack-checker.recursive-state ;
25 IN: stack-checker.known-words
26
27 : infer-primitive ( word -- )
28     dup
29     [ "input-classes" word-prop ]
30     [ "default-output-classes" word-prop ] bi <effect>
31     apply-word/effect ;
32
33 {
34     { drop  (( x     --             )) }
35     { 2drop (( x y   --             )) }
36     { 3drop (( x y z --             )) }
37     { dup   (( x     -- x x         )) }
38     { 2dup  (( x y   -- x y x y     )) }
39     { 3dup  (( x y z -- x y z x y z )) }
40     { rot   (( x y z -- y z x       )) }
41     { -rot  (( x y z -- z x y       )) }
42     { dupd  (( x y   -- x x y       )) }
43     { swapd (( x y z -- y x z       )) }
44     { nip   (( x y   -- y           )) }
45     { 2nip  (( x y z -- z           )) }
46     { tuck  (( x y   -- y x y       )) }
47     { over  (( x y   -- x y x       )) }
48     { pick  (( x y z -- x y z x     )) }
49     { swap  (( x y   -- y x         )) }
50 } [ "shuffle" set-word-prop ] assoc-each
51
52 : infer-shuffle ( shuffle -- )
53     [ in>> length consume-d ] keep ! inputs shuffle
54     [ drop ] [ shuffle dup copy-values dup output-d ] 2bi ! inputs outputs copies
55     [ nip f f ] [ swap zip ] 2bi ! in-d out-d in-r out-r mapping
56     #shuffle, ;
57
58 : infer-shuffle-word ( word -- )
59     "shuffle" word-prop infer-shuffle ;
60
61 : check-declaration ( declaration -- declaration )
62     dup { [ array? ] [ [ class? ] all? ] } 1&&
63     [ bad-declaration-error ] unless ;
64
65 : infer-declare ( -- )
66     pop-literal nip check-declaration
67     [ length ensure-d ] keep zip
68     #declare, ;
69
70 GENERIC: infer-call* ( value known -- )
71
72 : (infer-call) ( value -- ) dup known infer-call* ;
73
74 : infer-call ( -- ) pop-d (infer-call) ;
75
76 M: literal infer-call*
77     [ 1array #drop, ] [ infer-literal-quot ] bi* ;
78
79 M: curried infer-call*
80     swap push-d
81     [ uncurry ] infer-quot-here
82     [ quot>> known pop-d [ set-known ] keep ]
83     [ obj>> known pop-d [ set-known ] keep ] bi
84     push-d (infer-call) ;
85
86 M: composed infer-call*
87     swap push-d
88     [ uncompose ] infer-quot-here
89     [ quot2>> known pop-d [ set-known ] keep ]
90     [ quot1>> known pop-d [ set-known ] keep ] bi
91     push-d push-d
92     1 infer->r infer-call
93     terminated? get [ 1 infer-r> infer-call ] unless ;
94
95 M: object infer-call*
96     "literal quotation" literal-expected ;
97
98 : infer-nslip ( n -- )
99     [ infer->r infer-call ] [ infer-r> ] bi ;
100
101 : infer-slip ( -- ) 1 infer-nslip ;
102
103 : infer-2slip ( -- ) 2 infer-nslip ;
104
105 : infer-3slip ( -- ) 3 infer-nslip ;
106
107 : infer-ndip ( word n -- )
108     [ literals get ] 2dip
109     [ '[ _ def>> infer-quot-here ] ]
110     [ '[ _ [ pop ] dip [ infer->r infer-quot-here ] [ infer-r> ] bi ] ] bi*
111     if-empty ;
112
113 : infer-dip ( -- ) \ dip 1 infer-ndip ;
114
115 : infer-2dip ( -- ) \ 2dip 2 infer-ndip ;
116
117 : infer-3dip ( -- ) \ 3dip 3 infer-ndip ;
118
119 : infer-builder ( quot word -- )
120     [
121         [ 2 consume-d ] dip
122         [ dup first2 ] dip call make-known
123         [ push-d ] [ 1array ] bi
124     ] dip #call, ; inline
125
126 : infer-curry ( -- ) [ <curried> ] \ curry infer-builder ;
127
128 : infer-compose ( -- ) [ <composed> ] \ compose infer-builder ;
129
130 : infer-execute ( -- )
131     pop-literal nip
132     dup word? [
133         apply-object
134     ] [
135         drop
136         "execute must be given a word" time-bomb
137     ] if ;
138
139 : infer-<tuple-boa> ( -- )
140     \ <tuple-boa>
141     peek-d literal value>> second 1+ { tuple } <effect>
142     apply-word/effect ;
143
144 : infer-effect-unsafe ( word -- )
145     pop-literal nip
146     add-effect-input
147     apply-word/effect ;
148
149 : infer-execute-effect-unsafe ( -- )
150     \ (execute) infer-effect-unsafe ;
151
152 : infer-call-effect-unsafe ( -- )
153     \ call infer-effect-unsafe ;
154
155 : infer-exit ( -- )
156     \ exit (( n -- * )) apply-word/effect ;
157
158 : infer-load-locals ( -- )
159     pop-literal nip
160     consume-d dup copy-values dup output-r
161     [ [ f f ] dip ] [ swap zip ] 2bi #shuffle, ;
162
163 : infer-get-local ( -- )
164     [let* | n [ pop-literal nip 1 swap - ]
165             in-r [ n consume-r ]
166             out-d [ in-r first copy-value 1array ]
167             out-r [ in-r copy-values ] |
168          out-d output-d
169          out-r output-r
170          f out-d in-r out-r
171          out-r in-r zip out-d first in-r first 2array suffix
172          #shuffle,
173     ] ;
174
175 : infer-drop-locals ( -- )
176     f f pop-literal nip consume-r f f #shuffle, ;
177
178 : infer-special ( word -- )
179     {
180         { \ declare [ infer-declare ] }
181         { \ call [ infer-call ] }
182         { \ (call) [ infer-call ] }
183         { \ slip [ infer-slip ] }
184         { \ 2slip [ infer-2slip ] }
185         { \ 3slip [ infer-3slip ] }
186         { \ dip [ infer-dip ] }
187         { \ 2dip [ infer-2dip ] }
188         { \ 3dip [ infer-3dip ] }
189         { \ curry [ infer-curry ] }
190         { \ compose [ infer-compose ] }
191         { \ execute [ infer-execute ] }
192         { \ (execute) [ infer-execute ] }
193         { \ execute-effect-unsafe [ infer-execute-effect-unsafe ] }
194         { \ call-effect-unsafe [ infer-call-effect-unsafe ] }
195         { \ if [ infer-if ] }
196         { \ dispatch [ infer-dispatch ] }
197         { \ <tuple-boa> [ infer-<tuple-boa> ] }
198         { \ exit [ infer-exit ] }
199         { \ load-local [ 1 infer->r ] }
200         { \ load-locals [ infer-load-locals ] }
201         { \ get-local [ infer-get-local ] }
202         { \ drop-locals [ infer-drop-locals ] }
203         { \ do-primitive [ unknown-primitive-error ] }
204         { \ alien-invoke [ infer-alien-invoke ] }
205         { \ alien-indirect [ infer-alien-indirect ] }
206         { \ alien-callback [ infer-alien-callback ] }
207     } case ;
208
209 : infer-local-reader ( word -- )
210     (( -- value )) apply-word/effect ;
211
212 : infer-local-writer ( word -- )
213     (( value -- )) apply-word/effect ;
214
215 : infer-local-word ( word -- )
216     "local-word-def" word-prop infer-quot-here ;
217
218 {
219     declare call (call) slip 2slip 3slip dip 2dip 3dip curry compose
220     execute (execute) call-effect-unsafe execute-effect-unsafe if
221     dispatch <tuple-boa> exit load-local load-locals get-local
222     drop-locals do-primitive alien-invoke alien-indirect
223     alien-callback
224 } [
225     [ t "special" set-word-prop ]
226     [ t "no-compile" set-word-prop ] bi
227 ] each
228
229 ! Exceptions to the above
230 \ curry f "no-compile" set-word-prop
231 \ compose f "no-compile" set-word-prop
232
233 ! More words not to compile
234 \ call t "no-compile" set-word-prop
235 \ execute t "no-compile" set-word-prop
236 \ clear t "no-compile" set-word-prop
237
238 : non-inline-word ( word -- )
239     dup called-dependency depends-on
240     {
241         { [ dup "shuffle" word-prop ] [ infer-shuffle-word ] }
242         { [ dup "special" word-prop ] [ infer-special ] }
243         { [ dup "primitive" word-prop ] [ infer-primitive ] }
244         { [ dup "transform-quot" word-prop ] [ apply-transform ] }
245         { [ dup "macro" word-prop ] [ apply-macro ] }
246         { [ dup local? ] [ infer-local-reader ] }
247         { [ dup local-reader? ] [ infer-local-reader ] }
248         { [ dup local-writer? ] [ infer-local-writer ] }
249         { [ dup local-word? ] [ infer-local-word ] }
250         [ infer-word ]
251     } cond ;
252
253 : define-primitive ( word inputs outputs -- )
254     [ 2drop t "primitive" set-word-prop ]
255     [ drop "input-classes" set-word-prop ]
256     [ nip "default-output-classes" set-word-prop ]
257     3tri ;
258
259 ! Stack effects for all primitives
260 \ fixnum< { fixnum fixnum } { object } define-primitive
261 \ fixnum< make-foldable
262
263 \ fixnum<= { fixnum fixnum } { object } define-primitive
264 \ fixnum<= make-foldable
265
266 \ fixnum> { fixnum fixnum } { object } define-primitive
267 \ fixnum> make-foldable
268
269 \ fixnum>= { fixnum fixnum } { object } define-primitive
270 \ fixnum>= make-foldable
271
272 \ eq? { object object } { object } define-primitive
273 \ eq? make-foldable
274
275 \ bignum>fixnum { bignum } { fixnum } define-primitive
276 \ bignum>fixnum make-foldable
277
278 \ float>fixnum { float } { fixnum } define-primitive
279 \ bignum>fixnum make-foldable
280
281 \ fixnum>bignum { fixnum } { bignum } define-primitive
282 \ fixnum>bignum make-foldable
283
284 \ float>bignum { float } { bignum } define-primitive
285 \ float>bignum make-foldable
286
287 \ fixnum>float { fixnum } { float } define-primitive
288 \ fixnum>float make-foldable
289
290 \ bignum>float { bignum } { float } define-primitive
291 \ bignum>float make-foldable
292
293 \ string>float { string } { float } define-primitive
294 \ string>float make-foldable
295
296 \ float>string { float } { string } define-primitive
297 \ float>string make-foldable
298
299 \ float>bits { real } { integer } define-primitive
300 \ float>bits make-foldable
301
302 \ double>bits { real } { integer } define-primitive
303 \ double>bits make-foldable
304
305 \ bits>float { integer } { float } define-primitive
306 \ bits>float make-foldable
307
308 \ bits>double { integer } { float } define-primitive
309 \ bits>double make-foldable
310
311 \ both-fixnums? { object object } { object } define-primitive
312
313 \ fixnum+ { fixnum fixnum } { integer } define-primitive
314 \ fixnum+ make-foldable
315
316 \ fixnum+fast { fixnum fixnum } { fixnum } define-primitive
317 \ fixnum+fast make-foldable
318
319 \ fixnum- { fixnum fixnum } { integer } define-primitive
320 \ fixnum- make-foldable
321
322 \ fixnum-fast { fixnum fixnum } { fixnum } define-primitive
323 \ fixnum-fast make-foldable
324
325 \ fixnum* { fixnum fixnum } { integer } define-primitive
326 \ fixnum* make-foldable
327
328 \ fixnum*fast { fixnum fixnum } { fixnum } define-primitive
329 \ fixnum*fast make-foldable
330
331 \ fixnum/i { fixnum fixnum } { integer } define-primitive
332 \ fixnum/i make-foldable
333
334 \ fixnum/i-fast { fixnum fixnum } { fixnum } define-primitive
335 \ fixnum/i-fast make-foldable
336
337 \ fixnum-mod { fixnum fixnum } { fixnum } define-primitive
338 \ fixnum-mod make-foldable
339
340 \ fixnum/mod { fixnum fixnum } { integer fixnum } define-primitive
341 \ fixnum/mod make-foldable
342
343 \ fixnum/mod-fast { fixnum fixnum } { fixnum fixnum } define-primitive
344 \ fixnum/mod-fast make-foldable
345
346 \ fixnum-bitand { fixnum fixnum } { fixnum } define-primitive
347 \ fixnum-bitand make-foldable
348
349 \ fixnum-bitor { fixnum fixnum } { fixnum } define-primitive
350 \ fixnum-bitor make-foldable
351
352 \ fixnum-bitxor { fixnum fixnum } { fixnum } define-primitive
353 \ fixnum-bitxor make-foldable
354
355 \ fixnum-bitnot { fixnum } { fixnum } define-primitive
356 \ fixnum-bitnot make-foldable
357
358 \ fixnum-shift { fixnum fixnum } { integer } define-primitive
359 \ fixnum-shift make-foldable
360
361 \ fixnum-shift-fast { fixnum fixnum } { fixnum } define-primitive
362 \ fixnum-shift-fast make-foldable
363
364 \ bignum= { bignum bignum } { object } define-primitive
365 \ bignum= make-foldable
366
367 \ bignum+ { bignum bignum } { bignum } define-primitive
368 \ bignum+ make-foldable
369
370 \ bignum- { bignum bignum } { bignum } define-primitive
371 \ bignum- make-foldable
372
373 \ bignum* { bignum bignum } { bignum } define-primitive
374 \ bignum* make-foldable
375
376 \ bignum/i { bignum bignum } { bignum } define-primitive
377 \ bignum/i make-foldable
378
379 \ bignum-mod { bignum bignum } { bignum } define-primitive
380 \ bignum-mod make-foldable
381
382 \ bignum/mod { bignum bignum } { bignum bignum } define-primitive
383 \ bignum/mod make-foldable
384
385 \ bignum-bitand { bignum bignum } { bignum } define-primitive
386 \ bignum-bitand make-foldable
387
388 \ bignum-bitor { bignum bignum } { bignum } define-primitive
389 \ bignum-bitor make-foldable
390
391 \ bignum-bitxor { bignum bignum } { bignum } define-primitive
392 \ bignum-bitxor make-foldable
393
394 \ bignum-bitnot { bignum } { bignum } define-primitive
395 \ bignum-bitnot make-foldable
396
397 \ bignum-shift { bignum fixnum } { bignum } define-primitive
398 \ bignum-shift make-foldable
399
400 \ bignum< { bignum bignum } { object } define-primitive
401 \ bignum< make-foldable
402
403 \ bignum<= { bignum bignum } { object } define-primitive
404 \ bignum<= make-foldable
405
406 \ bignum> { bignum bignum } { object } define-primitive
407 \ bignum> make-foldable
408
409 \ bignum>= { bignum bignum } { object } define-primitive
410 \ bignum>= make-foldable
411
412 \ bignum-bit? { bignum integer } { object } define-primitive
413 \ bignum-bit? make-foldable
414
415 \ bignum-log2 { bignum } { bignum } define-primitive
416 \ bignum-log2 make-foldable
417
418 \ byte-array>bignum { byte-array } { bignum } define-primitive
419 \ byte-array>bignum make-foldable
420
421 \ float= { float float } { object } define-primitive
422 \ float= make-foldable
423
424 \ float+ { float float } { float } define-primitive
425 \ float+ make-foldable
426
427 \ float- { float float } { float } define-primitive
428 \ float- make-foldable
429
430 \ float* { float float } { float } define-primitive
431 \ float* make-foldable
432
433 \ float/f { float float } { float } define-primitive
434 \ float/f make-foldable
435
436 \ float< { float float } { object } define-primitive
437 \ float< make-foldable
438
439 \ float-mod { float float } { float } define-primitive
440 \ float-mod make-foldable
441
442 \ float<= { float float } { object } define-primitive
443 \ float<= make-foldable
444
445 \ float> { float float } { object } define-primitive
446 \ float> make-foldable
447
448 \ float>= { float float } { object } define-primitive
449 \ float>= make-foldable
450
451 \ <word> { object object } { word } define-primitive
452 \ <word> make-flushable
453
454 \ word-xt { word } { integer integer } define-primitive
455 \ word-xt make-flushable
456
457 \ getenv { fixnum } { object } define-primitive
458 \ getenv make-flushable
459
460 \ setenv { object fixnum } { } define-primitive
461
462 \ (exists?) { string } { object } define-primitive
463
464 \ gc { } { } define-primitive
465
466 \ gc-stats { } { array } define-primitive
467
468 \ save-image { string } { } define-primitive
469
470 \ save-image-and-exit { string } { } define-primitive
471
472 \ data-room { } { integer integer array } define-primitive
473 \ data-room make-flushable
474
475 \ code-room { } { integer integer integer integer } define-primitive
476 \ code-room  make-flushable
477
478 \ micros { } { integer } define-primitive
479 \ micros make-flushable
480
481 \ tag { object } { fixnum } define-primitive
482 \ tag make-foldable
483
484 \ dlopen { string } { dll } define-primitive
485
486 \ dlsym { string object } { c-ptr } define-primitive
487
488 \ dlclose { dll } { } define-primitive
489
490 \ <byte-array> { integer } { byte-array } define-primitive
491 \ <byte-array> make-flushable
492
493 \ (byte-array) { integer } { byte-array } define-primitive
494 \ (byte-array) make-flushable
495
496 \ <displaced-alien> { integer c-ptr } { c-ptr } define-primitive
497 \ <displaced-alien> make-flushable
498
499 \ alien-signed-cell { c-ptr integer } { integer } define-primitive
500 \ alien-signed-cell make-flushable
501
502 \ set-alien-signed-cell { integer c-ptr integer } { } define-primitive
503
504 \ alien-unsigned-cell { c-ptr integer } { integer } define-primitive
505 \ alien-unsigned-cell make-flushable
506
507 \ set-alien-unsigned-cell { integer c-ptr integer } { } define-primitive
508
509 \ alien-signed-8 { c-ptr integer } { integer } define-primitive
510 \ alien-signed-8 make-flushable
511
512 \ set-alien-signed-8 { integer c-ptr integer } { } define-primitive
513
514 \ alien-unsigned-8 { c-ptr integer } { integer } define-primitive
515 \ alien-unsigned-8 make-flushable
516
517 \ set-alien-unsigned-8 { integer c-ptr integer } { } define-primitive
518
519 \ alien-signed-4 { c-ptr integer } { integer } define-primitive
520 \ alien-signed-4 make-flushable
521
522 \ set-alien-signed-4 { integer c-ptr integer } { } define-primitive
523
524 \ alien-unsigned-4 { c-ptr integer } { integer } define-primitive
525 \ alien-unsigned-4 make-flushable
526
527 \ set-alien-unsigned-4 { integer c-ptr integer } { } define-primitive
528
529 \ alien-signed-2 { c-ptr integer } { fixnum } define-primitive
530 \ alien-signed-2 make-flushable
531
532 \ set-alien-signed-2 { integer c-ptr integer } { } define-primitive
533
534 \ alien-unsigned-2 { c-ptr integer } { fixnum } define-primitive
535 \ alien-unsigned-2 make-flushable
536
537 \ set-alien-unsigned-2 { integer c-ptr integer } { } define-primitive
538
539 \ alien-signed-1 { c-ptr integer } { fixnum } define-primitive
540 \ alien-signed-1 make-flushable
541
542 \ set-alien-signed-1 { integer c-ptr integer } { } define-primitive
543
544 \ alien-unsigned-1 { c-ptr integer } { fixnum } define-primitive
545 \ alien-unsigned-1 make-flushable
546
547 \ set-alien-unsigned-1 { integer c-ptr integer } { } define-primitive
548
549 \ alien-float { c-ptr integer } { float } define-primitive
550 \ alien-float make-flushable
551
552 \ set-alien-float { float c-ptr integer } { } define-primitive
553
554 \ alien-double { c-ptr integer } { float } define-primitive
555 \ alien-double make-flushable
556
557 \ set-alien-double { float c-ptr integer } { } define-primitive
558
559 \ alien-cell { c-ptr integer } { simple-c-ptr } define-primitive
560 \ alien-cell make-flushable
561
562 \ set-alien-cell { c-ptr c-ptr integer } { } define-primitive
563
564 \ alien-address { alien } { integer } define-primitive
565 \ alien-address make-flushable
566
567 \ slot { object fixnum } { object } define-primitive
568 \ slot make-flushable
569
570 \ set-slot { object object fixnum } { } define-primitive
571
572 \ string-nth { fixnum string } { fixnum } define-primitive
573 \ string-nth make-flushable
574
575 \ set-string-nth-slow { fixnum fixnum string } { } define-primitive
576 \ set-string-nth-fast { fixnum fixnum string } { } define-primitive
577
578 \ resize-array { integer array } { array } define-primitive
579 \ resize-array make-flushable
580
581 \ resize-byte-array { integer byte-array } { byte-array } define-primitive
582 \ resize-byte-array make-flushable
583
584 \ resize-string { integer string } { string } define-primitive
585 \ resize-string make-flushable
586
587 \ <array> { integer object } { array } define-primitive
588 \ <array> make-flushable
589
590 \ begin-scan { } { } define-primitive
591
592 \ next-object { } { object } define-primitive
593
594 \ end-scan { } { } define-primitive
595
596 \ size { object } { fixnum } define-primitive
597 \ size make-flushable
598
599 \ die { } { } define-primitive
600
601 \ fopen { string string } { alien } define-primitive
602
603 \ fgetc { alien } { object } define-primitive
604
605 \ fwrite { string alien } { } define-primitive
606
607 \ fputc { object alien } { } define-primitive
608
609 \ fread { integer string } { object } define-primitive
610
611 \ fflush { alien } { } define-primitive
612
613 \ fseek { alien integer integer } { } define-primitive
614
615 \ fclose { alien } { } define-primitive
616
617 \ <wrapper> { object } { wrapper } define-primitive
618 \ <wrapper> make-foldable
619
620 \ (clone) { object } { object } define-primitive
621 \ (clone) make-flushable
622
623 \ <string> { integer integer } { string } define-primitive
624 \ <string> make-flushable
625
626 \ array>quotation { array } { quotation } define-primitive
627 \ array>quotation make-flushable
628
629 \ quotation-xt { quotation } { integer } define-primitive
630 \ quotation-xt make-flushable
631
632 \ <tuple> { tuple-layout } { tuple } define-primitive
633 \ <tuple> make-flushable
634
635 \ datastack { } { array } define-primitive
636 \ datastack make-flushable
637
638 \ check-datastack { array integer integer } { object } define-primitive
639 \ check-datastack make-flushable
640
641 \ retainstack { } { array } define-primitive
642 \ retainstack make-flushable
643
644 \ callstack { } { callstack } define-primitive
645 \ callstack make-flushable
646
647 \ callstack>array { callstack } { array } define-primitive
648 \ callstack>array make-flushable
649
650 \ (sleep) { integer } { } define-primitive
651
652 \ become { array array } { } define-primitive
653
654 \ innermost-frame-quot { callstack } { quotation } define-primitive
655
656 \ innermost-frame-scan { callstack } { fixnum } define-primitive
657
658 \ set-innermost-frame-quot { quotation callstack } { } define-primitive
659
660 \ dll-valid? { object } { object } define-primitive
661
662 \ modify-code-heap { array } { } define-primitive
663
664 \ unimplemented { } { } define-primitive
665
666 \ gc-reset { } { } define-primitive
667
668 \ gc-stats { } { array } define-primitive
669
670 \ jit-compile { quotation } { } define-primitive
671
672 \ lookup-method { object array } { word } define-primitive
673
674 \ reset-dispatch-stats { } { } define-primitive
675 \ dispatch-stats { } { array } define-primitive
676 \ reset-inline-cache-stats { } { } define-primitive
677 \ inline-cache-stats { } { array } define-primitive
678
679 \ optimized? { word } { object } define-primitive