Fix stage1 bootstrap bug, overly-eager object merging
parent
e486683d96
commit
1083f36e6e
|
@ -8,7 +8,7 @@ splitting growable classes classes.builtin classes.tuple
|
||||||
classes.tuple.private words.private io.binary io.files vocabs
|
classes.tuple.private words.private io.binary io.files vocabs
|
||||||
vocabs.loader source-files definitions debugger float-arrays
|
vocabs.loader source-files definitions debugger float-arrays
|
||||||
quotations.private sequences.private combinators
|
quotations.private sequences.private combinators
|
||||||
io.encodings.binary math.order ;
|
io.encodings.binary math.order accessors ;
|
||||||
IN: bootstrap.image
|
IN: bootstrap.image
|
||||||
|
|
||||||
: my-arch ( -- arch )
|
: my-arch ( -- arch )
|
||||||
|
@ -31,6 +31,39 @@ IN: bootstrap.image
|
||||||
|
|
||||||
<PRIVATE
|
<PRIVATE
|
||||||
|
|
||||||
|
! Object cache; we only consider numbers equal if they have the
|
||||||
|
! same type
|
||||||
|
TUPLE: id obj ;
|
||||||
|
|
||||||
|
C: <id> id
|
||||||
|
|
||||||
|
M: id hashcode* obj>> hashcode* ;
|
||||||
|
|
||||||
|
M: id equal?
|
||||||
|
over id? [
|
||||||
|
[ obj>> ] bi@
|
||||||
|
[ = ] [
|
||||||
|
dup number? [
|
||||||
|
[ class ] bi@ =
|
||||||
|
] [
|
||||||
|
2drop t
|
||||||
|
] if
|
||||||
|
] 2bi and
|
||||||
|
] [
|
||||||
|
2drop f
|
||||||
|
] if ;
|
||||||
|
|
||||||
|
SYMBOL: objects
|
||||||
|
|
||||||
|
: (objects) <id> objects get ; inline
|
||||||
|
|
||||||
|
: lookup-object ( obj -- n/f ) (objects) at ;
|
||||||
|
|
||||||
|
: put-object ( n obj -- ) (objects) set-at ;
|
||||||
|
|
||||||
|
: cache-object ( obj quot -- value )
|
||||||
|
>r (objects) r> [ obj>> ] prepose cache ; inline
|
||||||
|
|
||||||
! Constants
|
! Constants
|
||||||
|
|
||||||
: image-magic HEX: 0f0e0d0c ; inline
|
: image-magic HEX: 0f0e0d0c ; inline
|
||||||
|
@ -61,9 +94,6 @@ IN: bootstrap.image
|
||||||
! The image being constructed; a vector of word-size integers
|
! The image being constructed; a vector of word-size integers
|
||||||
SYMBOL: image
|
SYMBOL: image
|
||||||
|
|
||||||
! Object cache
|
|
||||||
SYMBOL: objects
|
|
||||||
|
|
||||||
! Image output format
|
! Image output format
|
||||||
SYMBOL: big-endian
|
SYMBOL: big-endian
|
||||||
|
|
||||||
|
@ -187,7 +217,9 @@ GENERIC: ' ( obj -- ptr )
|
||||||
2tri ;
|
2tri ;
|
||||||
|
|
||||||
M: bignum '
|
M: bignum '
|
||||||
bignum tag-number dup [ emit-bignum ] emit-object ;
|
[
|
||||||
|
bignum tag-number dup [ emit-bignum ] emit-object
|
||||||
|
] cache-object ;
|
||||||
|
|
||||||
! Fixnums
|
! Fixnums
|
||||||
|
|
||||||
|
@ -202,9 +234,11 @@ M: fixnum '
|
||||||
! Floats
|
! Floats
|
||||||
|
|
||||||
M: float '
|
M: float '
|
||||||
float tag-number dup [
|
[
|
||||||
align-here double>bits emit-64
|
float tag-number dup [
|
||||||
] emit-object ;
|
align-here double>bits emit-64
|
||||||
|
] emit-object
|
||||||
|
] cache-object ;
|
||||||
|
|
||||||
! Special objects
|
! Special objects
|
||||||
|
|
||||||
|
@ -243,7 +277,7 @@ M: f '
|
||||||
] bi
|
] bi
|
||||||
\ word type-number object tag-number
|
\ word type-number object tag-number
|
||||||
[ emit-seq ] emit-object
|
[ emit-seq ] emit-object
|
||||||
] keep objects get set-at ;
|
] keep put-object ;
|
||||||
|
|
||||||
: word-error ( word msg -- * )
|
: word-error ( word msg -- * )
|
||||||
[ % dup word-vocabulary % " " % word-name % ] "" make throw ;
|
[ % dup word-vocabulary % " " % word-name % ] "" make throw ;
|
||||||
|
@ -252,7 +286,7 @@ M: f '
|
||||||
[ target-word ] keep or ;
|
[ target-word ] keep or ;
|
||||||
|
|
||||||
: fixup-word ( word -- offset )
|
: fixup-word ( word -- offset )
|
||||||
transfer-word dup objects get at
|
transfer-word dup lookup-object
|
||||||
[ ] [ "Not in image: " word-error ] ?if ;
|
[ ] [ "Not in image: " word-error ] ?if ;
|
||||||
|
|
||||||
: fixup-words ( -- )
|
: fixup-words ( -- )
|
||||||
|
@ -286,7 +320,7 @@ M: wrapper '
|
||||||
M: string '
|
M: string '
|
||||||
#! We pool strings so that each string is only written once
|
#! We pool strings so that each string is only written once
|
||||||
#! to the image
|
#! to the image
|
||||||
objects get [ emit-string ] cache ;
|
[ emit-string ] cache-object ;
|
||||||
|
|
||||||
: assert-empty ( seq -- )
|
: assert-empty ( seq -- )
|
||||||
length 0 assert= ;
|
length 0 assert= ;
|
||||||
|
@ -311,12 +345,12 @@ M: float-array ' float-array emit-dummy-array ;
|
||||||
|
|
||||||
: emit-tuple ( tuple -- pointer )
|
: emit-tuple ( tuple -- pointer )
|
||||||
dup class word-name "tombstone" =
|
dup class word-name "tombstone" =
|
||||||
[ objects get [ (emit-tuple) ] cache ] [ (emit-tuple) ] if ;
|
[ [ (emit-tuple) ] cache-object ] [ (emit-tuple) ] if ;
|
||||||
|
|
||||||
M: tuple ' emit-tuple ;
|
M: tuple ' emit-tuple ;
|
||||||
|
|
||||||
M: tuple-layout '
|
M: tuple-layout '
|
||||||
objects get [
|
[
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
[ layout-hashcode , ]
|
[ layout-hashcode , ]
|
||||||
|
@ -328,12 +362,12 @@ M: tuple-layout '
|
||||||
] { } make [ ' ] map
|
] { } make [ ' ] map
|
||||||
\ tuple-layout type-number
|
\ tuple-layout type-number
|
||||||
object tag-number [ emit-seq ] emit-object
|
object tag-number [ emit-seq ] emit-object
|
||||||
] cache ;
|
] cache-object ;
|
||||||
|
|
||||||
M: tombstone '
|
M: tombstone '
|
||||||
delegate
|
delegate
|
||||||
"((tombstone))" "((empty))" ? "hashtables.private" lookup
|
"((tombstone))" "((empty))" ? "hashtables.private" lookup
|
||||||
word-def first objects get [ emit-tuple ] cache ;
|
word-def first [ emit-tuple ] cache-object ;
|
||||||
|
|
||||||
! Arrays
|
! Arrays
|
||||||
M: array '
|
M: array '
|
||||||
|
@ -343,7 +377,7 @@ M: array '
|
||||||
! Quotations
|
! Quotations
|
||||||
|
|
||||||
M: quotation '
|
M: quotation '
|
||||||
objects get [
|
[
|
||||||
quotation-array '
|
quotation-array '
|
||||||
quotation type-number object tag-number [
|
quotation type-number object tag-number [
|
||||||
emit ! array
|
emit ! array
|
||||||
|
@ -351,7 +385,7 @@ M: quotation '
|
||||||
0 emit ! xt
|
0 emit ! xt
|
||||||
0 emit ! code
|
0 emit ! code
|
||||||
] emit-object
|
] emit-object
|
||||||
] cache ;
|
] cache-object ;
|
||||||
|
|
||||||
! End of the image
|
! End of the image
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue