1 USING: alien alien.strings arrays assocs byte-arrays
2 io.encodings.ascii kernel kernel.private math quotations
3 sequences sequences.generalizations sequences.private strings words ;
4 IN: bootstrap.image.primitives
6 CONSTANT: all-primitives {
11 "<callback>" ( word return-rewind -- alien ) "callback"
12 { word integer } { alien } f
15 "<displaced-alien>" ( displacement c-ptr -- alien ) "displaced_alien"
16 { integer c-ptr } { c-ptr } make-flushable
19 "alien-address" ( c-ptr -- addr ) "alien_address"
20 { alien } { integer } make-flushable
22 { "free-callback" ( alien -- ) "free_callback" { alien } { } f }
28 { "current-callback" ( -- n ) "current_callback" { } { fixnum } make-flushable }
35 "alien-cell" ( c-ptr n -- value ) "alien_cell"
36 { c-ptr integer } { pinned-c-ptr } make-flushable
39 "alien-double" ( c-ptr n -- value ) "alien_double"
40 { c-ptr integer } { float } make-flushable
43 "alien-float" ( c-ptr n -- value ) "alien_float"
44 { c-ptr integer } { float } make-flushable
47 "alien-signed-1" ( c-ptr n -- value ) "alien_signed_1"
48 { c-ptr integer } { fixnum } make-flushable
51 "alien-signed-2" ( c-ptr n -- value ) "alien_signed_2"
52 { c-ptr integer } { fixnum } make-flushable
55 "alien-signed-4" ( c-ptr n -- value ) "alien_signed_4"
56 { c-ptr integer } { integer } make-flushable
59 "alien-signed-8" ( c-ptr n -- value ) "alien_signed_8"
60 { c-ptr integer } { integer } make-flushable
63 "alien-signed-cell" ( c-ptr n -- value ) "alien_signed_cell"
64 { c-ptr integer } { integer } make-flushable
67 "alien-unsigned-1" ( c-ptr n -- value ) "alien_unsigned_1"
68 { c-ptr integer } { fixnum } make-flushable
71 "alien-unsigned-2" ( c-ptr n -- value ) "alien_unsigned_2"
72 { c-ptr integer } { fixnum } make-flushable
75 "alien-unsigned-4" ( c-ptr n -- value ) "alien_unsigned_4"
76 { c-ptr integer } { integer } make-flushable
79 "alien-unsigned-8" ( c-ptr n -- value ) "alien_unsigned_8"
80 { c-ptr integer } { integer } make-flushable
83 "alien-unsigned-cell" ( c-ptr n -- value ) "alien_unsigned_cell"
84 { c-ptr integer } { integer } make-flushable
87 "set-alien-cell" ( value c-ptr n -- ) "set_alien_cell"
88 { c-ptr c-ptr integer } { } f
91 "set-alien-double" ( value c-ptr n -- ) "set_alien_double"
92 { float c-ptr integer } { } f
95 "set-alien-float" ( value c-ptr n -- ) "set_alien_float"
96 { float c-ptr integer } { } f
99 "set-alien-signed-1" ( value c-ptr n -- ) "set_alien_signed_1"
100 { integer c-ptr integer } { } f
103 "set-alien-signed-2" ( value c-ptr n -- ) "set_alien_signed_2"
104 { integer c-ptr integer } { } f
107 "set-alien-signed-4" ( value c-ptr n -- ) "set_alien_signed_4"
108 { integer c-ptr integer } { } f
111 "set-alien-signed-8" ( value c-ptr n -- ) "set_alien_signed_8"
112 { integer c-ptr integer } { } f
115 "set-alien-signed-cell" ( value c-ptr n -- ) "set_alien_signed_cell"
116 { integer c-ptr integer } { } f
119 "set-alien-unsigned-1" ( value c-ptr n -- ) "set_alien_unsigned_1"
120 { integer c-ptr integer } { } f
123 "set-alien-unsigned-2" ( value c-ptr n -- ) "set_alien_unsigned_2"
124 { integer c-ptr integer } { } f
127 "set-alien-unsigned-4" ( value c-ptr n -- ) "set_alien_unsigned_4"
128 { integer c-ptr integer } { } f
131 "set-alien-unsigned-8" ( value c-ptr n -- ) "set_alien_unsigned_8"
132 { integer c-ptr integer } { } f
135 "set-alien-unsigned-cell" ( value c-ptr n -- ) "set_alien_unsigned_cell"
136 { integer c-ptr integer } { } f
143 { "(dlopen)" ( path -- dll ) "dlopen" { byte-array } { dll } f }
144 { "(dlsym)" ( name dll -- alien ) "dlsym" { byte-array object } { c-ptr } f }
146 "(dlsym-raw)" ( name dll -- alien ) "dlsym_raw"
147 { byte-array object } { c-ptr } f
149 { "dlclose" ( dll -- ) "dlclose" { dll } { } f }
150 { "dll-valid?" ( dll -- ? ) "dll_validp" { object } { object } f }
157 "<array>" ( n elt -- array ) "array"
158 { integer-array-capacity object } { array } make-flushable
161 "resize-array" ( n array -- new-array ) "resize_array"
162 { integer array } { array } f
170 "(byte-array)" ( n -- byte-array ) "uninitialized_byte_array"
171 { integer-array-capacity } { byte-array } make-flushable
174 "<byte-array>" ( n -- byte-array ) "byte_array"
175 { integer-array-capacity } { byte-array } make-flushable
178 "resize-byte-array" ( n byte-array -- new-byte-array )
180 { integer-array-capacity byte-array } { byte-array } f
185 "classes.tuple.private"
188 "<tuple-boa>" ( slots... layout -- tuple ) "tuple_boa"
192 "<tuple>" ( layout -- tuple ) "tuple"
193 { array } { tuple } make-flushable
201 "modify-code-heap" ( alist update-existing? reset-pics? -- )
203 { array object object } { } f
208 "generic.single.private"
210 { "inline-cache-miss" ( generic methods index cache -- ) f f f f }
211 { "inline-cache-miss-tail" ( generic methods index cache -- ) f f f f }
213 "lookup-method" ( object methods -- method ) "lookup_method"
214 { object array } { word } f
216 { "mega-cache-lookup" ( methods index cache -- ) f f f f }
217 { "mega-cache-miss" ( methods index cache -- method ) "mega_cache_miss" f f f }
223 { "(file-exists?)" ( path -- ? ) "existsp" { string } { object } f }
230 "(fopen)" ( path mode -- alien ) "fopen"
231 { byte-array byte-array } { alien } f
233 { "fclose" ( alien -- ) "fclose" { alien } { } f }
234 { "fflush" ( alien -- ) "fflush" { alien } { } f }
235 { "fgetc" ( alien -- byte/f ) "fgetc" { alien } { object } f }
236 { "fputc" ( byte alien -- ) "fputc" { object alien } { } f }
238 "fread-unsafe" ( n buf alien -- count ) "fread"
239 { integer c-ptr alien } { integer } f
242 "fseek" ( alien offset whence -- ) "fseek"
243 { integer integer alien } { } f
245 { "ftell" ( alien -- n ) "ftell" { alien } { integer } f }
246 { "fwrite" ( data length alien -- ) "fwrite" { c-ptr integer alien } { } f }
252 { "(clone)" ( obj -- newobj ) "clone" { object } { object } make-flushable }
254 "<wrapper>" ( obj -- wrapper ) "wrapper"
255 { object } { wrapper } make-foldable
258 "callstack>array" ( callstack -- array ) "callstack_to_array"
259 { callstack } { array } make-flushable
261 { "die" ( -- ) "die" { } { } f }
262 { "drop" ( x -- ) f f f f }
263 { "2drop" ( x y -- ) f f f f }
264 { "3drop" ( x y z -- ) f f f f }
265 { "4drop" ( w x y z -- ) f f f f }
266 { "dup" ( x -- x x ) f f f f }
267 { "2dup" ( x y -- x y x y ) f f f f }
268 { "3dup" ( x y z -- x y z x y z ) f f f f }
269 { "4dup" ( w x y z -- w x y z w x y z ) f f f f }
270 { "rot" ( x y z -- y z x ) f f f f }
271 { "-rot" ( x y z -- z x y ) f f f f }
272 { "dupd" ( x y -- x x y ) f f f f }
273 { "swapd" ( x y z -- y x z ) f f f f }
274 { "nip" ( x y -- y ) f f f f }
275 { "2nip" ( x y z -- z ) f f f f }
276 { "over" ( x y -- x y x ) f f f f }
277 { "pick" ( x y z -- x y z x ) f f f f }
278 { "swap" ( x y -- y x ) f f f f }
279 { "eq?" ( obj1 obj2 -- ? ) f { object object } { object } make-foldable }
285 { "(call)" ( quot -- ) f f f f }
286 { "(execute)" ( word -- ) f f f f }
287 { "c-to-factor" ( -- ) f f f f }
288 { "fpu-state" ( -- ) f { } { } f }
289 { "lazy-jit-compile" ( -- ) f f f f }
290 { "leaf-signal-handler" ( -- ) f { } { } f }
291 { "set-callstack" ( callstack -- * ) f f f f }
292 { "set-fpu-state" ( -- ) f { } { } f }
293 { "signal-handler" ( -- ) f { } { } f }
295 "tag" ( object -- n ) f
296 { object } { fixnum } make-foldable
298 { "unwind-native-frames" ( -- ) f f f f }
300 "callstack-for" ( context -- array ) "callstack_for"
301 { c-ptr } { callstack } make-flushable
304 "datastack-for" ( context -- array ) "datastack_for"
305 { c-ptr } { array } make-flushable
308 "retainstack-for" ( context -- array ) "retainstack_for"
309 { c-ptr } { array } make-flushable
312 "(identity-hashcode)" ( obj -- code ) "identity_hashcode"
313 { object } { fixnum } f
315 { "become" ( old new -- ) "become" { array array } { } f }
317 "callstack-bounds" ( -- start end ) "callstack_bounds"
318 { } { alien alien } make-flushable
321 "check-datastack" ( array in# out# -- ? ) "check_datastack"
322 { array integer integer } { object } make-flushable
325 "compute-identity-hashcode" ( obj -- ) "compute_identity_hashcode"
329 "context-object" ( n -- obj ) "context_object"
330 { fixnum } { object } make-flushable
333 "innermost-frame-executing" ( callstack -- obj )
334 "innermost_stack_frame_executing"
335 { callstack } { object } f
338 "innermost-frame-scan" ( callstack -- n ) "innermost_stack_frame_scan"
339 { callstack } { fixnum } f
342 "set-context-object" ( obj n -- ) "set_context_object"
343 { object fixnum } { } f
345 { "set-datastack" ( array -- ) "set_datastack" f f f }
347 "set-innermost-frame-quotation" ( n callstack -- )
348 "set_innermost_stack_frame_quotation"
349 { quotation callstack } { } f
351 { "set-retainstack" ( array -- ) "set_retainstack" f f f }
353 "set-special-object" ( obj n -- ) "set_special_object"
354 { object fixnum } { } f
357 "special-object" ( n -- obj ) "special_object"
358 { fixnum } { object } make-flushable
361 "strip-stack-traces" ( -- ) "strip_stack_traces"
369 { "drop-locals" ( n -- ) f f f f }
370 { "get-local" ( n -- obj ) f f f f }
371 { "load-local" ( obj -- ) f f f f }
372 { "load-locals" ( ... n -- ) "load_locals" f f f }
379 "bits>double" ( n -- x ) "bits_double"
380 { integer } { float } make-foldable
383 "bits>float" ( n -- x ) "bits_float"
384 { integer } { float } make-foldable
387 "double>bits" ( x -- n ) "double_bits"
388 { real } { integer } make-foldable
391 "float>bits" ( x -- n ) "float_bits"
392 { real } { integer } make-foldable
397 "math.parser.private"
400 "(format-float)" ( n fill width precision format locale -- byte-array )
402 { float byte-array fixnum fixnum byte-array byte-array } { byte-array }
411 "both-fixnums?" ( x y -- ? ) f
412 { object object } { object } make-foldable
415 "fixnum+fast" ( x y -- z ) f
416 { fixnum fixnum } { fixnum } make-foldable
419 "fixnum-fast" ( x y -- z ) f
420 { fixnum fixnum } { fixnum } make-foldable
423 "fixnum*fast" ( x y -- z ) f
424 { fixnum fixnum } { fixnum } make-foldable
427 "fixnum-bitand" ( x y -- z ) f
428 { fixnum fixnum } { fixnum } make-foldable
431 "fixnum-bitor" ( x y -- z ) f
432 { fixnum fixnum } { fixnum } make-foldable
435 "fixnum-bitxor" ( x y -- z ) f
436 { fixnum fixnum } { fixnum } make-foldable
439 "fixnum-bitnot" ( x -- y ) f
440 { fixnum } { fixnum } make-foldable
443 "fixnum-mod" ( x y -- z ) f
444 { fixnum fixnum } { fixnum } make-foldable
447 "fixnum-shift" ( x y -- z ) "fixnum_shift"
448 { fixnum fixnum } { integer } make-foldable
451 "fixnum-shift-fast" ( x y -- z ) f
452 { fixnum fixnum } { fixnum } make-foldable
455 "fixnum/i-fast" ( x y -- z ) f
456 { fixnum fixnum } { fixnum } make-foldable
459 "fixnum/mod" ( x y -- z w ) "fixnum_divmod"
460 { fixnum fixnum } { integer fixnum } make-foldable
463 "fixnum/mod-fast" ( x y -- z w ) f
464 { fixnum fixnum } { fixnum fixnum } make-foldable
467 "fixnum+" ( x y -- z ) f
468 { fixnum fixnum } { integer } make-foldable
471 "fixnum-" ( x y -- z ) f
472 { fixnum fixnum } { integer } make-foldable
475 "fixnum*" ( x y -- z ) f
476 { fixnum fixnum } { integer } make-foldable
479 "fixnum<" ( x y -- ? ) f
480 { fixnum fixnum } { object } make-foldable
483 "fixnum<=" ( x y -- z ) f
484 { fixnum fixnum } { object } make-foldable
487 "fixnum>" ( x y -- ? ) f
488 { fixnum fixnum } { object } make-foldable
491 "fixnum>=" ( x y -- ? ) f
492 { fixnum fixnum } { object } make-foldable
495 "bignum*" ( x y -- z ) "bignum_multiply"
496 { bignum bignum } { bignum } make-foldable
499 "bignum+" ( x y -- z ) "bignum_add"
500 { bignum bignum } { bignum } make-foldable
503 "bignum-" ( x y -- z ) "bignum_subtract"
504 { bignum bignum } { bignum } make-foldable
507 "bignum-bit?" ( x n -- ? ) "bignum_bitp"
508 { bignum integer } { object } make-foldable
511 "bignum-bitand" ( x y -- z ) "bignum_and"
512 { bignum bignum } { bignum } make-foldable
515 "bignum-bitnot" ( x -- y ) "bignum_not"
516 { bignum } { bignum } make-foldable
519 "bignum-bitor" ( x y -- z ) "bignum_or"
520 { bignum bignum } { bignum } make-foldable
523 "bignum-bitxor" ( x y -- z ) "bignum_xor"
524 { bignum bignum } { bignum } make-foldable
527 "bignum-log2" ( x -- n ) "bignum_log2"
528 { bignum } { bignum } make-foldable
531 "bignum-mod" ( x y -- z ) "bignum_mod"
532 { bignum bignum } { integer } make-foldable
535 "bignum-gcd" ( x y -- z ) "bignum_gcd"
536 { bignum bignum } { bignum } make-foldable
539 "bignum-shift" ( x y -- z ) "bignum_shift"
540 { bignum fixnum } { bignum } make-foldable
543 "bignum/i" ( x y -- z ) "bignum_divint"
544 { bignum bignum } { bignum } make-foldable
547 "bignum/mod" ( x y -- z w ) "bignum_divmod"
548 { bignum bignum } { bignum integer } make-foldable
551 "bignum<" ( x y -- ? ) "bignum_less"
552 { bignum bignum } { object } make-foldable
555 "bignum<=" ( x y -- ? ) "bignum_lesseq"
556 { bignum bignum } { object } make-foldable
559 "bignum=" ( x y -- ? ) "bignum_eq"
560 { bignum bignum } { object } make-foldable
563 "bignum>" ( x y -- ? ) "bignum_greater"
564 { bignum bignum } { object } make-foldable
567 "bignum>=" ( x y -- ? ) "bignum_greatereq"
568 { bignum bignum } { object } make-foldable
571 "bignum>fixnum" ( x -- y ) "bignum_to_fixnum"
572 { bignum } { fixnum } make-foldable
575 "bignum>fixnum-strict" ( x -- y ) "bignum_to_fixnum_strict"
576 { bignum } { fixnum } make-foldable
579 "fixnum/i" ( x y -- z ) "fixnum_divint"
580 { fixnum fixnum } { integer } make-foldable
583 "fixnum>bignum" ( x -- y ) "fixnum_to_bignum"
584 { fixnum } { bignum } make-foldable
587 "fixnum>float" ( x -- y ) "fixnum_to_float"
588 { fixnum } { float } make-foldable
591 "float*" ( x y -- z ) "float_multiply"
592 { float float } { float } make-foldable
595 "float+" ( x y -- z ) "float_add"
596 { float float } { float } make-foldable
599 "float-" ( x y -- z ) "float_subtract"
600 { float float } { float } make-foldable
604 "float-u<" ( x y -- ? ) "float_less"
605 { float float } { object } make-foldable
608 "float-u<=" ( x y -- ? ) "float_lesseq"
609 { float float } { object } make-foldable
612 "float-u>" ( x y -- ? ) "float_greater"
613 { float float } { object } make-foldable
616 "float-u>=" ( x y -- ? ) "float_greatereq"
617 { float float } { object } make-foldable
620 "float/f" ( x y -- z ) "float_divfloat"
621 { float float } { float } make-foldable
624 "float<" ( x y -- ? ) "float_less"
625 { float float } { object } make-foldable
628 "float<=" ( x y -- ? ) "float_lesseq"
629 { float float } { object } make-foldable
632 "float=" ( x y -- ? ) "float_eq"
633 { float float } { object } make-foldable
636 "float>" ( x y -- ? ) "float_greater"
637 { float float } { object } make-foldable
640 "float>=" ( x y -- ? ) "float_greatereq"
641 { float float } { object } make-foldable
644 "float>bignum" ( x -- y ) "float_to_bignum"
645 { float } { bignum } make-foldable
648 "float>fixnum" ( x -- y ) "float_to_fixnum"
649 { float } { fixnum } make-foldable
656 { "all-instances" ( -- array ) "all_instances" { } { array } f }
657 { "compact-gc" ( -- ) "compact_gc" { } { } f }
658 { "gc" ( -- ) "full_gc" { } { } f }
659 { "minor-gc" ( -- ) "minor_gc" { } { } f }
660 { "size" ( obj -- n ) "size" { object } { fixnum } make-flushable }
667 "(save-image)" ( path1 path2 then-die? -- ) "save_image"
668 { byte-array byte-array object } { } f
675 { "jit-compile" ( quot -- ) "jit_compile" { quotation } { } f }
677 "quotation-code" ( quot -- start end ) "quotation_code"
678 { quotation } { integer integer } make-flushable
681 "quotation-compiled?" ( quot -- ? ) "quotation_compiled_p"
682 { quotation } { object } f
690 "array>quotation" ( array -- quot ) "array_to_quotation"
691 { array } { quotation } make-flushable
698 { "set-slot" ( value obj n -- ) "set_slot" { object object fixnum } { } f }
699 { "slot" ( obj m -- value ) f { object fixnum } { object } make-flushable }
706 "<string>" ( n ch -- string ) "string"
707 { integer-array-capacity integer } { string } make-flushable
710 "resize-string" ( n str -- newstr ) "resize_string"
711 { integer string } { string } f
719 "set-string-nth-fast" ( ch n string -- ) "set_string_nth_fast"
720 { fixnum fixnum string } { } f
723 "string-nth-fast" ( n string -- ch ) f
724 { fixnum string } { fixnum } make-flushable
731 { "(exit)" ( n -- * ) "exit" { integer } { } f }
732 { "disable-ctrl-break" ( -- ) "disable_ctrl_break" { } { } f }
733 { "enable-ctrl-break" ( -- ) "enable_ctrl_break" { } { } f }
734 { "nano-count" ( -- ns ) "nano_count" { } { integer } make-flushable }
740 { "(sleep)" ( nanos -- ) "sleep" { integer } { } f }
741 { "(set-context)" ( obj context -- obj' ) f { object alien } { object } f }
742 { "(set-context-and-delete)" ( obj context -- * ) f { object alien } { } f }
743 { "(start-context)" ( obj quot -- obj' ) f { object quotation } { object } f }
744 { "(start-context-and-delete)" ( obj quot -- * ) f { object quotation } { } f }
746 "context-object-for" ( n context -- obj ) "context_object_for"
747 { fixnum c-ptr } { object } make-flushable
752 "tools.dispatch.private"
754 { "dispatch-stats" ( -- stats ) "dispatch_stats" { } { byte-array } f }
755 { "reset-dispatch-stats" ( -- ) "reset_dispatch_stats" { } { } f }
759 "tools.memory.private"
762 "(callback-room)" ( -- allocator-room ) "callback_room"
763 { } { byte-array } make-flushable
766 "(code-blocks)" ( -- array ) "code_blocks"
767 { } { array } make-flushable
770 "(code-room)" ( -- allocator-room ) "code_room"
771 { } { byte-array } make-flushable
774 "(data-room)" ( -- data-room ) "data_room"
775 { } { byte-array } make-flushable
777 { "disable-gc-events" ( -- events ) "disable_gc_events" { } { object } f }
778 { "enable-gc-events" ( -- ) "enable_gc_events" { } { } f }
782 "tools.profiler.sampling.private"
784 { "set-profiling" ( n -- ) "set_profiling" { object } { } f }
785 { "get-samples" ( -- samples/f ) "get_samples" { } { object } f }
792 "word-code" ( word -- start end ) "word_code"
793 { word } { integer integer } make-flushable
795 { "word-optimized?" ( word -- ? ) "word_optimized_p" { word } { object } f }
802 "(word)" ( name vocab hashcode -- word ) "word"
803 { object object object } { word } make-flushable
809 : primitive-quot ( word vm-func -- quot )
811 nip "primitive_" prepend ascii string>alien [ do-primitive ] curry
812 ] [ 1quotation ] if* ;
814 : primitive-word ( name vocab -- word )
815 create-word dup t "primitive" set-word-prop ;
817 : set-extra-props ( word extra-props -- )
818 [ rot set-word-prop ] with assoc-each ;
820 :: create-primitive ( vocab word effect vm-func inputs outputs extra-word -- )
821 word vocab primitive-word :> word
822 word vm-func primitive-quot :> quot
823 word quot effect define-declared
824 word inputs "input-classes" set-word-prop
825 word outputs "default-output-classes" set-word-prop
826 word extra-word [ execute( x -- ) ] [ drop ] if* ;
828 : create-primitives ( assoc -- )
830 [ 6 firstn create-primitive ] with each