332 lines
8.2 KiB
Factor
332 lines
8.2 KiB
Factor
! Copyright (C) 2004, 2010 Slava Pestov.
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
USING: arrays assocs bootstrap.image.primitives
|
|
bootstrap.image.private classes classes.builtin classes.intersection
|
|
classes.predicate classes.private classes.singleton classes.tuple
|
|
classes.tuple.private classes.union combinators compiler.units io
|
|
kernel kernel.private layouts make math math.private namespaces parser
|
|
quotations sequences slots source-files splitting vocabs vocabs.loader
|
|
words ;
|
|
IN: bootstrap.primitives
|
|
|
|
"* Creating primitives and basic runtime structures..." print flush
|
|
|
|
H{ } clone sub-primitives set
|
|
|
|
"vocab:bootstrap/syntax.factor" parse-file
|
|
|
|
: asm-file ( arch -- file )
|
|
"-" split reverse "." join
|
|
"vocab:bootstrap/assembler/" ".factor" surround ;
|
|
|
|
architecture get asm-file parse-file
|
|
|
|
"vocab:bootstrap/layouts.factor" parse-file
|
|
|
|
! Now we have ( syntax-quot arch-quot layouts-quot ) on the stack
|
|
|
|
! Bring up a bare cross-compiling vocabulary.
|
|
"syntax" lookup-vocab vocab-words-assoc bootstrap-syntax set
|
|
|
|
H{ } clone dictionary set
|
|
H{ } clone root-cache set
|
|
H{ } clone source-files set
|
|
H{ } clone update-map set
|
|
H{ } clone implementors-map set
|
|
|
|
init-caches
|
|
|
|
bootstrapping? on
|
|
|
|
call( -- ) ! layouts quot
|
|
call( -- ) ! arch quot
|
|
|
|
! Vocabulary for slot accessors
|
|
"accessors" create-vocab drop
|
|
|
|
! After we execute bootstrap/layouts
|
|
num-types get f <array> builtins set
|
|
|
|
[
|
|
|
|
call( -- ) ! syntax-quot
|
|
|
|
! create-word some empty vocabs where the below primitives and
|
|
! classes will go
|
|
{
|
|
"alien"
|
|
"alien.accessors"
|
|
"alien.libraries"
|
|
"alien.private"
|
|
"arrays"
|
|
"byte-arrays"
|
|
"classes.private"
|
|
"classes.tuple"
|
|
"classes.tuple.private"
|
|
"classes.predicate"
|
|
"compiler.units"
|
|
"continuations.private"
|
|
"generic.single"
|
|
"generic.single.private"
|
|
"growable"
|
|
"hashtables"
|
|
"hashtables.private"
|
|
"io"
|
|
"io.files"
|
|
"io.files.private"
|
|
"io.streams.c"
|
|
"locals.backend"
|
|
"kernel"
|
|
"kernel.private"
|
|
"math"
|
|
"math.parser.private"
|
|
"math.private"
|
|
"memory"
|
|
"memory.private"
|
|
"quotations"
|
|
"quotations.private"
|
|
"sbufs"
|
|
"sbufs.private"
|
|
"scratchpad"
|
|
"sequences"
|
|
"sequences.private"
|
|
"slots.private"
|
|
"strings"
|
|
"strings.private"
|
|
"system"
|
|
"system.private"
|
|
"threads.private"
|
|
"tools.dispatch.private"
|
|
"tools.memory.private"
|
|
"tools.profiler.sampling.private"
|
|
"words"
|
|
"words.private"
|
|
"vectors"
|
|
"vectors.private"
|
|
"vm"
|
|
} [ create-vocab drop ] each
|
|
|
|
! Builtin classes
|
|
: lookup-type-number ( word -- n )
|
|
[ target-word ] with-global type-number ;
|
|
|
|
: register-builtin ( class -- )
|
|
[ dup lookup-type-number "type" set-word-prop ]
|
|
[ dup "type" word-prop builtins get set-nth ]
|
|
[ f f f builtin-class define-class ]
|
|
tri ;
|
|
|
|
: prepare-slots ( slots -- slots' )
|
|
[ [ dup pair? [ first2 create-word ] when ] map ] map ;
|
|
|
|
: define-builtin-slots ( class slots -- )
|
|
prepare-slots make-slots 1 finalize-slots
|
|
[ "slots" set-word-prop ] [ define-accessors ] 2bi ;
|
|
|
|
: define-builtin-predicate ( class -- )
|
|
dup class>type [ eq? ] curry [ tag ] prepend define-predicate ;
|
|
|
|
: define-builtin ( symbol slotspec -- )
|
|
[ [ define-builtin-predicate ] keep ] dip define-builtin-slots ;
|
|
|
|
{
|
|
{ "alien" "alien" }
|
|
{ "array" "arrays" }
|
|
{ "bignum" "math" }
|
|
{ "byte-array" "byte-arrays" }
|
|
{ "callstack" "kernel" }
|
|
{ "dll" "alien" }
|
|
{ "fixnum" "math" }
|
|
{ "float" "math" }
|
|
{ "quotation" "quotations" }
|
|
{ "string" "strings" }
|
|
{ "tuple" "kernel" }
|
|
{ "word" "words" }
|
|
{ "wrapper" "kernel" }
|
|
} [ create-word register-builtin ] assoc-each
|
|
|
|
"f" "syntax" lookup-word register-builtin
|
|
|
|
! We need this before defining c-ptr below
|
|
"f" "syntax" lookup-word { } define-builtin
|
|
|
|
"f" "syntax" create-word [ not ] "predicate" set-word-prop
|
|
"f?" "syntax" vocab-words-assoc delete-at
|
|
|
|
"t" "syntax" lookup-word define-singleton-class
|
|
|
|
! Some unions
|
|
"c-ptr" "alien" create-word [
|
|
"alien" "alien" lookup-word ,
|
|
"f" "syntax" lookup-word ,
|
|
"byte-array" "byte-arrays" lookup-word ,
|
|
] { } make define-union-class
|
|
|
|
"integer" "math" create-word
|
|
"fixnum" "math" lookup-word "bignum" "math" lookup-word 2array
|
|
define-union-class
|
|
|
|
! Two predicate classes used for declarations.
|
|
"array-capacity" "sequences.private" create-word
|
|
"fixnum" "math" lookup-word
|
|
[
|
|
[ dup 0 fixnum>= ] %
|
|
bootstrap-max-array-capacity <fake-bignum> [ fixnum<= ] curry ,
|
|
[ [ drop f ] if ] %
|
|
] [ ] make
|
|
define-predicate-class
|
|
|
|
"array-capacity" "sequences.private" lookup-word
|
|
[ >fixnum ] bootstrap-max-array-capacity <fake-bignum> [ fixnum-bitand ] curry append
|
|
"coercer" set-word-prop
|
|
|
|
"integer-array-capacity" "sequences.private" create-word
|
|
"integer" "math" lookup-word
|
|
[
|
|
[ dup 0 >= ] %
|
|
bootstrap-max-array-capacity <fake-bignum> [ <= ] curry ,
|
|
[ [ drop f ] if ] %
|
|
] [ ] make
|
|
define-predicate-class
|
|
|
|
! Catch-all class for providing a default method.
|
|
"object" "kernel" create-word
|
|
[ f f { } intersection-class define-class ]
|
|
[ [ drop t ] "predicate" set-word-prop ]
|
|
bi
|
|
|
|
"object?" "kernel" vocab-words-assoc delete-at
|
|
|
|
! Empty class with no instances
|
|
"null" "kernel" create-word
|
|
[ f { } f union-class define-class ]
|
|
[ [ drop f ] "predicate" set-word-prop ]
|
|
bi
|
|
|
|
"null?" "kernel" vocab-words-assoc delete-at
|
|
|
|
"fixnum" "math" create-word { } define-builtin
|
|
"fixnum" "math" create-word "integer>fixnum-strict" "math" create-word 1quotation "coercer" set-word-prop
|
|
|
|
"bignum" "math" create-word { } define-builtin
|
|
"bignum" "math" create-word ">bignum" "math" create-word 1quotation "coercer" set-word-prop
|
|
|
|
"float" "math" create-word { } define-builtin
|
|
"float" "math" create-word ">float" "math" create-word 1quotation "coercer" set-word-prop
|
|
|
|
"array" "arrays" create-word {
|
|
{ "length" { "array-capacity" "sequences.private" } read-only }
|
|
} define-builtin
|
|
|
|
"wrapper" "kernel" create-word {
|
|
{ "wrapped" read-only }
|
|
} define-builtin
|
|
|
|
"string" "strings" create-word {
|
|
{ "length" { "array-capacity" "sequences.private" } read-only }
|
|
"aux"
|
|
} define-builtin
|
|
|
|
"quotation" "quotations" create-word {
|
|
{ "array" { "array" "arrays" } read-only }
|
|
"cached-effect"
|
|
"cache-counter"
|
|
} define-builtin
|
|
|
|
"dll" "alien" create-word {
|
|
{ "path" { "byte-array" "byte-arrays" } read-only }
|
|
} define-builtin
|
|
|
|
"alien" "alien" create-word {
|
|
{ "underlying" { "c-ptr" "alien" } read-only }
|
|
"expired"
|
|
} define-builtin
|
|
|
|
"word" "words" create-word {
|
|
{ "hashcode" { "fixnum" "math" } }
|
|
"name"
|
|
"vocabulary"
|
|
{ "def" { "quotation" "quotations" } initial: [ ] }
|
|
"props"
|
|
"pic-def"
|
|
"pic-tail-def"
|
|
{ "sub-primitive" read-only }
|
|
} define-builtin
|
|
|
|
"byte-array" "byte-arrays" create-word {
|
|
{ "length" { "array-capacity" "sequences.private" } read-only }
|
|
} define-builtin
|
|
|
|
"callstack" "kernel" create-word { } define-builtin
|
|
|
|
"tuple" "kernel" create-word
|
|
[ { } define-builtin ]
|
|
[ define-tuple-layout ]
|
|
bi
|
|
|
|
! create-word special tombstone values
|
|
"tombstone" "hashtables.private" create-word
|
|
tuple
|
|
{ "state" } define-tuple-class
|
|
|
|
"+empty+" "hashtables.private" create-word
|
|
{ f } "tombstone" "hashtables.private" lookup-word
|
|
slots>tuple 1quotation ( -- value ) define-inline
|
|
|
|
"+tombstone+" "hashtables.private" create-word
|
|
{ t } "tombstone" "hashtables.private" lookup-word
|
|
slots>tuple 1quotation ( -- value ) define-inline
|
|
|
|
! Some tuple classes
|
|
|
|
"curried" "kernel" create-word
|
|
tuple
|
|
{
|
|
{ "obj" read-only }
|
|
{ "quot" read-only }
|
|
} prepare-slots define-tuple-class
|
|
|
|
"curry" "kernel" create-word
|
|
{
|
|
[ f "inline" set-word-prop ]
|
|
[ make-flushable ]
|
|
} cleave
|
|
|
|
"curry" "kernel" lookup-word
|
|
[
|
|
callable instance-check-quot %
|
|
"curried" "kernel" lookup-word tuple-layout ,
|
|
\ <tuple-boa> ,
|
|
] [ ] make
|
|
( obj quot -- curry ) define-declared
|
|
|
|
"composed" "kernel" create-word
|
|
tuple
|
|
{
|
|
{ "first" read-only }
|
|
{ "second" read-only }
|
|
} prepare-slots define-tuple-class
|
|
|
|
"compose" "kernel" create-word
|
|
{
|
|
[ f "inline" set-word-prop ]
|
|
[ make-flushable ]
|
|
} cleave
|
|
|
|
"compose" "kernel" lookup-word
|
|
[
|
|
callable instance-check-quot [ dip ] curry %
|
|
callable instance-check-quot %
|
|
"composed" "kernel" lookup-word tuple-layout ,
|
|
\ <tuple-boa> ,
|
|
] [ ] make
|
|
( quot1 quot2 -- compose ) define-declared
|
|
|
|
"* Declaring primitives..." print flush
|
|
all-primitives create-primitives
|
|
|
|
! Bump build number
|
|
"build" "kernel" create-word build 1 + [ ] curry ( -- n ) define-declared
|
|
|
|
] with-compilation-unit
|