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
parent
d6a9122967
commit
339b1b6466
|
@ -31,6 +31,26 @@ IN: bootstrap.image.tests
|
|||
H{ } [ special-objects set emit-jit-data ] keep assoc-size
|
||||
] unit-test
|
||||
|
||||
{ 90 } [
|
||||
{ 95 } [
|
||||
50 <vector> [ bootstrapping-image set emit-image-header ] keep length
|
||||
] 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
|
||||
|
|
|
@ -433,6 +433,12 @@ M: quotation prepare-object
|
|||
: emit-words ( -- )
|
||||
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 ( -- )
|
||||
{
|
||||
dictionary source-files builtins
|
||||
|
@ -497,6 +503,8 @@ M: quotation prepare-object
|
|||
emit-jit-data
|
||||
"Serializing global namespace..." print flush
|
||||
emit-global
|
||||
"Serializing singletons..." print flush
|
||||
emit-singletons
|
||||
"Serializing special object table..." print flush
|
||||
emit-special-objects
|
||||
"Performing word fixups..." print flush
|
||||
|
|
|
@ -309,8 +309,7 @@ ERROR: assert got expect ;
|
|||
|
||||
! Special object count and identifiers must be kept in sync with:
|
||||
! vm/objects.hpp
|
||||
! basis/bootstrap/image/image.factor
|
||||
CONSTANT: special-object-count 80
|
||||
CONSTANT: special-object-count 85
|
||||
|
||||
CONSTANT: OBJ-WALKER-HOOK 3
|
||||
|
||||
|
@ -409,6 +408,12 @@ CONSTANT: OBJ-VM-COMPILE-TIME 75
|
|||
CONSTANT: OBJ-VM-VERSION 76
|
||||
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:
|
||||
! vm/contexts.hpp
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ namespace factor {
|
|||
// core/kernel/kernel.factor
|
||||
// basis/bootstrap/image/image.factor
|
||||
|
||||
static const cell special_object_count = 80;
|
||||
static const cell special_object_count = 85;
|
||||
|
||||
enum special_object {
|
||||
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_VERSION = 76, /* factor version */
|
||||
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
|
||||
|
@ -118,7 +127,9 @@ enum special_object {
|
|||
#define OBJ_LAST_SAVE OBJ_STAGE2
|
||||
|
||||
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) {
|
||||
|
|
Loading…
Reference in New Issue