VM: put the singletons t, -1, 0 and 1 in the special objects table

Having them there instead of as fields in the vm struct removes a bunch
of special handling. This commit just adds them and doesn't remove the
old ones to avoid potential chicken-and-egg bootstrap problems.
db4
Björn Lindqvist 2015-12-09 21:31:13 +01:00
parent d6a9122967
commit 339b1b6466
4 changed files with 49 additions and 5 deletions

View File

@ -31,6 +31,26 @@ IN: bootstrap.image.tests
H{ } [ special-objects set emit-jit-data ] keep assoc-size H{ } [ special-objects set emit-jit-data ] keep assoc-size
] unit-test ] unit-test
{ 90 } [ { 95 } [
50 <vector> [ bootstrapping-image set emit-image-header ] keep length 50 <vector> [ bootstrapping-image set emit-image-header ] keep length
] unit-test ] unit-test
! emit-bignum
{ V{
! 33 bignum
32 0 33
! -108 bignum
32 1 108
} } [
V{ } bootstrapping-image set
33 emit-bignum
-108 emit-bignum
bootstrapping-image get
] unit-test
! prepare-object - what does this mean?
{ 269 } [
V{ } clone bootstrapping-image set
H{ } clone objects set
55 >bignum prepare-object
] unit-test

View File

@ -433,6 +433,12 @@ M: quotation prepare-object
: emit-words ( -- ) : emit-words ( -- )
all-words [ emit-word ] each ; all-words [ emit-word ] each ;
: emit-singletons ( -- )
t OBJ-CANONICAL-TRUE special-objects get set-at
0 >bignum OBJ-BIGNUM-ZERO special-objects get set-at
1 >bignum OBJ-BIGNUM-POS-ONE special-objects get set-at
-1 >bignum OBJ-BIGNUM-NEG-ONE special-objects get set-at ;
: emit-global ( -- ) : emit-global ( -- )
{ {
dictionary source-files builtins dictionary source-files builtins
@ -497,6 +503,8 @@ M: quotation prepare-object
emit-jit-data emit-jit-data
"Serializing global namespace..." print flush "Serializing global namespace..." print flush
emit-global emit-global
"Serializing singletons..." print flush
emit-singletons
"Serializing special object table..." print flush "Serializing special object table..." print flush
emit-special-objects emit-special-objects
"Performing word fixups..." print flush "Performing word fixups..." print flush

View File

@ -309,8 +309,7 @@ ERROR: assert got expect ;
! Special object count and identifiers must be kept in sync with: ! Special object count and identifiers must be kept in sync with:
! vm/objects.hpp ! vm/objects.hpp
! basis/bootstrap/image/image.factor CONSTANT: special-object-count 85
CONSTANT: special-object-count 80
CONSTANT: OBJ-WALKER-HOOK 3 CONSTANT: OBJ-WALKER-HOOK 3
@ -409,6 +408,12 @@ CONSTANT: OBJ-VM-COMPILE-TIME 75
CONSTANT: OBJ-VM-VERSION 76 CONSTANT: OBJ-VM-VERSION 76
CONSTANT: OBJ-VM-GIT-LABEL 77 CONSTANT: OBJ-VM-GIT-LABEL 77
CONSTANT: OBJ-CANONICAL-TRUE 78
CONSTANT: OBJ-BIGNUM-ZERO 79
CONSTANT: OBJ-BIGNUM-POS-ONE 80
CONSTANT: OBJ-BIGNUM-NEG-ONE 81
! Context object count and identifiers must be kept in sync with: ! Context object count and identifiers must be kept in sync with:
! vm/contexts.hpp ! vm/contexts.hpp

View File

@ -4,7 +4,7 @@ namespace factor {
// core/kernel/kernel.factor // core/kernel/kernel.factor
// basis/bootstrap/image/image.factor // basis/bootstrap/image/image.factor
static const cell special_object_count = 80; static const cell special_object_count = 85;
enum special_object { enum special_object {
OBJ_WALKER_HOOK = 3, /* non-local exit hook, used by library only */ OBJ_WALKER_HOOK = 3, /* non-local exit hook, used by library only */
@ -110,6 +110,15 @@ enum special_object {
OBJ_VM_COMPILE_TIME = 75, /* when the binary was built */ OBJ_VM_COMPILE_TIME = 75, /* when the binary was built */
OBJ_VM_VERSION = 76, /* factor version */ OBJ_VM_VERSION = 76, /* factor version */
OBJ_VM_GIT_LABEL = 77, /* git label (git describe --all --long) */ OBJ_VM_GIT_LABEL = 77, /* git label (git describe --all --long) */
/* Canonical truth value. In Factor, 't' */
OBJ_CANONICAL_TRUE = 78,
/* Canonical bignums. These needs to be kept in the image in case
some heap objects refer to them. */
OBJ_BIGNUM_ZERO,
OBJ_BIGNUM_POS_ONE,
OBJ_BIGNUM_NEG_ONE = 81,
}; };
/* save-image-and-exit discards special objects that are filled in on startup /* save-image-and-exit discards special objects that are filled in on startup
@ -118,7 +127,9 @@ enum special_object {
#define OBJ_LAST_SAVE OBJ_STAGE2 #define OBJ_LAST_SAVE OBJ_STAGE2
inline static bool save_special_p(cell i) { inline static bool save_special_p(cell i) {
return (i >= OBJ_FIRST_SAVE && i <= OBJ_LAST_SAVE); /* Need to fix the order here. */
return (i >= OBJ_FIRST_SAVE && i <= OBJ_LAST_SAVE) ||
(i >= OBJ_CANONICAL_TRUE);
} }
template <typename Iterator> void object::each_slot(Iterator& iter) { template <typename Iterator> void object::each_slot(Iterator& iter) {