2009-01-26 00:04:35 -05:00
|
|
|
! Copyright (C) 2004, 2009 Slava Pestov.
|
2007-09-20 18:09:08 -04:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2009-05-16 11:45:17 -04:00
|
|
|
USING: alien arrays byte-arrays generic hashtables hashtables.private
|
|
|
|
io io.binary io.files io.encodings.binary io.pathnames kernel
|
|
|
|
kernel.private math namespaces make parser prettyprint sequences
|
|
|
|
strings sbufs vectors words quotations assocs system layouts splitting
|
|
|
|
grouping growable classes classes.builtin classes.tuple
|
|
|
|
classes.tuple.private vocabs vocabs.loader source-files definitions
|
|
|
|
debugger quotations.private combinators math.order math.private
|
|
|
|
accessors slots.private generic.single.private compiler.units
|
|
|
|
compiler.constants fry bootstrap.image.syntax ;
|
2007-09-20 18:09:08 -04:00
|
|
|
IN: bootstrap.image
|
|
|
|
|
2008-11-07 22:09:42 -05:00
|
|
|
: arch ( os cpu -- arch )
|
|
|
|
{
|
2008-11-07 23:37:40 -05:00
|
|
|
{ "ppc" [ "-ppc" append ] }
|
|
|
|
{ "x86.64" [ "winnt" = "winnt" "unix" ? "-x86.64" append ] }
|
2008-11-07 22:09:42 -05:00
|
|
|
[ nip ]
|
|
|
|
} case ;
|
|
|
|
|
2008-02-07 18:55:31 -05:00
|
|
|
: my-arch ( -- arch )
|
2008-11-07 22:09:42 -05:00
|
|
|
os name>> cpu name>> arch ;
|
2008-02-07 18:55:31 -05:00
|
|
|
|
|
|
|
: boot-image-name ( arch -- string )
|
2008-12-06 19:58:45 -05:00
|
|
|
"boot." ".image" surround ;
|
2008-02-07 18:55:31 -05:00
|
|
|
|
|
|
|
: my-boot-image-name ( -- string )
|
|
|
|
my-arch boot-image-name ;
|
|
|
|
|
|
|
|
: images ( -- seq )
|
|
|
|
{
|
|
|
|
"x86.32"
|
2008-11-07 21:33:32 -05:00
|
|
|
"winnt-x86.64" "unix-x86.64"
|
2008-02-07 18:55:31 -05:00
|
|
|
"linux-ppc" "macosx-ppc"
|
|
|
|
} ;
|
|
|
|
|
2007-09-20 18:09:08 -04:00
|
|
|
<PRIVATE
|
|
|
|
|
2008-04-28 22:25:59 -04:00
|
|
|
! Object cache; we only consider numbers equal if they have the
|
|
|
|
! same type
|
|
|
|
TUPLE: id obj ;
|
|
|
|
|
|
|
|
C: <id> id
|
|
|
|
|
|
|
|
M: id hashcode* obj>> hashcode* ;
|
|
|
|
|
2008-04-29 02:49:06 -04:00
|
|
|
GENERIC: (eql?) ( obj1 obj2 -- ? )
|
|
|
|
|
|
|
|
: eql? ( obj1 obj2 -- ? )
|
|
|
|
[ (eql?) ] [ [ class ] bi@ = ] 2bi and ;
|
|
|
|
|
|
|
|
M: integer (eql?) = ;
|
|
|
|
|
2009-05-09 19:17:30 -04:00
|
|
|
M: float (eql?)
|
|
|
|
over float? [ fp-bitwise= ] [ 2drop f ] if ;
|
|
|
|
|
2008-04-29 02:49:06 -04:00
|
|
|
M: sequence (eql?)
|
|
|
|
over sequence? [
|
|
|
|
2dup [ length ] bi@ =
|
|
|
|
[ [ eql? ] 2all? ] [ 2drop f ] if
|
|
|
|
] [ 2drop f ] if ;
|
|
|
|
|
|
|
|
M: object (eql?) = ;
|
|
|
|
|
2008-04-28 22:25:59 -04:00
|
|
|
M: id equal?
|
2008-04-29 02:49:06 -04:00
|
|
|
over id? [ [ obj>> ] bi@ eql? ] [ 2drop f ] if ;
|
2008-04-28 22:25:59 -04:00
|
|
|
|
|
|
|
SYMBOL: objects
|
|
|
|
|
2008-12-15 20:44:56 -05:00
|
|
|
: (objects) ( obj -- id assoc ) <id> objects get ; inline
|
2008-04-28 22:25:59 -04:00
|
|
|
|
|
|
|
: lookup-object ( obj -- n/f ) (objects) at ;
|
|
|
|
|
|
|
|
: put-object ( n obj -- ) (objects) set-at ;
|
|
|
|
|
|
|
|
: cache-object ( obj quot -- value )
|
2009-01-26 00:04:35 -05:00
|
|
|
[ (objects) ] dip '[ obj>> @ ] cache ; inline
|
2008-04-28 22:25:59 -04:00
|
|
|
|
2007-09-20 18:09:08 -04:00
|
|
|
! Constants
|
|
|
|
|
2009-02-22 20:13:08 -05:00
|
|
|
CONSTANT: image-magic HEX: 0f0e0d0c
|
|
|
|
CONSTANT: image-version 4
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-02-22 20:13:08 -05:00
|
|
|
CONSTANT: data-base 1024
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-02-22 20:13:08 -05:00
|
|
|
CONSTANT: userenv-size 70
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-02-22 20:13:08 -05:00
|
|
|
CONSTANT: header-size 10
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-02-22 20:13:08 -05:00
|
|
|
CONSTANT: data-heap-size-offset 3
|
|
|
|
CONSTANT: t-offset 6
|
|
|
|
CONSTANT: 0-offset 7
|
|
|
|
CONSTANT: 1-offset 8
|
|
|
|
CONSTANT: -1-offset 9
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-07-11 18:25:46 -04:00
|
|
|
SYMBOL: sub-primitives
|
|
|
|
|
2009-05-06 21:04:49 -04:00
|
|
|
SYMBOL: jit-relocations
|
2008-07-11 18:25:46 -04:00
|
|
|
|
2009-05-06 21:04:49 -04:00
|
|
|
: compute-offset ( rc -- offset )
|
|
|
|
[ building get length ] dip rc-absolute-cell = bootstrap-cell 4 ? - ;
|
2009-04-25 23:35:19 -04:00
|
|
|
|
|
|
|
: jit-rel ( rc rt -- )
|
2009-05-06 21:04:49 -04:00
|
|
|
over compute-offset 3array jit-relocations get push-all ;
|
2009-04-25 23:35:19 -04:00
|
|
|
|
2009-05-06 21:04:49 -04:00
|
|
|
: make-jit ( quot -- jit-data )
|
2009-04-25 23:35:19 -04:00
|
|
|
[
|
2009-05-06 21:04:49 -04:00
|
|
|
V{ } clone jit-relocations set
|
2009-04-25 23:35:19 -04:00
|
|
|
call( -- )
|
2009-05-06 21:04:49 -04:00
|
|
|
jit-relocations get >array
|
2009-04-30 05:34:35 -04:00
|
|
|
] B{ } make prefix ;
|
2009-04-25 23:35:19 -04:00
|
|
|
|
|
|
|
: jit-define ( quot name -- )
|
2009-03-22 18:50:13 -04:00
|
|
|
[ make-jit ] dip set ;
|
2008-07-11 18:25:46 -04:00
|
|
|
|
2009-04-25 23:35:19 -04:00
|
|
|
: define-sub-primitive ( quot word -- )
|
2008-11-29 14:40:43 -05:00
|
|
|
[ make-jit ] dip sub-primitives get set-at ;
|
2007-12-25 23:40:36 -05:00
|
|
|
|
2007-09-20 18:09:08 -04:00
|
|
|
! The image being constructed; a vector of word-size integers
|
|
|
|
SYMBOL: image
|
|
|
|
|
|
|
|
! Image output format
|
|
|
|
SYMBOL: big-endian
|
|
|
|
|
|
|
|
! Bootstrap architecture name
|
|
|
|
SYMBOL: architecture
|
|
|
|
|
2009-05-06 23:04:01 -04:00
|
|
|
RESET
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
! Boot quotation, set in stage1.factor
|
2009-05-06 23:04:01 -04:00
|
|
|
USERENV: bootstrap-boot-quot 20
|
|
|
|
|
|
|
|
! Bootstrap global namesapce
|
|
|
|
USERENV: bootstrap-global 21
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
! JIT parameters
|
2009-05-06 23:04:01 -04:00
|
|
|
USERENV: jit-prolog 23
|
|
|
|
USERENV: jit-primitive-word 24
|
|
|
|
USERENV: jit-primitive 25
|
|
|
|
USERENV: jit-word-jump 26
|
|
|
|
USERENV: jit-word-call 27
|
|
|
|
USERENV: jit-word-special 28
|
|
|
|
USERENV: jit-if-word 29
|
|
|
|
USERENV: jit-if 30
|
|
|
|
USERENV: jit-epilog 31
|
|
|
|
USERENV: jit-return 32
|
|
|
|
USERENV: jit-profiling 33
|
|
|
|
USERENV: jit-push-immediate 34
|
|
|
|
USERENV: jit-dip-word 35
|
|
|
|
USERENV: jit-dip 36
|
|
|
|
USERENV: jit-2dip-word 37
|
|
|
|
USERENV: jit-2dip 38
|
|
|
|
USERENV: jit-3dip-word 39
|
|
|
|
USERENV: jit-3dip 40
|
|
|
|
USERENV: jit-execute-word 41
|
|
|
|
USERENV: jit-execute-jump 42
|
|
|
|
USERENV: jit-execute-call 43
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-04-28 04:48:37 -04:00
|
|
|
! PIC stubs
|
2009-05-06 23:04:01 -04:00
|
|
|
USERENV: pic-load 47
|
|
|
|
USERENV: pic-tag 48
|
|
|
|
USERENV: pic-hi-tag 49
|
|
|
|
USERENV: pic-tuple 50
|
|
|
|
USERENV: pic-hi-tag-tuple 51
|
|
|
|
USERENV: pic-check-tag 52
|
|
|
|
USERENV: pic-check 53
|
|
|
|
USERENV: pic-hit 54
|
|
|
|
USERENV: pic-miss-word 55
|
|
|
|
USERENV: pic-miss-tail-word 56
|
2009-04-28 04:48:37 -04:00
|
|
|
|
2009-04-30 04:37:07 -04:00
|
|
|
! Megamorphic dispatch
|
2009-05-06 23:04:01 -04:00
|
|
|
USERENV: mega-lookup 57
|
|
|
|
USERENV: mega-lookup-word 58
|
|
|
|
USERENV: mega-miss-word 59
|
2009-04-30 04:37:07 -04:00
|
|
|
|
2007-12-26 20:40:46 -05:00
|
|
|
! Default definition for undefined words
|
2009-05-06 23:04:01 -04:00
|
|
|
USERENV: undefined-quot 60
|
2008-11-23 03:44:56 -05:00
|
|
|
|
|
|
|
: userenv-offset ( symbol -- n )
|
2009-05-06 23:04:01 -04:00
|
|
|
userenvs get at header-size + ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: emit ( cell -- ) image get push ;
|
|
|
|
|
|
|
|
: emit-64 ( cell -- )
|
|
|
|
bootstrap-cell 8 = [
|
|
|
|
emit
|
|
|
|
] [
|
|
|
|
d>w/w big-endian get [ swap ] unless emit emit
|
|
|
|
] if ;
|
|
|
|
|
|
|
|
: emit-seq ( seq -- ) image get push-all ;
|
|
|
|
|
|
|
|
: fixup ( value offset -- ) image get set-nth ;
|
|
|
|
|
|
|
|
: heap-size ( -- size )
|
|
|
|
image get length header-size - userenv-size -
|
|
|
|
bootstrap-cells ;
|
|
|
|
|
|
|
|
: here ( -- size ) heap-size data-base + ;
|
|
|
|
|
2008-03-31 02:19:21 -04:00
|
|
|
: here-as ( tag -- pointer ) here bitor ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: align-here ( -- )
|
2008-03-31 02:19:21 -04:00
|
|
|
here 8 mod 4 = [ 0 emit ] when ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-01-02 19:36:36 -05:00
|
|
|
: emit-fixnum ( n -- ) tag-fixnum emit ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-04-30 00:35:02 -04:00
|
|
|
: emit-object ( class quot -- addr )
|
|
|
|
over tag-number here-as [ swap type-number tag-fixnum emit call align-here ] dip ;
|
2007-09-20 18:09:08 -04:00
|
|
|
inline
|
|
|
|
|
|
|
|
! Write an object to the image.
|
|
|
|
GENERIC: ' ( obj -- ptr )
|
|
|
|
|
|
|
|
! Image header
|
|
|
|
|
|
|
|
: emit-header ( -- )
|
|
|
|
image-magic emit
|
|
|
|
image-version emit
|
|
|
|
data-base emit ! relocation base at end of header
|
|
|
|
0 emit ! size of data heap set later
|
|
|
|
0 emit ! reloc base of code heap is 0
|
|
|
|
0 emit ! size of code heap is 0
|
|
|
|
0 emit ! pointer to t object
|
|
|
|
0 emit ! pointer to bignum 0
|
|
|
|
0 emit ! pointer to bignum 1
|
|
|
|
0 emit ! pointer to bignum -1
|
|
|
|
userenv-size [ f ' emit ] times ;
|
|
|
|
|
|
|
|
: emit-userenv ( symbol -- )
|
2008-03-31 02:19:21 -04:00
|
|
|
[ get ' ] [ userenv-offset ] bi fixup ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
! Bignums
|
|
|
|
|
2008-06-08 16:32:55 -04:00
|
|
|
: bignum-bits ( -- n ) bootstrap-cell-bits 2 - ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-06-08 16:32:55 -04:00
|
|
|
: bignum-radix ( -- n ) bignum-bits 2^ 1- ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: bignum>seq ( n -- seq )
|
|
|
|
#! n is positive or zero.
|
2007-10-16 04:15:16 -04:00
|
|
|
[ dup 0 > ]
|
2008-03-31 02:19:21 -04:00
|
|
|
[ [ bignum-bits neg shift ] [ bignum-radix bitand ] bi ]
|
2009-02-28 16:31:34 -05:00
|
|
|
produce nip ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: emit-bignum ( n -- )
|
2008-03-31 02:19:21 -04:00
|
|
|
dup dup 0 < [ neg ] when bignum>seq
|
|
|
|
[ nip length 1+ emit-fixnum ]
|
|
|
|
[ drop 0 < 1 0 ? emit ]
|
|
|
|
[ nip emit-seq ]
|
|
|
|
2tri ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
M: bignum '
|
2008-04-28 22:25:59 -04:00
|
|
|
[
|
2009-04-30 00:35:02 -04:00
|
|
|
bignum [ emit-bignum ] emit-object
|
2008-04-28 22:25:59 -04:00
|
|
|
] cache-object ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
! Fixnums
|
|
|
|
|
|
|
|
M: fixnum '
|
|
|
|
#! When generating a 32-bit image on a 64-bit system,
|
|
|
|
#! some fixnums should be bignums.
|
2008-03-12 02:54:29 -04:00
|
|
|
dup
|
|
|
|
bootstrap-most-negative-fixnum
|
|
|
|
bootstrap-most-positive-fixnum between?
|
2008-01-02 19:36:36 -05:00
|
|
|
[ tag-fixnum ] [ >bignum ' ] if ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-07-05 22:00:05 -04:00
|
|
|
TUPLE: fake-bignum n ;
|
|
|
|
|
|
|
|
C: <fake-bignum> fake-bignum
|
|
|
|
|
|
|
|
M: fake-bignum ' n>> tag-fixnum ;
|
|
|
|
|
2007-09-20 18:09:08 -04:00
|
|
|
! Floats
|
|
|
|
|
|
|
|
M: float '
|
2008-04-28 22:25:59 -04:00
|
|
|
[
|
2009-04-30 00:35:02 -04:00
|
|
|
float [
|
2008-04-28 22:25:59 -04:00
|
|
|
align-here double>bits emit-64
|
|
|
|
] emit-object
|
|
|
|
] cache-object ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
! Special objects
|
|
|
|
|
|
|
|
! Padded with fixnums for 8-byte alignment
|
|
|
|
|
2008-06-08 16:32:55 -04:00
|
|
|
: t, ( -- ) t t-offset fixup ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
M: f '
|
|
|
|
#! f is #define F RETAG(0,F_TYPE)
|
|
|
|
drop \ f tag-number ;
|
|
|
|
|
2008-06-08 16:32:55 -04:00
|
|
|
: 0, ( -- ) 0 >bignum ' 0-offset fixup ;
|
|
|
|
: 1, ( -- ) 1 >bignum ' 1-offset fixup ;
|
|
|
|
: -1, ( -- ) -1 >bignum ' -1-offset fixup ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
! Words
|
|
|
|
|
2008-07-11 18:25:46 -04:00
|
|
|
: word-sub-primitive ( word -- obj )
|
|
|
|
global [ target-word ] bind sub-primitives get at ;
|
|
|
|
|
2007-09-20 18:09:08 -04:00
|
|
|
: emit-word ( word -- )
|
|
|
|
[
|
2008-03-31 02:19:21 -04:00
|
|
|
[ subwords [ emit-word ] each ]
|
|
|
|
[
|
|
|
|
[
|
|
|
|
{
|
2008-09-10 04:17:22 -04:00
|
|
|
[ hashcode <fake-bignum> , ]
|
2008-06-28 03:36:20 -04:00
|
|
|
[ name>> , ]
|
|
|
|
[ vocabulary>> , ]
|
|
|
|
[ def>> , ]
|
|
|
|
[ props>> , ]
|
2009-05-06 20:22:22 -04:00
|
|
|
[ pic-def>> , ]
|
|
|
|
[ pic-tail-def>> , ]
|
2008-07-11 18:25:46 -04:00
|
|
|
[ drop 0 , ] ! count
|
|
|
|
[ word-sub-primitive , ]
|
|
|
|
[ drop 0 , ] ! xt
|
|
|
|
[ drop 0 , ] ! code
|
|
|
|
[ drop 0 , ] ! profiling
|
2008-03-31 02:19:21 -04:00
|
|
|
} cleave
|
|
|
|
] { } make [ ' ] map
|
|
|
|
] bi
|
2009-04-30 00:35:02 -04:00
|
|
|
\ word [ emit-seq ] emit-object
|
2008-04-28 22:25:59 -04:00
|
|
|
] keep put-object ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: word-error ( word msg -- * )
|
2008-06-28 03:36:20 -04:00
|
|
|
[ % dup vocabulary>> % " " % name>> % ] "" make throw ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: transfer-word ( word -- word )
|
2008-03-31 02:19:21 -04:00
|
|
|
[ target-word ] keep or ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: fixup-word ( word -- offset )
|
2008-04-28 22:25:59 -04:00
|
|
|
transfer-word dup lookup-object
|
2007-09-20 18:09:08 -04:00
|
|
|
[ ] [ "Not in image: " word-error ] ?if ;
|
|
|
|
|
|
|
|
: fixup-words ( -- )
|
|
|
|
image get [ dup word? [ fixup-word ] when ] change-each ;
|
|
|
|
|
|
|
|
M: word ' ;
|
|
|
|
|
|
|
|
! Wrappers
|
|
|
|
|
|
|
|
M: wrapper '
|
2009-04-30 00:35:02 -04:00
|
|
|
wrapped>> ' wrapper [ emit ] emit-object ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
! Strings
|
2009-01-27 01:03:19 -05:00
|
|
|
: native> ( object -- object )
|
|
|
|
big-endian get [ [ be> ] map ] [ [ le> ] map ] if ;
|
|
|
|
|
2008-04-30 17:11:55 -04:00
|
|
|
: emit-bytes ( seq -- )
|
2009-01-27 01:03:19 -05:00
|
|
|
bootstrap-cell <groups> native> emit-seq ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-04-30 17:11:55 -04:00
|
|
|
: pad-bytes ( seq -- newseq )
|
2009-01-29 23:19:07 -05:00
|
|
|
dup length bootstrap-cell align 0 pad-tail ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-01-27 01:03:19 -05:00
|
|
|
: extended-part ( str -- str' )
|
|
|
|
dup [ 128 < ] all? [ drop f ] [
|
|
|
|
[ -7 shift 1 bitxor ] { } map-as
|
|
|
|
big-endian get
|
|
|
|
[ [ 2 >be ] { } map-as ]
|
|
|
|
[ [ 2 >le ] { } map-as ] if
|
|
|
|
B{ } join
|
|
|
|
] if ;
|
|
|
|
|
|
|
|
: ascii-part ( str -- str' )
|
|
|
|
[
|
|
|
|
[ 128 mod ] [ 128 >= ] bi
|
|
|
|
[ 128 bitor ] when
|
|
|
|
] B{ } map-as ;
|
2008-12-05 07:38:51 -05:00
|
|
|
|
2007-09-20 18:09:08 -04:00
|
|
|
: emit-string ( string -- ptr )
|
2009-01-27 01:03:19 -05:00
|
|
|
[ length ] [ extended-part ' ] [ ] tri
|
2009-04-30 00:35:02 -04:00
|
|
|
string [
|
2009-01-27 01:03:19 -05:00
|
|
|
[ emit-fixnum ]
|
|
|
|
[ emit ]
|
|
|
|
[ f ' emit ascii-part pad-bytes emit-bytes ]
|
|
|
|
tri*
|
2007-09-20 18:09:08 -04:00
|
|
|
] emit-object ;
|
|
|
|
|
|
|
|
M: string '
|
|
|
|
#! We pool strings so that each string is only written once
|
|
|
|
#! to the image
|
2008-04-28 22:25:59 -04:00
|
|
|
[ emit-string ] cache-object ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: assert-empty ( seq -- )
|
|
|
|
length 0 assert= ;
|
|
|
|
|
|
|
|
: emit-dummy-array ( obj type -- ptr )
|
2008-03-31 02:19:21 -04:00
|
|
|
[ assert-empty ] [
|
|
|
|
[ 0 emit-fixnum ] emit-object
|
|
|
|
] bi* ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-04-30 17:11:55 -04:00
|
|
|
M: byte-array '
|
2009-04-30 00:35:02 -04:00
|
|
|
byte-array [
|
2008-04-30 17:11:55 -04:00
|
|
|
dup length emit-fixnum
|
|
|
|
pad-bytes emit-bytes
|
|
|
|
] emit-object ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-03-26 04:57:48 -04:00
|
|
|
! Tuples
|
2009-03-22 18:50:13 -04:00
|
|
|
ERROR: tuple-removed class ;
|
|
|
|
|
|
|
|
: require-tuple-layout ( word -- layout )
|
|
|
|
dup tuple-layout [ ] [ tuple-removed ] ?if ;
|
|
|
|
|
2008-03-31 02:19:21 -04:00
|
|
|
: (emit-tuple) ( tuple -- pointer )
|
2008-09-03 00:21:08 -04:00
|
|
|
[ tuple-slots ]
|
2009-03-22 18:50:13 -04:00
|
|
|
[ class transfer-word require-tuple-layout ] bi prefix [ ' ] map
|
2009-04-30 00:35:02 -04:00
|
|
|
tuple [ emit-seq ] emit-object ;
|
2008-03-31 02:19:21 -04:00
|
|
|
|
2008-03-26 04:57:48 -04:00
|
|
|
: emit-tuple ( tuple -- pointer )
|
2008-06-28 03:36:20 -04:00
|
|
|
dup class name>> "tombstone" =
|
2008-04-28 22:25:59 -04:00
|
|
|
[ [ (emit-tuple) ] cache-object ] [ (emit-tuple) ] if ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
M: tuple ' emit-tuple ;
|
|
|
|
|
|
|
|
M: tombstone '
|
2008-09-03 00:21:08 -04:00
|
|
|
state>> "((tombstone))" "((empty))" ?
|
|
|
|
"hashtables.private" lookup def>> first
|
|
|
|
[ emit-tuple ] cache-object ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-03-26 04:57:48 -04:00
|
|
|
! Arrays
|
2008-11-06 02:58:07 -05:00
|
|
|
: emit-array ( array -- offset )
|
2009-04-30 00:35:02 -04:00
|
|
|
[ ' ] map array [ [ length emit-fixnum ] [ emit-seq ] bi ] emit-object ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-11-06 02:58:07 -05:00
|
|
|
M: array ' emit-array ;
|
|
|
|
|
2008-11-06 01:01:50 -05:00
|
|
|
! This is a hack. We need to detect arrays which are tuple
|
|
|
|
! layout arrays so that they can be internalized, but making
|
|
|
|
! them a built-in type is not worth it.
|
|
|
|
PREDICATE: tuple-layout-array < array
|
|
|
|
dup length 5 >= [
|
|
|
|
[ first tuple-class? ]
|
|
|
|
[ second fixnum? ]
|
|
|
|
[ third fixnum? ]
|
|
|
|
tri and and
|
|
|
|
] [ drop f ] if ;
|
|
|
|
|
2008-11-06 02:58:07 -05:00
|
|
|
M: tuple-layout-array '
|
|
|
|
[
|
|
|
|
[ dup integer? [ <fake-bignum> ] when ] map
|
|
|
|
emit-array
|
|
|
|
] cache-object ;
|
2008-11-06 01:01:50 -05:00
|
|
|
|
2007-09-20 18:09:08 -04:00
|
|
|
! Quotations
|
|
|
|
|
|
|
|
M: quotation '
|
2008-04-28 22:25:59 -04:00
|
|
|
[
|
2008-06-28 03:36:20 -04:00
|
|
|
array>> '
|
2009-04-30 00:35:02 -04:00
|
|
|
quotation [
|
2007-09-20 18:09:08 -04:00
|
|
|
emit ! array
|
2009-03-16 21:11:36 -04:00
|
|
|
f ' emit ! cached-effect
|
|
|
|
f ' emit ! cache-counter
|
2007-10-28 04:33:36 -04:00
|
|
|
0 emit ! xt
|
|
|
|
0 emit ! code
|
2007-09-20 18:09:08 -04:00
|
|
|
] emit-object
|
2008-04-28 22:25:59 -04:00
|
|
|
] cache-object ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
! End of the image
|
|
|
|
|
|
|
|
: emit-words ( -- )
|
|
|
|
all-words [ emit-word ] each ;
|
|
|
|
|
|
|
|
: emit-global ( -- )
|
2008-09-18 00:28:54 -04:00
|
|
|
{
|
|
|
|
dictionary source-files builtins
|
|
|
|
update-map implementors-map
|
|
|
|
} [ [ bootstrap-word ] [ get ] bi ] H{ } map>assoc
|
|
|
|
{
|
|
|
|
class<=-cache class-not-cache classes-intersect-cache
|
2008-10-01 09:20:49 -04:00
|
|
|
class-and-cache class-or-cache next-method-quot-cache
|
2008-09-18 00:28:54 -04:00
|
|
|
} [ H{ } clone ] H{ } map>assoc assoc-union
|
2009-05-06 23:04:01 -04:00
|
|
|
bootstrap-global set ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: emit-jit-data ( -- )
|
|
|
|
\ if jit-if-word set
|
2008-01-02 19:36:36 -05:00
|
|
|
\ do-primitive jit-primitive-word set
|
2008-11-23 03:44:56 -05:00
|
|
|
\ dip jit-dip-word set
|
|
|
|
\ 2dip jit-2dip-word set
|
|
|
|
\ 3dip jit-3dip-word set
|
2009-04-25 22:14:59 -04:00
|
|
|
\ (execute) jit-execute-word set
|
2009-04-28 04:48:37 -04:00
|
|
|
\ inline-cache-miss \ pic-miss-word set
|
2009-05-06 20:22:22 -04:00
|
|
|
\ inline-cache-miss-tail \ pic-miss-tail-word set
|
2009-04-30 04:37:07 -04:00
|
|
|
\ mega-cache-lookup \ mega-lookup-word set
|
|
|
|
\ mega-cache-miss \ mega-miss-word set
|
2009-05-06 23:04:01 -04:00
|
|
|
[ undefined ] undefined-quot set ;
|
|
|
|
|
|
|
|
: emit-userenvs ( -- )
|
|
|
|
userenvs get keys [ emit-userenv ] each ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: fixup-header ( -- )
|
|
|
|
heap-size data-heap-size-offset fixup ;
|
|
|
|
|
2008-02-10 02:49:27 -05:00
|
|
|
: build-image ( -- image )
|
|
|
|
800000 <vector> image set
|
|
|
|
20000 <hashtable> objects set
|
|
|
|
emit-header t, 0, 1, -1,
|
2008-11-03 04:51:28 -05:00
|
|
|
"Building generic words..." print flush
|
2009-03-13 20:39:32 -04:00
|
|
|
remake-generics
|
2007-09-20 18:09:08 -04:00
|
|
|
"Serializing words..." print flush
|
|
|
|
emit-words
|
|
|
|
"Serializing JIT data..." print flush
|
|
|
|
emit-jit-data
|
|
|
|
"Serializing global namespace..." print flush
|
|
|
|
emit-global
|
2009-05-06 23:04:01 -04:00
|
|
|
"Serializing user environment..." print flush
|
|
|
|
emit-userenvs
|
2007-09-20 18:09:08 -04:00
|
|
|
"Performing word fixups..." print flush
|
|
|
|
fixup-words
|
|
|
|
"Performing header fixups..." print flush
|
|
|
|
fixup-header
|
|
|
|
"Image length: " write image get length .
|
|
|
|
"Object cache size: " write objects get assoc-size .
|
2008-02-10 02:49:27 -05:00
|
|
|
\ word global delete-at
|
|
|
|
image get ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
! Image output
|
|
|
|
|
|
|
|
: (write-image) ( image -- )
|
2009-01-26 00:04:35 -05:00
|
|
|
bootstrap-cell big-endian get
|
|
|
|
[ '[ _ >be write ] each ]
|
|
|
|
[ '[ _ >le write ] each ] if ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-02-10 02:49:27 -05:00
|
|
|
: write-image ( image -- )
|
|
|
|
"Writing image to " write
|
|
|
|
architecture get boot-image-name resource-path
|
2008-03-31 02:19:21 -04:00
|
|
|
[ write "..." print flush ]
|
2008-05-05 03:19:25 -04:00
|
|
|
[ binary [ (write-image) ] with-file-writer ] bi ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
PRIVATE>
|
|
|
|
|
2007-11-05 01:37:07 -05:00
|
|
|
: make-image ( arch -- )
|
2008-02-10 02:49:27 -05:00
|
|
|
[
|
|
|
|
architecture set
|
2007-09-20 18:09:08 -04:00
|
|
|
"resource:/core/bootstrap/stage1.factor" run-file
|
2008-02-10 02:49:27 -05:00
|
|
|
build-image
|
2008-02-07 18:55:31 -05:00
|
|
|
write-image
|
2008-02-10 02:49:27 -05:00
|
|
|
] with-scope ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: make-images ( -- )
|
2008-02-07 18:55:31 -05:00
|
|
|
images [ make-image ] each ;
|