Skip to content

Commit

Permalink
VM: put the singletons t, -1, 0 and 1 in the special objects table
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
bjourne committed Dec 9, 2015
1 parent d6a9122 commit 339b1b6
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 5 deletions.
22 changes: 21 additions & 1 deletion basis/bootstrap/image/image-tests.factor
Expand Up @@ -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
8 changes: 8 additions & 0 deletions basis/bootstrap/image/image.factor
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
9 changes: 7 additions & 2 deletions core/kernel/kernel.factor
Expand Up @@ -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

Expand Down Expand Up @@ -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

Expand Down
15 changes: 13 additions & 2 deletions vm/objects.hpp
Expand Up @@ -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 */
Expand Down Expand Up @@ -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
Expand All @@ -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) {
Expand Down

0 comments on commit 339b1b6

Please sign in to comment.