factor/core/bootstrap/primitives.factor

659 lines
17 KiB
Factor
Raw Normal View History

2008-01-06 13:17:50 -05:00
! Copyright (C) 2004, 2008 Slava Pestov.
2007-09-20 18:09:08 -04:00
! See http://factorcode.org/license.txt for BSD license.
IN: bootstrap.primitives
USING: alien arrays byte-arrays generic hashtables
hashtables.private io kernel math namespaces parser sequences
strings vectors words quotations assocs layouts classes tuples
kernel.private vocabs vocabs.loader source-files definitions
slots classes.union compiler.units bootstrap.image.private
io.files ;
2007-09-20 18:09:08 -04:00
"Creating primitives and basic runtime structures..." print flush
crossref off
"resource:core/bootstrap/syntax.factor" parse-file
2007-12-24 17:18:26 -05:00
"resource:core/cpu/" architecture get {
2008-02-02 00:07:19 -05:00
{ "x86.32" "x86/32" }
{ "x86.64" "x86/64" }
{ "linux-ppc" "ppc/linux" }
{ "macosx-ppc" "ppc/macosx" }
{ "arm" "arm" }
} at "/bootstrap.factor" 3append parse-file
2008-01-30 00:13:47 -05:00
"resource:core/bootstrap/layouts/layouts.factor" parse-file
! Now we have ( syntax-quot arch-quot layouts-quot ) on the stack
! Bring up a bare cross-compiling vocabulary.
"syntax" vocab vocab-words bootstrap-syntax set
2007-09-20 18:09:08 -04:00
H{ } clone dictionary set
2007-12-24 17:18:26 -05:00
H{ } clone changed-words set
2008-02-26 04:30:11 -05:00
! Trivial recompile hook. We don't want to touch the code heap
! during stage1 bootstrap, it would just waste time.
[ drop { } ] recompile-hook set
2007-12-24 17:18:26 -05:00
2008-01-30 00:13:47 -05:00
call
call
2007-09-20 18:09:08 -04:00
call
! Create some empty vocabs where the below primitives and
! classes will go
{
"alien"
2008-01-31 21:11:46 -05:00
"alien.accessors"
2007-09-20 18:09:08 -04:00
"arrays"
"bit-arrays"
2008-01-28 19:15:21 -05:00
"bit-vectors"
2007-09-20 18:09:08 -04:00
"byte-arrays"
2008-01-28 19:15:21 -05:00
"byte-vectors"
2007-09-20 18:09:08 -04:00
"classes.private"
"compiler.units"
2007-09-20 18:09:08 -04:00
"continuations.private"
"float-arrays"
2008-01-28 19:15:21 -05:00
"float-vectors"
2007-09-20 18:09:08 -04:00
"generator"
"growable"
"hashtables"
"hashtables.private"
"io"
"io.files"
"io.files.private"
"io.streams.c"
"kernel"
"kernel.private"
"math"
"math.private"
"memory"
"quotations"
"quotations.private"
"sbufs"
"sbufs.private"
"scratchpad"
"sequences"
"sequences.private"
"slots.private"
"strings"
"strings.private"
"system"
"threads.private"
"tools.profiler.private"
"tuples"
"tuples.private"
"words"
"words.private"
"vectors"
"vectors.private"
} [
dup find-vocab-root swap create-vocab
[ set-vocab-root ] keep
f swap set-vocab-source-loaded?
] each
H{ } clone source-files set
H{ } clone class<map set
H{ } clone update-map set
2007-12-25 18:10:05 -05:00
! Builtin classes
2007-09-20 18:09:08 -04:00
: builtin-predicate ( class predicate -- )
[
over "type" word-prop dup
\ tag-mask get < \ tag \ type ? , , \ eq? ,
2008-02-17 18:08:52 -05:00
] [ ] make define-predicate* ;
2007-09-20 18:09:08 -04:00
: register-builtin ( class -- )
dup "type" word-prop builtins get set-nth ;
: lookup-type-number ( word -- n )
global [ target-word ] bind type-number ;
: define-builtin ( symbol predicate slotspec -- )
>r dup make-inline >r
dup dup lookup-type-number "type" set-word-prop
dup f f builtin-class define-class
dup r> builtin-predicate
2008-01-28 19:15:21 -05:00
dup r> 1 simple-slots 2dup "slots" set-word-prop
dupd define-slots
2007-09-20 18:09:08 -04:00
register-builtin ;
H{ } clone typemap set
num-types get f <array> builtins set
! Forward definitions
"object" "kernel" create t "class" set-word-prop
"object" "kernel" create union-class "metaclass" set-word-prop
"null" "kernel" create drop
2007-09-20 18:09:08 -04:00
"fixnum" "math" create "fixnum?" "math" create { } define-builtin
"fixnum" "math" create ">fixnum" "math" create 1quotation "coercer" set-word-prop
"bignum" "math" create "bignum?" "math" create { } define-builtin
"bignum" "math" create ">bignum" "math" create 1quotation "coercer" set-word-prop
"tuple" "kernel" create "tuple?" "kernel" create
{ } define-builtin
"ratio" "math" create "ratio?" "math" create
{
{
{ "integer" "math" }
"numerator"
{ "numerator" "math" }
f
}
{
{ "integer" "math" }
"denominator"
{ "denominator" "math" }
f
}
} define-builtin
"float" "math" create "float?" "math" create { } define-builtin
"float" "math" create ">float" "math" create 1quotation "coercer" set-word-prop
"complex" "math" create "complex?" "math" create
{
{
{ "real" "math" }
"real-part"
{ "real-part" "math" }
2007-09-20 18:09:08 -04:00
f
}
{
{ "real" "math" }
"imaginary-part"
{ "imaginary-part" "math" }
2007-09-20 18:09:08 -04:00
f
}
} define-builtin
"f" "syntax" lookup "not" "kernel" create
{ } define-builtin
"array" "arrays" create "array?" "arrays" create
{ } define-builtin
"wrapper" "kernel" create "wrapper?" "kernel" create
{
{
{ "object" "kernel" }
"wrapped"
{ "wrapped" "kernel" }
f
}
} define-builtin
"string" "strings" create "string?" "strings" create
{
{
{ "array-capacity" "sequences.private" }
"length"
{ "length" "sequences" }
f
2008-01-31 21:11:46 -05:00
} {
{ "object" "kernel" }
"aux"
{ "string-aux" "strings.private" }
{ "set-string-aux" "strings.private" }
2007-09-20 18:09:08 -04:00
}
} define-builtin
"quotation" "quotations" create "quotation?" "quotations" create
{
{
{ "object" "kernel" }
"array"
{ "quotation-array" "quotations.private" }
f
}
{
{ "object" "kernel" }
"compiled?"
{ "quotation-compiled?" "quotations" }
f
}
2007-09-20 18:09:08 -04:00
} define-builtin
"dll" "alien" create "dll?" "alien" create
{
{
{ "byte-array" "byte-arrays" }
"path"
{ "(dll-path)" "alien" }
f
}
}
define-builtin
"alien" "alien" create "alien?" "alien" create
{
{
{ "c-ptr" "alien" }
"alien"
{ "underlying-alien" "alien" }
f
} {
{ "object" "kernel" }
"expired?"
{ "expired?" "alien" }
f
}
}
define-builtin
"word" "words" create "word?" "words" create
{
2008-01-28 19:15:21 -05:00
f
2007-09-20 18:09:08 -04:00
{
{ "object" "kernel" }
"name"
{ "word-name" "words" }
{ "set-word-name" "words" }
}
{
{ "object" "kernel" }
"vocabulary"
{ "word-vocabulary" "words" }
{ "set-word-vocabulary" "words" }
}
{
2008-01-02 19:36:36 -05:00
{ "quotation" "quotations" }
2007-09-20 18:09:08 -04:00
"def"
{ "word-def" "words" }
{ "set-word-def" "words.private" }
}
{
{ "object" "kernel" }
"props"
{ "word-props" "words" }
{ "set-word-props" "words" }
}
{
{ "object" "kernel" }
"?"
{ "compiled?" "words" }
f
}
{
{ "fixnum" "math" }
"counter"
{ "profile-counter" "tools.profiler.private" }
{ "set-profile-counter" "tools.profiler.private" }
}
} define-builtin
"byte-array" "byte-arrays" create
"byte-array?" "byte-arrays" create
{ } define-builtin
"bit-array" "bit-arrays" create
"bit-array?" "bit-arrays" create
{ } define-builtin
"float-array" "float-arrays" create
"float-array?" "float-arrays" create
{ } define-builtin
"callstack" "kernel" create "callstack?" "kernel" create
{ } define-builtin
! Define general-t type, which is any object that is not f.
"general-t" "kernel" create
"f" "syntax" lookup builtins get remove [ ] subset f union-class
define-class
! Catch-all class for providing a default method.
"object" "kernel" create [ drop t ] "predicate" set-word-prop
"object" "kernel" create
builtins get [ ] subset f union-class define-class
! Class of objects with object tag
"hi-tag" "classes.private" create
builtins get num-tags get tail f union-class define-class
! Null class with no instances.
"null" "kernel" create [ drop f ] "predicate" set-word-prop
"null" "kernel" create { } f union-class define-class
! Create special tombstone values
"tombstone" "hashtables.private" create { } define-tuple-class
"((empty))" "hashtables.private" create
"tombstone" "hashtables.private" lookup f
2array >tuple 1quotation define-inline
"((tombstone))" "hashtables.private" create
"tombstone" "hashtables.private" lookup t
2array >tuple 1quotation define-inline
2008-01-28 19:15:21 -05:00
! Some tuple classes
2008-01-30 00:13:47 -05:00
"hashtable" "hashtables" create
{
{
{ "array-capacity" "sequences.private" }
"count"
{ "hash-count" "hashtables.private" }
{ "set-hash-count" "hashtables.private" }
} {
{ "array-capacity" "sequences.private" }
"deleted"
{ "hash-deleted" "hashtables.private" }
{ "set-hash-deleted" "hashtables.private" }
} {
{ "array" "arrays" }
"array"
{ "hash-array" "hashtables.private" }
{ "set-hash-array" "hashtables.private" }
}
} define-tuple-class
"sbuf" "sbufs" create
{
{
{ "string" "strings" }
"underlying"
{ "underlying" "growable" }
{ "set-underlying" "growable" }
} {
{ "array-capacity" "sequences.private" }
"length"
{ "length" "sequences" }
{ "set-fill" "growable" }
}
} define-tuple-class
"vector" "vectors" create
{
{
{ "array" "arrays" }
"underlying"
{ "underlying" "growable" }
{ "set-underlying" "growable" }
} {
{ "array-capacity" "sequences.private" }
"fill"
{ "length" "sequences" }
{ "set-fill" "growable" }
}
} define-tuple-class
2008-01-28 19:15:21 -05:00
"byte-vector" "byte-vectors" create
{
{
{ "byte-array" "byte-arrays" }
"underlying"
{ "underlying" "growable" }
{ "set-underlying" "growable" }
2008-01-29 16:04:26 -05:00
} {
{ "array-capacity" "sequences.private" }
"fill"
{ "length" "sequences" }
{ "set-fill" "growable" }
2008-01-28 19:15:21 -05:00
}
} define-tuple-class
"bit-vector" "bit-vectors" create
{
{
{ "bit-array" "bit-arrays" }
"underlying"
{ "underlying" "growable" }
{ "set-underlying" "growable" }
2008-01-29 16:04:26 -05:00
} {
{ "array-capacity" "sequences.private" }
"fill"
{ "length" "sequences" }
{ "set-fill" "growable" }
2008-01-28 19:15:21 -05:00
}
} define-tuple-class
"float-vector" "float-vectors" create
{
{
{ "float-array" "float-arrays" }
"underlying"
{ "underlying" "growable" }
{ "set-underlying" "growable" }
2008-01-29 16:04:26 -05:00
} {
{ "array-capacity" "sequences.private" }
"fill"
{ "length" "sequences" }
{ "set-fill" "growable" }
2008-01-28 19:15:21 -05:00
}
} define-tuple-class
"curry" "kernel" create
{
{
{ "object" "kernel" }
"obj"
{ "curry-obj" "kernel" }
f
} {
{ "object" "kernel" }
"quot"
{ "curry-quot" "kernel" }
f
}
} define-tuple-class
"compose" "kernel" create
{
{
{ "object" "kernel" }
"first"
{ "compose-first" "kernel" }
f
} {
{ "object" "kernel" }
"second"
{ "compose-second" "kernel" }
f
}
} define-tuple-class
2007-12-25 18:10:05 -05:00
! Primitive words
2007-12-26 21:37:18 -05:00
: make-primitive ( word vocab n -- )
>r create dup reset-word r>
[ do-primitive ] curry [ ] like define ;
2007-12-25 18:10:05 -05:00
{
{ "(execute)" "words.private" }
{ "(call)" "kernel.private" }
{ "bignum>fixnum" "math.private" }
{ "float>fixnum" "math.private" }
{ "fixnum>bignum" "math.private" }
{ "float>bignum" "math.private" }
{ "fixnum>float" "math.private" }
{ "bignum>float" "math.private" }
{ "<ratio>" "math.private" }
{ "string>float" "math.private" }
{ "float>string" "math.private" }
{ "float>bits" "math" }
{ "double>bits" "math" }
{ "bits>float" "math" }
{ "bits>double" "math" }
{ "<complex>" "math.private" }
{ "fixnum+" "math.private" }
{ "fixnum+fast" "math.private" }
{ "fixnum-" "math.private" }
{ "fixnum-fast" "math.private" }
{ "fixnum*" "math.private" }
{ "fixnum*fast" "math.private" }
{ "fixnum/i" "math.private" }
{ "fixnum-mod" "math.private" }
{ "fixnum/mod" "math.private" }
{ "fixnum-bitand" "math.private" }
{ "fixnum-bitor" "math.private" }
{ "fixnum-bitxor" "math.private" }
{ "fixnum-bitnot" "math.private" }
{ "fixnum-shift" "math.private" }
2008-01-12 21:13:40 -05:00
{ "fixnum-shift-fast" "math.private" }
2007-12-25 18:10:05 -05:00
{ "fixnum<" "math.private" }
{ "fixnum<=" "math.private" }
{ "fixnum>" "math.private" }
{ "fixnum>=" "math.private" }
{ "bignum=" "math.private" }
{ "bignum+" "math.private" }
{ "bignum-" "math.private" }
{ "bignum*" "math.private" }
{ "bignum/i" "math.private" }
{ "bignum-mod" "math.private" }
{ "bignum/mod" "math.private" }
{ "bignum-bitand" "math.private" }
{ "bignum-bitor" "math.private" }
{ "bignum-bitxor" "math.private" }
{ "bignum-bitnot" "math.private" }
{ "bignum-shift" "math.private" }
{ "bignum<" "math.private" }
{ "bignum<=" "math.private" }
{ "bignum>" "math.private" }
{ "bignum>=" "math.private" }
{ "bignum-bit?" "math.private" }
{ "bignum-log2" "math.private" }
{ "byte-array>bignum" "math" }
{ "float=" "math.private" }
{ "float+" "math.private" }
{ "float-" "math.private" }
{ "float*" "math.private" }
{ "float/f" "math.private" }
{ "float-mod" "math.private" }
{ "float<" "math.private" }
{ "float<=" "math.private" }
{ "float>" "math.private" }
{ "float>=" "math.private" }
2008-01-06 13:17:50 -05:00
{ "<word>" "words" }
2007-12-25 18:10:05 -05:00
{ "word-xt" "words" }
{ "drop" "kernel" }
{ "2drop" "kernel" }
{ "3drop" "kernel" }
{ "dup" "kernel" }
{ "2dup" "kernel" }
{ "3dup" "kernel" }
{ "rot" "kernel" }
{ "-rot" "kernel" }
{ "dupd" "kernel" }
{ "swapd" "kernel" }
{ "nip" "kernel" }
{ "2nip" "kernel" }
{ "tuck" "kernel" }
{ "over" "kernel" }
{ "pick" "kernel" }
{ "swap" "kernel" }
{ ">r" "kernel" }
{ "r>" "kernel" }
{ "eq?" "kernel" }
{ "getenv" "kernel.private" }
{ "setenv" "kernel.private" }
{ "(stat)" "io.files.private" }
{ "(directory)" "io.files.private" }
{ "data-gc" "memory" }
{ "code-gc" "memory" }
{ "gc-time" "memory" }
{ "save-image" "memory" }
{ "save-image-and-exit" "memory" }
{ "datastack" "kernel" }
{ "retainstack" "kernel" }
{ "callstack" "kernel" }
{ "set-datastack" "kernel" }
{ "set-retainstack" "kernel" }
{ "set-callstack" "kernel" }
{ "exit" "system" }
{ "data-room" "memory" }
{ "code-room" "memory" }
{ "os-env" "system" }
{ "millis" "system" }
{ "type" "kernel.private" }
{ "tag" "kernel.private" }
{ "modify-code-heap" "compiler.units" }
2007-12-25 18:10:05 -05:00
{ "dlopen" "alien" }
{ "dlsym" "alien" }
{ "dlclose" "alien" }
{ "<byte-array>" "byte-arrays" }
{ "<bit-array>" "bit-arrays" }
{ "<displaced-alien>" "alien" }
2008-01-31 21:11:46 -05:00
{ "alien-signed-cell" "alien.accessors" }
{ "set-alien-signed-cell" "alien.accessors" }
{ "alien-unsigned-cell" "alien.accessors" }
{ "set-alien-unsigned-cell" "alien.accessors" }
{ "alien-signed-8" "alien.accessors" }
{ "set-alien-signed-8" "alien.accessors" }
{ "alien-unsigned-8" "alien.accessors" }
{ "set-alien-unsigned-8" "alien.accessors" }
{ "alien-signed-4" "alien.accessors" }
{ "set-alien-signed-4" "alien.accessors" }
{ "alien-unsigned-4" "alien.accessors" }
{ "set-alien-unsigned-4" "alien.accessors" }
{ "alien-signed-2" "alien.accessors" }
{ "set-alien-signed-2" "alien.accessors" }
{ "alien-unsigned-2" "alien.accessors" }
{ "set-alien-unsigned-2" "alien.accessors" }
{ "alien-signed-1" "alien.accessors" }
{ "set-alien-signed-1" "alien.accessors" }
{ "alien-unsigned-1" "alien.accessors" }
{ "set-alien-unsigned-1" "alien.accessors" }
{ "alien-float" "alien.accessors" }
{ "set-alien-float" "alien.accessors" }
{ "alien-double" "alien.accessors" }
{ "set-alien-double" "alien.accessors" }
{ "alien-cell" "alien.accessors" }
{ "set-alien-cell" "alien.accessors" }
2007-12-25 18:10:05 -05:00
{ "alien>char-string" "alien" }
{ "string>char-alien" "alien" }
{ "alien>u16-string" "alien" }
{ "string>u16-alien" "alien" }
{ "(throw)" "kernel.private" }
{ "alien-address" "alien" }
{ "slot" "slots.private" }
{ "set-slot" "slots.private" }
2008-02-01 00:00:08 -05:00
{ "string-nth" "strings.private" }
{ "set-string-nth" "strings.private" }
2007-12-25 18:10:05 -05:00
{ "resize-array" "arrays" }
{ "resize-string" "strings" }
{ "<array>" "arrays" }
{ "begin-scan" "memory" }
{ "next-object" "memory" }
{ "end-scan" "memory" }
{ "size" "memory" }
{ "die" "kernel" }
{ "fopen" "io.streams.c" }
{ "fgetc" "io.streams.c" }
{ "fread" "io.streams.c" }
{ "fputc" "io.streams.c" }
2007-12-25 18:10:05 -05:00
{ "fwrite" "io.streams.c" }
{ "fflush" "io.streams.c" }
{ "fclose" "io.streams.c" }
{ "<wrapper>" "kernel" }
{ "(clone)" "kernel" }
{ "<string>" "strings" }
{ "(>tuple)" "tuples.private" }
{ "array>quotation" "quotations.private" }
{ "quotation-xt" "quotations" }
{ "<tuple>" "tuples.private" }
{ "tuple>array" "tuples" }
{ "profiling" "tools.profiler.private" }
{ "become" "kernel.private" }
{ "(sleep)" "threads.private" }
{ "<float-array>" "float-arrays" }
{ "<tuple-boa>" "tuples.private" }
2008-02-02 00:07:19 -05:00
{ "class-hash" "kernel.private" }
2007-12-25 18:10:05 -05:00
{ "callstack>array" "kernel" }
{ "innermost-frame-quot" "kernel.private" }
{ "innermost-frame-scan" "kernel.private" }
{ "set-innermost-frame-quot" "kernel.private" }
{ "call-clear" "kernel" }
{ "(os-envs)" "system" }
2008-01-29 16:04:26 -05:00
{ "resize-byte-array" "byte-arrays" }
{ "resize-bit-array" "bit-arrays" }
{ "resize-float-array" "float-arrays" }
{ "dll-valid?" "alien" }
2007-12-25 18:10:05 -05:00
}
dup length [ >r first2 r> make-primitive ] 2each
2007-09-20 18:09:08 -04:00
! Bump build number
2008-01-02 19:36:36 -05:00
"build" "kernel" create build 1+ 1quotation define